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;

我正在用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;
    cout << temp[0].age;
    return 0;
}

#包括
使用名称空间std;
班主任{
公众:
智力年龄;
个人(年龄){
这个->年龄=年龄;
}
};
int main()
{
a人=2人;
个人临时工[]={a};
温度[0]。年龄=5;

cout
Person 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 Given
temp[0]=a;
a
被复制分配给
temp[0]
。请注意,它们是两个独立的对象。可以说当前代码是正确的,只需在复制构造函数和复制赋值运算符中打印日志即可进行检查。但您必须始终注意类成员是进行深度复制还是进行浅层复制。注意:我在这里没有看到问题。有问题的代码打印为5预期。