C C 類和物件 物件移動和移動建構函式

2022-08-13 06:57:12 字數 1967 閱讀 3801

c++11引入物件移動;進行所有權的轉移;

移動建構函式和移動賦值運算子應該完成的功能

引入目的:提高程式效率;

說明:

a --> b,那麼a物件就不能再使用了;

拷貝建構函式

class temp;

temp::temp(const temp& tmp); //引數是const左值引用

移動建構函式

class temp;

temp::temp(temp&& tmp); //引數是右值引用

#include using namespace std;

class b

; //拷貝建構函式

b(const b& tmp) :m_b(tmp.m_b)

; virtual ~b()

public:

int m_b;

};class a

a(const a& tmp) :m_p_b(new b(*(tmp.m_p_b))) //呼叫類b的拷貝建構函式

//c++11 引入 noexcept 通知標準庫,移動建構函式不丟擲任何異常,提高編譯器工作效率;

//移動建構函式要新增noexcept

a(a&& tmp) noexcept :m_p_b(tmp.m_p_b) //原來物件a指向的記憶體m_p_b,直接就讓這個臨時物件指向這段記憶體;

virtual ~a()

public:

b* m_p_b;

};static a get_a()

int main()

#include using namespace std;

class b

; //拷貝建構函式

b(const b& tmp) :m_b(tmp.m_b)

; virtual ~b()

public:

int m_b;

};class a

a(const a& tmp) :m_p_b(new b(*(tmp.m_p_b))) //呼叫類b的拷貝建構函式

//c++11 引入 noexcept 通知標準庫,移動建構函式不丟擲任何異常,提高編譯器工作效率;

//移動建構函式要新增noexcept

a(a&& tmp) noexcept :m_p_b(tmp.m_p_b) //原來物件a指向的記憶體m_p_b,直接就讓這個臨時物件指向這段記憶體;

virtual ~a()

//拷貝賦值運算子

a& operator=(const a& src)

//移動賦值運算子

a& operator=(a&& src) noexcept

public:

b* m_p_b;

};static a get_a()

int main()

某些條件下,編譯器會合成移動建構函式,移動賦值運算子

有自己的拷貝建構函式,自己的拷貝賦值運算子,或者自己的析構,那麼編譯器就不會為它合成移動建構函式和移動賦值運算子

如果沒有自己的移動建構函式和移動賦值運算子,系統會呼叫我們自己寫的拷貝建構函式和拷貝賦值運算子來代替;

只有乙個類沒有定義自己的拷貝構造成員(拷貝建構函式和拷貝運算子),且類中的每個非靜態成員都可以移動時,編譯器才會為該類合成移動建構函式或者移動賦值運算子;

什麼叫做成員可以移動?

內建型別可以移動;

類型別成員,如果這個類有對應的移動操作相關的函式,就可以移動;

//舉例

struct tc

int main()

C C 類和物件

最近在公司弄遊戲開發,c 基礎也不是特別好,所以就打算繼續開始學習c 既然從頭學習c 就打算寫乙個系列教程。c 學習之路。我是在邊學習c 邊學習cocos2dx 3.x,白天時間不是很多,先把c 系列寫完再寫coco2dx的教程。希望對大家有幫助。可能基礎知識不是很詳細,對沒有其他語言基礎的人來說不...

物件和類 物件的構造

多種型別的建構函式 問題 物件中成員變數的初始值是多少?示例 成員變數的初始值 include class test int getj test gt int main 輸出結果 gt.i 0 gt.j 0 t1.i 14998400 t1.j 134514203 pt i 0 pt j 0 分析 ...

物件移動,移動建構函式與移動賦值運算子

一 物件移動的概念 把乙個物件的所有權轉交給另乙個物件。完成必要的記憶體移動,斬斷原物件和記憶體的關係。二 移動建構函式 呼叫移動建構函式的情形 函式返回乙個物件時。include include using namespace std classa a a const a temp p new i...