移動是指將右值移動,因此,我們首先要知道什麼是左值,什麼是右值。
1.變數是左值
int i=5;
//左值
int& r=i;
//左值引用
int&& o=i;
//錯誤,i是左值
2.表示式是右值int i=4;
int&& r=i*16;
//這是右值!!!
注意:右值引用也是左值!!!由於變數都是左值,所以右值引用也是左值!!!
以下**是錯誤的!!!
int i=6;
int&& o=i*42;
int&& r=o;
//錯誤,o是左值!!!
如5.2章所說,那麼我們也就沒有辦法用乙個右值引用去給另乙個右值賦值,那麼每次都要重新寫乙個表示式,這樣非常麻煩。我們可以使用標準庫std::move()函式就可以簡便許多。它定義在標準庫utility中。所以上圖可以這麼改:
int i=9;
int&& p=i+68;
int&& q=std::
move
(p);
既然有可能使用右值引用,那麼我們還要寫乙個移動建構函式。形式如下:
classaa
(const a&);
a(a&& mem)
//...
};
當我們移動乙個物件之後,這個物件就成了移後源物件。乙個移後源物件必須是可析構的。所以,我們要將移動後的物件進入可析構狀態。
舉個例子,假設我們的pointer類有乙個指標,那麼我們應該這麼寫它的移動建構函式:
class
pointer
//正確,析構point是安全的
//...
};
類(七)《一談類的更深與番外》 (三)拷貝
class a 以上 的建構函式就是拷貝建構函式。上面的 中的a const a 若改a const a default則它等價於以下 a const a member a member.a c member.c b member.b s member.s f member.f 我們看到,每個資料成...
私有成員變數的訪問(類內與類外)
1 class ctest 1011 ctest ctest int i value i 1215 16 ctest ctest const ctest rhs value rhs.value 1720 21 ctest ctest operator const ctest rhs 2229 30v...
類與類之間的四種關係
1 聚合aggregation 例如電腦由cpu 記憶體 硬碟組成 public class computer public ram ram public keyboard keyboard 又或者人群由人構成 public class clowd 2 關聯association 最常見的關係之一,...