假设我有一个类型为_ObjT的全局对象obj,并且_ObjT已定义了operator =我正在尝试用完整的新对象替换obj
obj=_ObjT([ constructor arguments])
这里=操作符在obj上被调用,而= operator通过获取新对象来完成它的工作(=操作符什么也做不了,所以我们的对象无法替换,甚至=操作符可能有一些错误...)
我想以obj析构函数被调用并销毁的方式替换并复制新对象来代替全局对象
我尝试手动调用obj.~_ObjT(); obj=_ObjT()
,但获得例外,因为再次调用了= operator,这一次删除了原始对象,并尝试将其复制到未分配的内存中
我知道我可以将指针定义为全局值,并调用delete和new。但是只是想知道是否有任何方法可以替换对象(替换本地对象也有同样的问题,但是在本地,我们可以使用新名称而忽略原始值,因此我们不需要替换),我知道应该以= operator和copy构造函数完全替换对象的方式编写好的对象/类]
我问这个问题是因为您使用的是封闭源代码库,或者无论如何您都无法确定操作员是否正常运行
c ++标准还规定= operator必须用新对象完全替换对象吗?
为什么不使用移动?
#include <iostream>
#include <string>
class A
{
public:
A() : s("init") { }
A(const A& a) : s(a.s) { }
A(A&& a) : s(std::move(a.s)) { }
A& operator=(const A& a) {
s = a.s;
return *this;
}
A& operator=(A&& a) {
s = std::move(a.s);
return *this;
}
void setValue(std::string value) {
s=value;
}
std::string getValue() {
return s;
}
private:
std::string s;
};
A global;
int main()
{
{
A local;
local.setValue("moved");
global=std::move(local);
}
std::cout << global.getValue() << std::endl;
}