類(七)《一談類的更深與番外》 (四)移動

2021-10-04 13:27:48 字數 1042 閱讀 7923

移動是指將右值移動,因此,我們首先要知道什麼是左值,什麼是右值。

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 最常見的關係之一,...