本人在学习拷贝构造函数和移动构造函数时有个疑问,用以下代码创建5个实例,为什么会调用6次析构函数?
#include
class Int
{
private:
int b = 10;
int* a = &b;
public:
Int() = default;
Int(int a)
{
std::cout << "构造" << std::endl;
this->a = &a;
}
Int(const Int& arg){
std::cout << "拷贝构造" << std::endl;
this->a = arg.a;
}
Int(Int&& arg) noexcept
{
std::cout << "移动构造" << std::endl;
this->a = arg.a;
arg.a = nullptr;
}
Int operator=(Int& arg)
{
std::cout << "拷贝赋值" << std::endl;
if(this != &arg)
this->a = arg.a;
return *this;
}
Int& operator=(Int&& arg) noexcept
{
std::cout << "移动赋值" << std::endl;
if(this != &arg)
this->a = arg.a;
arg.a = nullptr;
return *this;
}
~Int(){std::cout << "删除" << std::endl;}
};
int main()
{
Int a1 = 10;
Int a2 = a1;
Int a3 = std::move(a1);
Int a4;
a4 = std::move(a2);
Int a5;
a5 = a3;
}
输出结果如下:
构造
拷贝构造
移动构造
移动赋值
拷贝赋值
拷贝构造
删除
删除
删除
删除
删除
删除
有人可以解答一下吗
return *this; 会产生一个隐式变量
删除a5 = a3;试试,是否两次删除
问题已解决,只要把28行的拷贝赋值运算符改为Int& operator=(Int& arg)即可,这样不会多生成一个临时的this指向的实例