2 c 複製建構函式使用

2022-05-09 09:12:09 字數 1120 閱讀 7074

1.複製建構函式原型

class_name(const class_name&)

兩個值得思考的地方:

1.1.為什麼這裡引數是常量?其實這裡不用常量也可以,只不過會存在乙個問題。如果我們利用臨時物件作為引數呼叫複製建構函式。

由於非常量的引用不能指向臨時物件,所以不可以這樣做。參考這篇博文:

1.2.為啥是按引用傳遞?按值傳遞可以嗎?不可以按值傳遞,原因是按值傳遞是首先拷貝這個值,必然又會呼叫複製建構函式,函式就變成了死迴圈,

這tm不是遞迴呼叫嘛。

2.何時會呼叫

2.1.函式按值傳遞物件時,會複製物件,呼叫複製建構函式

2.2.函式返回物件時,會先把這個物件複製乙份,呼叫複製建構函式。

2.3.顯示呼叫複製建構函式

3.預設複製建構函式,會一一複製非靜態資料成員。

4.何時需要重寫複製建構函式

當牽涉到new動態分配記憶體的時候,需要考慮是否需要重寫。今天實現string類時就遇到了此類問題。

string::string(const

char*temp)

string::string(const

string &st)

string::~string

()

如果不重寫複製建構函式,即這樣:

string::string(const

string &st)

兩個物件的指標都指向同一塊記憶體,當呼叫析構函式時,會釋放同一塊記憶體兩次,這將引發程式崩潰。

5.一同需要考慮的是,預設的賦值運算子=,即:operator=()

預設的賦值運算子也是一一複製靜態資料成員。所以呢,有new的地方也應該考慮重寫。具體如下:

string& string:: operator = (string&st)

原始碼:注意:當自身類的引用作為類成員函式引數

時,這個引用的類可以直接訪問資料成員。

比如說string& string:: operator = (string& st)

st可以直接訪問私有資料成員str。

另外,類成員函式下面本類的物件也可以直接訪問私有資料成員。

C 複製建構函式的使用

在c 中物件之間相互複製總是起不到預期的效果,今天呢給大家分享一下區別於淺複製的深複製,可以達到重新開闢記憶體單元,將被複製的內容完整的拷貝到指定物件的成員變數中去。1.當類的物件被初始化為同一類的另一物件時 2.當物件被當做乙個引數傳遞給乙個函式時 3.當函式返回乙個物件時使用例項 首先其形式同一...

C 複製建構函式

c 複製建構函式,一般在一下幾種情況中出現 1 物件以值傳遞的方式傳入函式時 2 物件以值傳遞的的方式從函式返回 3 乙個物件通過另乙個物件初始化 4 陣列 根據陣列中的初始化列表初始化陣列的時候。5 容器 初始化順序容器中的元素 有3種情況必須使用複製建構函式 a 如果有資料成員是指標 b 要在建...

C 複製建構函式

1.概念 只有單個形參,而且該形參是對本類型別物件的引用 常用const修飾 2.首先看乙個小例子 h中 class test private int a float b cpp中 int main test test1 5,5.5 test test2 1,1.1 coutcouttest3使用了...