eug*_*ene 5 c++ destructor variable-assignment
myClassVar = MyClass(3);
Run Code Online (Sandbox Code Playgroud)
我期望在之前创建myClassVar的左侧调用析构函数.
但它实际上是在创建的新对象上调用的MyClass(3).
我的完整测试代码和输出如下..
我该如何解决这个问题?
实现赋值运算符?
MyClass实际上有指针和MYSQL_STMT*,我想知道我应该如何处理MYSQL_STMT*变量.
我只需要MyClassVar(3)对象而不是MyClassVar(),它是在创建ClientClass对象时首次创建的.
我经常遇到这种情况,并想知道是否有一个很好的方法来做到这一点.
#include <stdio.h>
class MyClass
{
public:
MyClass() { printf("MyClass %p\n", this); }
MyClass(int a) { printf("Myclass(int) %p\n", this); }
~MyClass() { printf("~MyClass %p\n", this); }
private:
int mA;
};
class ClientClass
{
public:
void Foo()
{
printf("before &myClassVar : %p\n", &myClassVar);
myClassVar = MyClass(3); // this is the important line
printf("after &myClassVar : %p\n", &myClassVar);
}
private:
MyClass myClassVar;
};
int main()
{
ClientClass c;
c.Foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
MyClass 0x7fff5fbfeba0
before &myClassVar : 0x7fff5fbfeba0
Myclass(int) 0x7fff5fbfeb70
~MyClass 0x7fff5fbfeb70 // <--- here destructor is called on the newly created object
after &myClassVar : 0x7fff5fbfeba0
~MyClass 0x7fff5fbfeba0
Run Code Online (Sandbox Code Playgroud)
以下是关键线的分解方式:
myClassVar = MyClass(3);
Run Code Online (Sandbox Code Playgroud)
首先,MyClass(3)调用构造函数并返回该对象.
其次,myClassVar =将对象复制到myClassVar.
然后声明结束.对象(它是立即的)已经死了,因此调用了析构函数.
编辑:
至于如何解决这个问题.我能想到的唯一方法是使用新的展示位置.我不确定除了制作"set"方法之外是否还有更好的解决方案.
| 归档时间: |
|
| 查看次数: |
1269 次 |
| 最近记录: |