1. 程式人生 > >C++ 拷貝建構函式和過載賦值操作符不能相互呼叫

C++ 拷貝建構函式和過載賦值操作符不能相互呼叫

拷貝建構函式呼叫過載賦值操作符,過載賦值操作符呼叫拷貝建構函式的寫法都是沒有意義的。

首先:

拷貝建構函式的存在意義--------是通過已有的物件構造新的物件,構造完畢後才有兩個物件

過載賦值操作符的意義-----------將一個物件的值賦給另一個物件,兩個物件都已經構造完畢了

拷貝建構函式----呼叫-----過載賦值操作符:把已有物件的值賦給一個構造中的物件,雖然這個物件的記憶體已經分配好了

但是有可能導致迴圈呼叫過載賦值操作符和拷貝建構函式

過載賦值操作符---呼叫------拷貝建構函式:把已有物件複製並賦值給這個物件。

  導致迴圈呼叫過載賦值操作符。

總之--複製建構函式呼叫賦值操作符就好像

正在構造的物件卻用已經構造好的物件;
賦值操作符呼叫複製建構函式就好像用正在構造的物件進行賦值;

例子:

例子1:拷貝建構函式呼叫過載賦值操作符(導致迴圈呼叫過載賦值操作符和拷貝建構函式 )

  1. #include <iostream>
  2. usingnamespace std;  
  3. class Base {  
  4. public:  
  5.     Base() {cout << "Constructor invoked!" << endl;}  
  6.     ~Base() {cout << "Destructor invoked!" << endl;}  
  7.     Base(const
     Base& rhs) {  
  8.         cout << "Copy constructor invoked!" << endl;  
  9.         operator=(rhs); // *this = rhs;
  10.     }  
  11.     Base operator=(const Base& rhs) { // 問題出在這裡,返回值不是引用會呼叫拷貝建構函式
  12.         cout << "Copy assignment operator invoked!" << endl;  
  13.         return *this;  
  14.     }  
  15. };  
  16. int main(int argc, char** argv) {  
  17.     cout << "Hello World C++!" << endl;  
  18.     Base a;  
  19.     Base b(a); // Base b = Base(a);
  20.     return 0;  
  21. }