C Primer 物件移動

2021-10-03 07:52:12 字數 909 閱讀 3968

1、標準庫容器、string和shared_ptr類既支援移動也支援拷貝。io類和unique_ptr類可以移動但不能拷貝。

2、變數是左值,因此我們不能將乙個右值引用直接繫結到乙個變數上,即使這個變數是右值引用型別也不行。

3、使用move的**應該使用std::move而不是move。

4、不丟擲異常的移動建構函式和移動賦值運算子必須標記為noexcept。

5、除了將移後源物件置為析構安全的狀態之外,移動操作還必須保證物件仍然是有效的。一般來說,物件有效就是指可以安全地為其賦予新值或者可以安全地使用而不依賴其當前值。另一方面,移動操作對移後源物件中留下的值沒有任何要求。因此,程式不應該依賴於移後源物件中的資料。

即,在移動操作之後,移後源物件必須保持有效的、可析構的狀態,但是使用者不能對其值進行任何假設。

6、與拷貝操作不同,編譯器根本不會為某些類合成移動操作。特別是,如果乙個類定義了自己的拷貝建構函式、拷貝賦值運算子或者析構函式,編譯器就不會為它合成移動建構函式和移動賦值運算子了。因此,某些類就沒有移動建構函式或移動賦值運算子。如果乙個類沒有移動操作,通過正常的函式匹配,類會使用對應的拷貝操作來代替移動操作。只有當乙個類沒有定義任何自己版本的拷貝控制成員,且類的每個非static資料成員都可以移動時,編譯器才會為它合成移動建構函式或移動賦值運算子。

7、所有五個拷貝控制成員(拷貝建構函式、拷貝複製運算子、析構函式、移動建構函式、移動複製運算子)應該看作乙個整體:一般來說,如果乙個類定義了任何乙個拷貝操作,它就應該定義所有五個操作。

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

class foo

;

C Primer 物件導向程式設計

1.要注意區分類和類物件,物件只能訪問public成員,而類和友元可以訪問private成員。而對於基類的protected成員,派生類可以訪問其基類的protected成員 友元中也可以訪問protected成員 不能通過派生類物件在類外訪問protected成員 這點與private類似 值得注...

c primer 物件導向程式設計

1.重構現象 因為派生類的建構函式只能初始化它的直接基類,所以這樣就出現了一種新的現象 重構,重構是很常見的,它是指在子類中重新定義父類的建構函式,已達到自己想要的建構函式。重構要注意的是一旦被重構,編譯器必須重新編譯這些類的 class pp class d1 public base class ...

C Primer 物件導向程式設計

1 在c 中,基類將型別相關的函式與派生類不做改變直接繼承的函式區分對待。對於某些函式,基類希望它的派生類各自定義適合自身的版本,此時基類就將這些函式宣告成虛函式 virtual function 2 在c 中,當我們使用基類的引用 或指標 呼叫乙個虛函式時將發生動態繫結。3 關鍵字virtual只...