背景
请考虑以下代码段:
MyClass * p1 = new MyClass;
p1->data = 1;
MyClass c2 = MyClass();
p2.data = 2;
new(p1) MyClass {c2};
cout << p1.data;
其中MyClass
仅包含单个公共成员int data
。
前4行很简单:我们创建了两个MyClass对象,一个使用new
,另一个不使用。下一行发生的事情是将c2
的内容复制到p1
中,这意味着最后一行的输出为2
。
我的问题是关于new(p1) MyClass {c2};
行上到底发生了什么。我的理解是,有两个操作:new
和列表初始化程序。对于基于this的new
,如果您以指针作为参数调用new
,则它不会分配任何新的内存,而只是在给定的位置构造一个对象指针,该指针是new
运算符的返回值。这意味着new(p1) MyClass
解析为一个指向与p1
相同地址的指针。然后,使用列表初始化{c2}
将p1
的内容设置为c2
,这就是为什么末尾的输出为2
而不是1
的原因
问题:
这是对正在发生的事情的正确理解吗?
如果是这样,我有一个困惑点,就是new
运算符new(p1) MyClass
应该解析为一个指针,但是看起来我们正在分配c2
而不是指针,而是整个MyClass
对象。这是怎么回事?
最后,我想知道使用此语法背后的动机是什么。我是C语言的新手,在C语言中,您只需要编写类似*p1 = c2;
的内容即可完成与new(p1) MyClass {c2};