C++ 拷貝建構函式和過載賦值操作符不能相互呼叫
阿新 • • 發佈:2018-12-29
拷貝建構函式呼叫過載賦值操作符,過載賦值操作符呼叫拷貝建構函式的寫法都是沒有意義的。
首先:
拷貝建構函式的存在意義--------是通過已有的物件構造新的物件,構造完畢後才有兩個物件;
過載賦值操作符的意義-----------將一個物件的值賦給另一個物件,兩個物件都已經構造完畢了。
拷貝建構函式----呼叫-----過載賦值操作符:把已有物件的值賦給一個構造中的物件,雖然這個物件的記憶體已經分配好了
但是有可能導致迴圈呼叫過載賦值操作符和拷貝建構函式
過載賦值操作符---呼叫------拷貝建構函式:把已有物件複製並賦值給這個物件。
導致迴圈呼叫過載賦值操作符。
總之--複製建構函式呼叫賦值操作符就好像 正在構造的物件卻用已經構造好的物件;
賦值操作符呼叫複製建構函式就好像用正在構造的物件進行賦值;
例子:
例子1:拷貝建構函式呼叫過載賦值操作符(導致迴圈呼叫過載賦值操作符和拷貝建構函式 )
- #include <iostream>
- usingnamespace std;
- class Base {
- public:
- Base() {cout << "Constructor invoked!" << endl;}
- ~Base() {cout << "Destructor invoked!" << endl;}
- Base(const
- 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;
- }