c++ - 为什么给对象赋值的时候会调用构造函数和析构函数

标签 c++ constructor destructor assignment-operator

我有以下代码:

#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

最佳答案

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

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

在构造临时文件后,使用为 A 提供的复制构造函数将其复制到“a”。之后立即销毁临时文件并调用其析构函数。

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

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

关于c++ - 为什么给对象赋值的时候会调用构造函数和析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56906627/

相关文章:

c++ - 为什么析构函数在 C++ 中运行两次?

c++ - 链接器错误 - 带有 libboost_thread 的 macOS 上 undefined symbol std::string::c_str() const?

c++ - 编程策略 : how to use pointers or reference to increase speed or decrease memory use?

c++ - C++类中的奇怪构造函数

c++ - 如何在类中轻松创建 vector 或数组以及如何访问它们

c++ - 从静态变量引用非静态变量会使非静态变量在静态变量之前析构

c++ - 初始化一个结构,其成员是另一个结构的数组

C++ - Linux/shell 脚本运行子进程并获取它们的返回状态

继承构造函数的 C++ 可见性

c++ - 静态分配的内存在静态取消初始化期间会变得无效吗?