C++ 通过显式构造函数和析构函数调用重新初始化该对象在技术上正确吗?
我将一个局部变量放入两个对象生命周期:C++ 通过显式构造函数和析构函数调用重新初始化该对象在技术上正确吗?,c++,constructor,destructor,C++,Constructor,Destructor,我将一个局部变量放入两个对象生命周期: class Thing { int i; public: Thing() : i(44) {} ~Thing() { i = 0; } void set(int i) { this->i = i; } void report() const { std::cout << i << std::endl; } }; 我初步预计这将打印以下内容: 44 72 44 97 0 确实如此 但
class Thing
{
int i;
public:
Thing() : i(44) {}
~Thing() { i = 0; }
void set(int i) { this->i = i; }
void report() const { std::cout << i << std::endl; }
};
我初步预计这将打印以下内容:
44
72
44
97
0
确实如此
但这段代码能保证像那样工作吗?或者它调用了未定义的行为或类似的行为?(我对上次的report()
call特别怀疑;我只是出于好奇才把那个电话扔了进去。)
如果该对象是成员,又该怎么办:
struct Owner
{
Thing thing;
void go()
{
thing.report();
thing.~Thing();
new (&thing) Thing();
thing.report();
}
};
这似乎也适用于我。应该吗
(是的,我知道这种技术在很多方面都是危险的。我不是想问或说任何人是否应该使用它。我只是想知道它是否真的被标准所允许,而不仅仅是被我当前的编译器设置所允许。)这曾经是编写赋值运算符的推荐方法,因为
thing
首先是自动构造的,所以在其作用域结束时会自动调用析构函数,所以应该跳过最后一次显式析构函数调用(thing.~thing();
)<代码>新事物(&事物)事物()在对象的原始堆栈分配内存上使用了一种称为“placement new”的方法。这充当显式构造函数调用,允许您指定对象内存的位置<代码>所有者().go()代码>调用临时对象上的成员函数。
struct Owner
{
Thing thing;
void go()
{
thing.report();
thing.~Thing();
new (&thing) Thing();
thing.report();
}
};
Owner owner;
owner.go();
Owner().go();