只看代码
class SomeClass {
private:
int i;
public:
int getI() {
return i;
}
SomeClass() {
i = 0;
}
explicit SomeClass(int i) {
this->i = i;
}
~SomeClass(){
cout << "SomeClass destructed with i=" << i << "." << endl;
}
};
主要功能
int main() {
auto* someClasses = new SomeClass[5];
someClasses[2] = SomeClass(20);
cout << "A new SomeClass Assigned." << endl;
someClasses[2] = SomeClass(40);
cout << "A new SomeClass Assigned." << endl;
delete[] someClasses;
}
使用所有由i = 0构造的对象初始化该数组,然后对someClasses [2]进行一些修改。
结束对象时,应调用对象的析构函数。但是,结果表明没有调用析构函数。
SomeClass destructed with i=20. // destructed after copy constructor is done.
A new SomeClass Assigned.
SomeClass destructed with i=40. // destructed after copy constructor is done.
A new SomeClass Assigned.
SomeClass destructed with i=0. // okay.
SomeClass destructed with i=0. // okay.
SomeClass destructed with i=40. // okay.
SomeClass destructed with i=0. // okay.
SomeClass destructed with i=0. // okay.
Process finished with exit code 0
如果在这种情况下不设计析构函数,那么如何将新对象正确分配给现有数组?
使用对象指针数组是一种选择,但我很好奇。
答案 0 :(得分:3)
当对象的生存期结束(超出范围,在new返回的指针上调用delete)时,将调用析构函数。当你做
someClasses[2] = SomeClass(40);
someClasses[2]
的生存期没有结束,您只需为其赋予新的值即可。直到
delete[] someClasses;
在删除数组时,如果要终止数组中所有对象的生存期,则将调用析构函数。
答案 1 :(得分:2)
它没有被替换,而是被分配给了。数组中的对象愉快地继续其生存期,直到整个数组被破坏为止。
答案 2 :(得分:2)
分配不是在调用构造函数或析构函数,而是在调用分配运算符<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
。由于您没有为operator=
提供一个,因此编译器会为您生成一个。此默认SomeClass
复制成员变量。对于像您这样的简单类,此默认值正是您所需要的,这就是为什么您在数组中看到期望的结果的原因。