第十三章 拷貝控制

2022-10-11 04:51:11 字數 1245 閱讀 3183

拷貝控制操作(copy control):

合成拷貝賦值運算子

合成析構函式

//賦值運算子組合了析構函式和拷貝建構函式的工作,先在底層生成物件空間,刪除類內原有的記憶體空間,然後指向新分配的指標。

hasptr& operator=(const hasptr& hp)

move函式

移動賦值運算子

合成的移動操作:

只有當乙個類沒有定義任何自己版本的拷貝控制成員,且類的每個非static資料成員都可以移動時,編譯器才會為它合成移動建構函式或移動賦值運算子。如string中有移動操作,就可以生成合成的移動操作。

如果顯示的要求編譯器生成=default的移動操作,且編譯器不能移動所有成員時,編譯器會將移動操作定義為刪除的函式。

乙個類是否定義了自己的移動操作對拷貝操作如何合成有影響。如果類定義了乙個移動建構函式和/或乙個移動賦值運算子,則該類的合成拷貝建構函式和拷貝賦值運算子會被定義為刪除的。

建議:小心地使用移動操作,以獲得效能提公升。

在編寫移動操作時,必須確保以後原物件進入乙個可析構的狀態

foo& operator=(const foo&) &;//防止對右值賦值
引用限定符可以是&和&&,對於&限定的函式,我們只能將它用於左值;對於&&限定的函式,只能用於右值:

foo &retfoo();//返回乙個引用;retfoo呼叫是乙個左值

foo retval();//返回乙個值,retval呼叫是乙個右值

foo j;

retfoo()=j; //正確,retfoo返回乙個左值

retval()=j; //錯誤,retval()返回乙個右值

j=retval(); //正確,我們可以將乙個右值作為賦值操作的右側運算物件

乙個函式可以同時用const和引用限定,引用限定符&必須跟隨在const限定符後。

當定義const成員函式時,可以定義兩個版本,唯一的差別是乙個版本有const限定而另乙個沒有。引用限定的函式不同。如果定義兩個或兩個以上相同名字和相同引數列表的成員函式,就必須對所有函式都加上引用限定符,或者都不加。

第十三章 拷貝控制

在定義任何 c 類時,拷貝控制操作都是必要部分。如果我們不顯示定義這些操作,編譯器也會為我們定義,但編譯器定義的版本的行為可能並非我們所想。拷貝初始化不僅在我們用 定義變數時會發生,在下列情況下也會發生 將乙個物件作為實參傳遞給乙個非引用型別的形參 從乙個返回型別為非引用型別的函式返回乙個物件 用花...

第十三章 拷貝控制

如果乙個建構函式第乙個引數是自身類型別的引用,且任何額外引數都有預設值,則為拷貝建構函式 拷貝初始化發生情況 拷貝建構函式自己的引數必須是引用型別否則會遞迴死迴圈 拷貝賦值運算子是乙個名為 operator 的函式 建構函式初始化物件的非static資料成員 析構函式釋放物件使用的資源,並銷毀物件的...

第十三章筆記 拷貝控制

乙個類通過定義五種特殊的成員函式來控制這些操作,包括 拷貝建構函式 copy construcor 拷貝賦值運算子 copy assignment operator 移動建構函式 move constructor 移動賦值運算子 move assignment operator 和析構函式 dest...