C 中的拷貝

2021-07-16 20:53:16 字數 950 閱讀 5388

一、拷貝建構函式

1、拷貝建構函式的引數為什麼必須使用引用型別?

答:如果拷貝建構函式中的引數不是乙個引用,即形如cclass(const cclass c_class),那麼就相當於採用了傳值的方式(pass-by-value),而傳值的方式會呼叫該類的拷貝建構函式,從而造成無窮遞迴地呼叫拷貝建構函式。因此拷貝建構函式的引數必須是乙個引用。

需要澄清的是,傳指標其實也是傳值,如果上面的拷貝建構函式寫成cclass(const cclass* c_class),也是不行的。事實上,只有傳引用不是傳值外,其他所有的傳遞方式都是傳值。

**:#includeusing namespace std;

class cexample

; 會呼叫

string

的拷貝建構函式。

如果在沒有顯式宣告建構函式的情況下,編譯器都會為乙個類合成乙個預設的建構函式。如果在乙個類中宣告了乙個建構函式,那麼就會阻止編譯器為該類合成預設的建構函式。和建構函式不同的是,即便定義了其他建構函式

(但沒有定義拷貝建構函式

),編譯器總是會為我們合成乙個拷貝建構函式。

另外函式的返回值是不是引用也有很大的區別,返回的不是引用的時候,只是乙個簡單的物件,此時需要呼叫拷貝建構函式,否則,如果是引用的話就不需要呼叫拷貝建構函式。如下例子:

#includeusing namespace std;

class a

a(const a& other) //建構函式過載

ca(const ca& c)

void show()

{   cout<

總結:如果乙個類擁有資源

(堆,或者是其它系統資源

),當這個類的物件發生複製過程的時候,這個過程就可以叫做深拷貝,反之物件存在資源,但複製過程並未複製資源的情況視為淺拷貝。

淺拷貝資源後在釋放資源的時候會產生資源歸屬不清的情況導致程式執行出錯。 

C 中的拷貝控制

當我們定義乙個類時,我們顯式或者隱式的指定了此型別的物件的拷貝 移動 賦值和銷毀時的操作。乙個類通過五種特殊的成員函式來控制這些操作 拷貝建構函式 拷貝賦值運算子 移動建構函式 移動賦值運算子和析構函式。這些操作統稱為 拷貝控制操作。拷貝建構函式 移動建構函式 定義了用同型別的另乙個物件來初始化本物...

C 中的位拷貝和值拷貝

為了便於說明我們以string類為例 首先定義string類,而並不實現其成員函式。class string 位拷貝拷貝的是位址,而值拷貝則拷貝的是內容。如果定義兩個string物件a和b。a.m data和b.m data分別指向一段區域,a.m data windows b.m data lin...

C 中的位拷貝和值拷貝

原帖 http blog.csdn.net liam1122 archive 2007 12 25 1966617.aspx 為了便於說明我們以string類為例 首先定義string類,而並不實現其成員函式。class string 位拷貝拷貝的是位址,而值拷貝則拷貝的是內容。如果定義兩個stri...