C++ 拷贝构造函数和重载赋值操作符不能相互调用
拷贝构造函数调用重载赋值操作符,重载赋值操作符调用拷贝构造函数的写法都是没有意义的。
首先:
拷贝构造函数的存在意义--------是通过已有的对象构造新的对象,构造完毕后才有两个对象;
重载赋值操作符的意义-----------将一个对象的值赋给另一个对象,两个对象都已经构造完毕了。
拷贝构造函数----调用-----重载赋值操作符:把已有对象的值赋给一个构造中的对象,虽然这个对象的内存已经分配好了
但是有可能导致循环调用重载赋值操作符和拷贝构造函数
重载赋值操作符---调用------拷贝构造函数:把已有对象复制并赋值给这个对象。
导致循环调用重载赋值操作符。
总之--复制构造函数调用赋值操作符就好像正在构造的对象却用已经构造好的对象;
赋值操作符调用复制构造函数就好像用正在构造的对象进行赋值;
例子:
例子1:拷贝构造函数调用重载赋值操作符(导致循环调用重载赋值操作符和拷贝构造函数 )
- #include <iostream>
- using namespace std;
- class Base {
- public:
- Base() {cout << "Constructor invoked!" << endl;}
- ~Base() {cout << "Destructor invoked!" << endl;}
- Base(const Base& rhs) {
- cout << "Copy constructor invoked!" << endl;
- operator=(rhs); // *this = rhs;
- }
- Base operator=(const Base& rhs) { // 问题出在这里,返回值不是引用会调用拷贝构造函数
- cout << "Copy assignment operator invoked!" << endl;
- return *this;
- }
- };
- int main(int argc, char** argv) {
- cout << "Hello World C++!" << endl;
- Base a;
- Base b(a); // Base b = Base(a);
- return 0;
- }