C++: "T a = b" -- 复制构造函数或赋值运算符?

C++: "T a = b" -- copy constructor or assignment operator?

本文关键字:构造函数 复制 赋值运算符 C++      更新时间:2023-10-16

假设T是一个C++类,如果我T a = b;,是否调用了复制构造函数或赋值运算符?

我当前的实验显示调用了复制构造函数,但不明白为什么。

#include <iostream>
using namespace std;
class T {
 public:
  // Default constructor.
  T() : x("Default constructor") { }
  // Copy constructor.
  T(const T&) : x("Copy constructor") { }
  // Assignment operator.
  T& operator=(const T&) { x = "Assignment operator"; }
  string x;
};
int main() {
  T a;
  T b = a;
  cout << "T b = a; " << b.x << "n";
  b = a;
  cout << "b = a; " << b.x << "n";
  return 0;
}
$ g++ test.cc
$ ./a.out
T b = a; Copy constructor
b = a; Assignment operator

谢谢!

调用复制构造函数是因为

T a = b;

具有与

T a(b);

这是一个初始化,而不是一个赋值。长话短说,这就是语言的工作方式。

...
// The variable a does not exist before this point, therefore it is *conststructed*
T a = b; // Copy constructor is called
...

...
T a;   // Default constructor is called
// a already exists, so assignment is used here
a = b; // assignment operator is called
...