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...