在乙個類物件的定義過程中,物件初始化分為兩種:
1)、直接初始化,要求編譯器使用普通的函式匹配,選擇我們提供的最匹配的建構函式,
2)、拷貝初始化,要求編譯器將右側運算物件拷貝到正在建立的物件中,通常使用拷貝建構函式來完成。
//直接初始化,使用string的建構函式string (size_t n, char c);
string dots(10
,'s');
//直接初始化,使用拷貝建構函式string (const string& str);
string s
(dots)
;//使用拷貝賦值運算子,拷貝初始化,使用拷貝建構函式string (const string& str);
string s1 = dots;
//拷貝初始化
string null_book =
"9-99-999"
;//拷貝初始化
string nines =
string(10
,'s'
);
在物件拷貝過程中,如果沒有自定義拷貝建構函式,系統會提供乙個預設的拷貝建構函式,進行的是淺拷貝!
即使定義了其它建構函式,編譯器也會合成乙個拷貝建構函式,即合成拷貝建構函式。
class
foo
乙個拷貝建構函式的構成:
1、乙個建構函式的第乙個引數是自身型別的引用
2、且任何額外引數都有預設值
拷貝初始化的使用場景:
1、將乙個物件作為實參傳遞給乙個非引用型別的形參
class
foofoo
(int p, foo* nex):a
(p),
next
(nex)
foo(
const foo& p):a
(p.a)
,next
(p.next)
~foo()
=default
;void
copy1
(foo s)
;void
copy
(foo& s);
foo*
out();
foo out2()
;};void foo::
copy1
(foo s)
//實參到形參,呼叫拷貝建構函式
//實參到形參發生的拷貝中,next是一次淺拷貝
//next訪問的仍是實參next指向的記憶體
void foo::
copy
(foo& s)
//只是引用,未呼叫拷貝建構函式
2、從乙個返回型別為非引用型別的函式返回乙個物件
foo* foo::
out(
)//返回的this指標賦值給新指標時,呼叫拷貝建構函式
foo foo::
out2()
//返回值會被賦值給乙個物件,使用拷貝建構函式
3、用花括號列表初始化乙個陣列中的元素或乙個聚合類中的成員
foo nin(9
, six)
;//使用建構函式,構造新物件
foo ten =
;//使用列表初始化格式對應的建構函式建立臨時物件
//再呼叫拷貝建構函式
在定義拷貝建構函式時,會發生不同性質的拷貝過程,主要分為深拷貝和淺拷貝。
foo
(const foo& p):a
(p.a)
,next
(p.next)
//淺拷貝
foo(
const foo& p)
//深拷貝
其特點為:
淺拷貝只是對指標的拷貝,拷貝後兩個指標指向同乙個記憶體空間。
深拷貝不但對指標進行拷貝,而且對指標指向的內容進行拷貝,經深拷貝後的指標是指向兩個不同位址的指標。
可以支援移動操作,需要定義移動建構函式和移動賦值運算子。
會將給定物件的資源「竊取」,而不是拷貝資源。
一旦完成資源移動,源物件必須不在指向被移動的資源。
foo
(const foo&& p):a
(p.a)
,next
(p.next)
//移動拷貝
該類型別的右值引用。
左值與右值的區別
左值持久,右值短暫
1、所引用的物件將要被銷毀,字面值常量或者臨時變數
2、該物件沒有其它使用者
左值是變數,右值不能被賦值
左值引用與右值引用
右值引用是為了支援移動操作,通過&&來獲得右值引用。
右值引用可以自由接管所引用物件的資源。
c++11新特性:std::move(),可以將乙個左值轉換為對應的右值引用型別。
左值引用是相對於右值引用的,通過&來獲得。
左值引用指向源物件的資源。
可以定義左值引用自己的寫許可權。
比如const引用就不可以修改源物件的值。
python學習筆記 (六)深copy 淺copy
在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用。賦值其實只是傳遞物件引用,引用物件id是一樣的。原始列表改變,被賦值的b也會做相同的改變。alist 1,2,3,a b b alist print...
拷貝建構函式,深拷貝與淺拷貝
一.拷貝建構函式 先直接來看 include include help.h using namespace std class line private char msg line line const char msg line line const line line line line voi...
C 淺拷貝與深拷貝建構函式
include using namespace std 淺拷貝和深拷貝區別 1.淺拷貝,若類中不存在拷貝建構函式,會提供預設拷貝建構函式 淺拷貝 可以進行物件值賦值 但當資料成員中存在需要在堆區申請空間時,析構時淺拷貝會造成空間雙重釋放問題 2.深拷貝,當資料成員中存在需要在堆區申請空間時,會呼叫深...