我有一个对象数组:
Square sq[81];
我认为它使用默认构造函数来创建每个。
当我通过for循环来初始化每个时,它会为数组中的每个Square
对象调用析构函数。
for (int k=0; k<9; k++) {
for(int j=0; j<9; j++) {
sq[count++] = Square(k, j);
}
}
调用Square(k, j)
时,是否删除sq[]
中的对象并创建新对象?
答案 0 :(得分:7)
sq[count++] = Square(k, j);
当调用Square(k,j)时,它是否删除sq []中的对象并创建一个新对象?
没有。
Square(k, j)
创建一个新的临时对象,=
将其复制到旧对象中。然后销毁临时对象,因为它不再需要并超出范围。
答案 1 :(得分:3)
sq[]
的元素不会被破坏。而是调用每个元素的赋值运算符为其赋值新值Square(k, j)
,并在赋值结束时销毁临时对象。
如果你想避免冗余的默认构造和赋值,你可以/应该使用向量:
std::vector<Square> sq;
sq.reserve(81);
for (...) for (...) sq.push_back(Square(k,j));
如果您还想避免冗余临时,请使用C ++ 11并说出
for (...) for (...) sq.emplace_back(k, j);
答案 2 :(得分:0)
我们采取以下示例程序:http://codepad.org/S1iH4cWD
您可以看到几个重要步骤:
main
之前,Square sq[81]
中的每个对象都是默认构建的。sq
中的一个对象 - 它会覆盖那里的内容 - 然后临时被破坏。main
之后,Square sq[81]
中的每个对象都被破坏,与构造的顺序相反。所以你几乎没有,除了只有main
结束后才能删除sq中的对象。它是被破坏的临时(=
右侧的对象)。
您可能会发现此计划有用:http://codepad.org/JPE8uYVO 它跟踪初始化与分配的不同值。