为什么给对象赋值的时候会调用构造函数和析构函数
Why is the constructor and the destructor called when assigning a value to an object
我有以下代码:
#include <iostream>
using namespace std;
class A{
int x;
public:
A(int x =1) : x(x) {cout << "A() ";}
A(const A& a) {x =a.x; cout << "A(const A&) ";}
A& operator=(const A& a){cout << "op= "; x=a.x; return *this;}
~A(){cout << "~A()";}
int getX() {return x;}
void setX(int x){this->x = x;}
};
A g(A a){
//a = 2;
cout << "g() ";
a.setX(3);
return a;
}
int main()
{
A a;
a = 2;
}
我希望得到以下输出:A() op= ~A()
,但输出却是A() A() op= ~A() ~A()
。当我将值 2
分配给对象 a
时,似乎调用了构造函数和析构函数。为什么叫这两个?编译器是否有效地创建了一个具有 x = 2
的新 A
对象,然后使用赋值运算符将值赋给 a
?
这是因为您没有为您的 class 声明一个将 int 作为参数的赋值运算符。因为不存在这样的运算符,编译器需要使用变通方法:它使用构造函数 A(int) 创建一个临时对象。您可以通过使构造函数显式化来避免此行为:
explicit A(int x_ = 1) : x(x_) { }
构建临时文件后,使用为 A 提供的复制构造函数将其复制到“a”。紧接着,临时文件被销毁并调用其析构函数。
这种方法效率低下。为了使它更好,您应该为 A 定义一个赋值运算符,将 int 作为参数:
A& operator= (int x_) {
x = x_;
return *this;
}
我有以下代码:
#include <iostream>
using namespace std;
class A{
int x;
public:
A(int x =1) : x(x) {cout << "A() ";}
A(const A& a) {x =a.x; cout << "A(const A&) ";}
A& operator=(const A& a){cout << "op= "; x=a.x; return *this;}
~A(){cout << "~A()";}
int getX() {return x;}
void setX(int x){this->x = x;}
};
A g(A a){
//a = 2;
cout << "g() ";
a.setX(3);
return a;
}
int main()
{
A a;
a = 2;
}
我希望得到以下输出:A() op= ~A()
,但输出却是A() A() op= ~A() ~A()
。当我将值 2
分配给对象 a
时,似乎调用了构造函数和析构函数。为什么叫这两个?编译器是否有效地创建了一个具有 x = 2
的新 A
对象,然后使用赋值运算符将值赋给 a
?
这是因为您没有为您的 class 声明一个将 int 作为参数的赋值运算符。因为不存在这样的运算符,编译器需要使用变通方法:它使用构造函数 A(int) 创建一个临时对象。您可以通过使构造函数显式化来避免此行为:
explicit A(int x_ = 1) : x(x_) { }
构建临时文件后,使用为 A 提供的复制构造函数将其复制到“a”。紧接着,临时文件被销毁并调用其析构函数。
这种方法效率低下。为了使它更好,您应该为 A 定义一个赋值运算符,将 int 作为参数:
A& operator= (int x_) {
x = x_;
return *this;
}