- 拷貝控制成員函數(shù):拷貝構(gòu)造、拷貝賦值细睡、移動構(gòu)造谷羞、移動賦值、析構(gòu);不顯式定義則編譯器會生成合成版本湃缎∠睿拷貝和移動構(gòu)造函數(shù)定義了當(dāng)用同類型的另一個對象初始化本對象時做什么∩のィ拷貝和移動賦值運算符定義了將本對象初始化同類型的另一個對象時做什么九巡。析構(gòu)函數(shù)定義了銷毀對象時做什么。
13.1 拷貝蹂季、賦值與銷毀
13.1.1 拷貝構(gòu)造函數(shù)
1.拷貝構(gòu)造函數(shù):第一個參數(shù)是自身類類型的引用(必須是引用)冕广,且額外參數(shù)有默認(rèn)值。
- 拷貝初始化發(fā)生場景:
1 用 = 號定義變量
2 將一個對象作為實參傳遞給一個非引用類型的形參偿洁。
3 從一個返回類型為非引用類型的函數(shù)返回一個對象撒汉。
4 用花括號列表初始化一個數(shù)組中的元素或一個聚合類的成員。
5 初始化標(biāo)準(zhǔn)庫容器或調(diào)用其insert或push成員 - 直接初始化與拷貝初始化:直接初始化要求編譯器使用普通的函數(shù)匹配來選擇與我們提供的額參數(shù)最匹配的構(gòu)造函數(shù)涕滋〔欠拷貝初始化要求編譯器將有不運算對象拷貝到正在創(chuàng)建的對象中,如果需要還要進(jìn)行類型轉(zhuǎn)換宾肺。
- 如果拷貝構(gòu)造函數(shù)的參數(shù)不是引用類型溯饵,則永遠(yuǎn)不會成功——為了調(diào)用拷貝構(gòu)造函數(shù),我們必須拷貝它的實參爱榕,但為了拷貝實參瓣喊,我們又需要調(diào)用拷貝構(gòu)造函數(shù),如此無線循環(huán)黔酥。
13.1.2 拷貝賦值運算符
- 重載運算符本質(zhì)上是函數(shù)
13.1.3 析構(gòu)函數(shù)
1.析構(gòu)函數(shù):釋放對象使用資源藻三,并銷毀非stastic數(shù)據(jù)成員;不接受參數(shù)跪者,不能重載棵帽;先執(zhí)行函數(shù)體,再按初始化的逆序隱式銷毀成員渣玲;內(nèi)置指針類型不會delete對象逗概,智能指針是類類型所有可以釋放;引用和值指針離開作用域不析構(gòu)綁定對象忘衍。
13.1.4 三五法則
- 三/五法則:5個拷貝控制成員應(yīng)看作整體逾苫,定義了一個則應(yīng)定義所有。
- 需要拷貝構(gòu)造函數(shù)的類也需要賦值操作枚钓,反之亦然铅搓。
13.1.6 阻止拷貝
- 阻止拷貝:定義刪除的拷貝控制函數(shù);新標(biāo)準(zhǔn)發(fā)布前搀捷,通常將拷貝控制成員聲明為private星掰,并且不定義它們.
- 刪除的函數(shù):在函數(shù)的參數(shù)列表后面加上=delete來指出我們希望將它定義為刪除的。
- 析構(gòu)函數(shù)不能是刪除的成員。