为什么在为对象赋值时调用构造函数和析构函数

Why is the constructor and the destructor called when assigning a value to an object

提问人:bob_the_builder 提问时间:7/6/2019 最后编辑:Frakbob_the_builder 更新时间:7/6/2019 访问量:73

问:

我有以下代码:

#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()2aAx = 2a

C++ 造函数 析构函数 赋值运算符

评论

1赞 melpomene 7/6/2019
是的。(您没有采用 .int
2赞 Sam Varshavchik 7/6/2019
由于该类没有赋值运算符,因此将创建该类的临时实例,然后复制分配给现有对象,然后销毁。
0赞 bob_the_builder 7/6/2019
是的,添加了另一个 int 赋值运算符 A& operator=(const int n){cout << “op= ”;x=n;返回 *this;}现在它确实像我最初预期的那样写了 A() op= ~A()。谢谢!
1赞 Mark Storer 7/6/2019
顺便说一句:你的编码风格无处不在。您将功能体的卷曲牙套放在三个不同的地方。和。选择一个。请?){) {)\n{
0赞 bob_the_builder 7/6/2019
哦,我通常使用一种样式,但这段代码的一半是已经写好的示例,另一半是我的代码。

答:

6赞 user11313931 7/6/2019 #1

这是因为您没有为类声明一个将 int 作为参数的赋值运算符。由于不存在这样的运算符,因此编译器需要使用解决方法:它使用构造函数 A(int) 创建一个临时对象。可以通过显式使用构造函数来避免此行为:

explicit A(int x_ = 1) : x(x_) { }

临时构造完成后,使用为 A 提供的复制构造函数将其复制到“a”,紧接着,临时被销毁并调用其析构函数。

这种方法效率低下。为了使它更好,您应该为 A 定义一个赋值运算符,将 int 作为参数:

A& operator= (int x_) {
    x = x_;
    return *this;
}