为数组中的每个对象调用析构函数
Destructor called for each object in an array
我有一个对象数组:
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[]
中的对象并创建了一个新的对象?
sq[count++] = Square(k, j);
当调用Square(k, j)时,它是否删除了sq[]中的对象并创建了一个新对象?
。
Square(k, j)
创建一个新的临时对象,=
将其复制到旧对象中。当不再需要临时对象时,它将被销毁,并且超出作用域。
顺便说一句,你实际上并没有在循环中初始化任何东西(我的意思是,除了临时的东西);你只是在事后分配。
sq[]
的元素没有被破坏。相反,您可以调用每个元素的赋值操作符,为其赋值新值Square(k, j)
,并且在赋值结束时销毁临时对象。
如果你想避免冗余的默认构造和赋值,你可以/应该使用vector:
std::vector<Square> sq;
sq.reserve(81);
for (...) for (...) sq.push_back(Square(k,j));
如果您想进一步避免冗余的临时,请使用c++ 11并写入
for (...) for (...) sq.emplace_back(k, j);
让我们以以下示例程序为例:http://codepad.org/S1iH4cWD
您可以看到几个重要的步骤:
-
main
之前,Square sq[81]
中的每个对象都是默认构造的。 - 在你的循环中,一个临时对象被构造,它的内容被赋值给
sq
中的一个对象——它覆盖了那里的内容——然后这个临时对象被销毁。 - 最后,在
main
之后,Square sq[81]
中的每个对象都按照构造的相反顺序被销毁。
所以你几乎是对的,除了sq中的对象只会在main
结束后被删除。被销毁的是临时对象(=
右边的对象)。
你可能会发现这个程序很有用:http://codepad.org/JPE8uYVO它跟踪初始化和赋值的不同值。
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 检查哪个对象调用了另一个对象的对象方法
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 从 Base 引用对象调用派生类的成员
- 为什么为未删除的对象调用析构函数?
- Qt c++不会为所有对象调用move_slot.为什么?
- 使用在堆栈上创建的对象调用虚拟函数
- 使用基类对象调用Dervied Class函数
- C++:允许临时对象调用非常量成员函数的设计理念是什么?
- 从类中的对象调用类中的函数的最佳方法
- 派生对象调用的 Base 方法的模板推导
- 如何使用单个对象调用具有相同名称的两个类函数
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 如果类没有任何成员变量,则通过临时对象调用类的成员函数的开销是多少?
- 如何对动态数组中的某些对象调用析构函数
- 如何从列表中存储的对象调用成员函数
- 从线程内的对象调用静态方法
- 从成员对象调用方法
- 当包含它的对象调用其析构函数时,unique_ptr是否未分配
- 从对象调用成员对象,错误:引用非常量值的初始值必须是左值