一:物件移動的概念
把乙個物件的所有權轉交給另乙個物件。
完成必要的記憶體移動,斬斷原物件和記憶體的關係。
二:移動建構函式
呼叫移動建構函式的情形
函式返回乙個物件時。
#
include
#include
using
namespace std;
classa~
a()a
(const a& temp):p
(new
int(
*(temp.p)))
a(a&& temp):p
(temp.p)
private
:int
* p;};
static a a()
intmain()
執行結果:
a()
00b8fc5c
00b8fc5c
00b8fd54a(
&&)~a
()00b8fd54~a
()
三:移動賦值運算子
a obj;
a obj1;
obj = std::
move
(obj1)
;//呼叫移動賦值運算子。
四:合成的移動操作
某些情況下,編譯器能合成預設的移動建構函式和移動賦值運算子。
(
1)乙個類有自己的拷貝建構函式,或者,析構函式,拷貝賦值運算子,那麼編譯器就不會合成,移動建構函式和移動賦值運算子。(2
)如果沒有移動建構函式和移動賦值運算子,那麼編譯器會用拷貝建構函式,拷貝賦值運算子進行替代。(3
)乙個類沒有定義自己的拷貝構造成員(沒有拷貝建構函式,拷貝賦值運算子),且每個類的非靜態成員都可以移動,那麼編譯器會合成移動建構函式和移動賦值運算子。
五:總結
(1)盡量提供移動建構函式和移動賦值運算子
(2)加上noexcept
(3)如果在該呼叫移動建構函式和移動賦值運算子的地方卻沒有移動建構函式和移動賦值運算子,那麼編譯器會呼叫拷貝建構函式,拷貝賦值運算子進行替代。
移動拷貝建構函式和移動賦值
my string const char str my string my string 預設的建構函式淺拷貝 不用delete的原因是object ob ob1 一定分配好 my string const my string str 語法沒錯,可能編譯會拋 buffer new char len ...
移動建構函式與移動賦值運算子
定義 新標準的乙個主要的特性是可以移動而不拷貝物件的能力,乙個典型的例子是在分配新記憶體的過程中,將元素從就舊記憶體拷貝到新記憶體中是不必要的 先拷貝元素,在釋放舊記憶體 再者,如果乙個類中含有io類和unique ptr類那麼只能使用移動建構函式 右值引用 定義 右值引用只能繫結到乙個即將銷毀的物...
右值引用與移動建構函式 移動賦值
有一陣子沒看c 了,翻開c primer又陌生了一些,想了想引用,於是乎來看了下右值引用。int a 5 int b a 這是左值引用,若我們這樣修改 int a 5 int b a 1 編譯器會報錯 非常量引用的初始值必須為左值。也就是右邊的a 1是常量,常量給非常量引用賦值就報錯。我們可以這樣修...