C 拷貝建構函式和 賦值運算子詳解

2021-08-27 06:45:21 字數 2065 閱讀 8807

首先明確一點:

系統已經提供了預設的 拷貝建構函式 和 =複製運算子。 即所謂的淺拷貝。

但有時,我們必須提供自己重寫。一般是在有指標的情況下重寫。

舉個簡單的例子,沒有指標,其實不必重寫,只是為了演示:

class fraction

fraction(){}

fraction(const fraction & fr);

fraction & operator=(fraction& p);

void display()

};fraction::fraction(const fraction & fr)

fraction & fraction::operator=(fraction& fr)

int main()

output:

test: use copy

test: use copy

test use =

test use =

如果有指標,則需要深拷貝:

#include using namespace std;

class ca

ca(const ca& c)

void show()

保證賦值運算子只有兩種結果:完全成功、原封不動留下物件並丟擲異常

cassignment& cassignment::operator=(const cassignment& a)

派生類使用賦值運算子

派生類中的賦值運算子首先呼叫其直接基類賦值運算子(對宣告在基類裡的成員物件賦值),然後再呼叫它的成員物件的賦值運算子(改變在派生類裡宣告的那些成員物件)。這些賦值通常應該與基類和成員物件在該類的定義裡出現的次序相同。

cderived& cderived::operator=(const cderived& r)

過載賦值運算子的正確形式:

c++的設計者stroustrup下了很大的功夫想使使用者自定義型別盡可能地和內部

型別的工作方式相似。為此他做了很多努力(如過載運算子,寫型別轉換函

數和拷貝建構函式,等等)。而你也該繼續做下去。

讓我們看看賦值。用內部型別的情況下,賦值操作可以象下面這樣鏈起來:

int w, x, y, z; w = x = y = z = 0;

所以,你也應該可以將使用者自定義型別的賦值操作鏈起來:

cstring w, x, y, z; // mfc 「自定義」的型別

w = x = y = z = "hello";

因為賦值運算子的結合性天生就是由右向左,所以上面的賦值可以解析為:

w = (x = (y = (z = "hello"))); <=>

w.operator=(x.operator=(y.operator=(z.operator=("hello"))));

這個格式說明了w.operator=, x.operator=和y.operator=的引數是前乙個

operator=呼叫的返回值。所以operator=的返回值必須可以作為乙個輸

入引數被函式自己接受。一般情況下operator=輸入應該是類物件或

類物件的引用,從效率來說後者好過前者 ,所以輸入和返回的都應

是類物件的引用。

又因為有

int x, y,z; (x = y) = z ;

所以如下語句也應正確

cstring x, y, z; ( x = y) = z;

那麼operator=的返回不能是const(因為常量不能賦左值)

又有 cstring x; x = 「hello」; <=>

const cstring temp(「hello」); //產生臨時物件,為什麼是const

x = temp;

所以為保證上面的語句成立, operator=的輸入應是const

所以最好的實現是 t& operator=(const t&);

C 拷貝建構函式和 賦值運算子詳解

首先明確一點 系統已經提供了預設的 拷貝建構函式 和 複製運算子。即所謂的淺拷貝。但有時,我們必須提供自己重寫。一般是在有指標的情況下重寫。舉個簡單的例子,沒有指標,其實不必重寫,只是為了演示 cpp class fraction fraction fraction const fraction f...

詳解C 拷貝建構函式和賦值運算子

本文主要介紹了拷貝建構函式和賦值運算子的區別,以及在什麼時候呼叫拷貝建構函式 什麼情況下呼叫賦值運算子。最後,簡單的分析了下深拷貝和淺拷貝的問題。拷貝建構函式和賦值運算子 在預設情況下 使用者沒有定義,但是也沒有顯式的刪除 編譯器會自動的隱式生成乙個拷貝建構函式和賦值運算子。但使用者可以使用dele...

C 拷貝建構函式和賦值運算子

本文主要介紹了拷貝建構函式和賦值運算子的區別,以及在什麼時候呼叫拷貝建構函式 什麼情況下呼叫賦值運算子。最後,簡單的分析了下深拷貝和淺拷貝的問題。在預設情況下 使用者沒有定義,但是也沒有顯式的刪除 編譯器會自動的隱式生成乙個拷貝建構函式和賦值運算子。但使用者可以使用delete來指定不生成拷貝建構函...