C++ 将对象分配给C++;排列
我正在用C++检查以下代码:C++ 将对象分配给C++;排列,c++,c++11,initialization,variable-assignment,aggregate-initialization,C++,C++11,Initialization,Variable Assignment,Aggregate Initialization,我正在用C++检查以下代码: #include <iostream> using namespace std; class Person{ public: int age; Person(int age){ this->age = age; } }; int main() { Person a = Person(2); Person temp[] = {a}; temp[0].age = 5;
#include <iostream>
using namespace std;
class Person{
public:
int age;
Person(int age){
this->age = age;
}
};
int main()
{
Person a = Person(2);
Person temp[] = {a};
temp[0].age = 5;
cout << temp[0].age;
return 0;
}
#包括
使用名称空间std;
班主任{
公众:
智力年龄;
个人(年龄){
这个->年龄=年龄;
}
};
int main()
{
a人=2人;
个人临时工[]={a};
温度[0]。年龄=5;
coutPerson temp[]={a};
不是赋值,而是初始化():
每个直接公共基(自C++17起)
数组元素或非静态类成员,按照类定义中数组下标/外观的顺序,从初始值设定项列表的相应子句进行复制初始化
因此temp
被初始化为包含1个元素,该元素通过Person
的复制构造函数从a
进行复制初始化
及
当我们改变数组中的元素时,它不会影响原始对象。对吗
对
顺便说一句:temp[0]=a;
是赋值;temp[0]
是通过Person
的复制赋值操作符从a
进行复制赋值。我明白了。如果我这样做了temp[0]=a
,那么年龄实际上会改变。我想这里令人困惑的是:一个Person数组包含连续的内存块,每个块都包含一个Person对象。最初,a
和temp[0]
在内存中的不同地址。现在如果我这样做temp[0]=a
什么是temp[0]
现在保留?我觉得它无法保留实际元素a
,因为它已经在另一个地址中。@penny Giventemp[0]=a;
,a
被复制分配给temp[0]
。请注意,它们是两个独立的对象。可以说当前代码是正确的,只需在复制构造函数和复制赋值运算符中打印日志即可进行检查。但您必须始终注意类成员是进行深度复制还是进行浅层复制。注意:我在这里没有看到问题。有问题的代码打印为5预期。