13拷貝控制

13拷貝控制

13.1拷貝椿息、賦值與銷毀

13.1.1拷貝構(gòu)造函數(shù)

拷貝構(gòu)造函數(shù)的第一個參數(shù)必須是引用類型可训。

使用拷貝初始化時蟆豫,我們要求編譯器將右側(cè)運(yùn)算對象拷貝到正在創(chuàng)建的對象中棍潘,如果需要的畫還要進(jìn)行類型轉(zhuǎn)換裕偿。

在函數(shù)調(diào)用過程中尊剔,具有非引用類型的參數(shù)要進(jìn)行拷貝初始化精偿。拷貝構(gòu)造函數(shù)被用來初始化非引用類型參數(shù)赋兵。

我們使用explicit就不要考慮是拷貝初始化還是直接初始化了笔咽。

13.1.2拷貝賦值運(yùn)算符

如果運(yùn)算符是一個成員函數(shù),其左側(cè)運(yùn)算對象就綁定到隱式的this參數(shù)霹期。右側(cè)運(yùn)算對象作為顯示參數(shù)傳遞叶组。賦值運(yùn)算符應(yīng)該返回一個指向左側(cè)運(yùn)算對象的引用。

13.1.3析構(gòu)函數(shù)

構(gòu)造函數(shù)初始化對象的非static數(shù)據(jù)成員历造;析構(gòu)函數(shù)釋放對象使用的資源甩十,并銷毀對象的非static數(shù)據(jù)成員。對一個給定類只會有唯一一個析構(gòu)函數(shù)吭产。

在一個析構(gòu)函數(shù)中侣监,首先執(zhí)行函數(shù)體,然后銷毀成員臣淤。成員按初始化順序的逆序銷毀橄霉。析構(gòu)函數(shù)釋放對象在生存期分配的所有資源。

隱式銷毀一個內(nèi)置指針類型成員不會delete它所指向的對象邑蒋。

13.1.4三五法則

需要拷貝操作的類也需要賦值操作姓蜂,反之亦然

13.1.5使用=default

13.1.6阻止拷貝

為什么拷貝医吊、賦值钱慢、銷毀的合成版本會阻止其操作?

對某些類來說卿堂,這些操作沒有合理的意義束莫,所以得采用某種機(jī)制阻止拷貝或賦值。例如iostream類阻止了拷貝草描。

定義刪除的函數(shù)

析構(gòu)函數(shù)不能是刪除的成員览绿,可定義,但帶來的后果是災(zāi)難性的陶珠。

合成的拷貝控制成員可能是刪除的挟裂。

13.2拷貝控制和資源管理

13.2.1行為像值的類

13.2.2行為像指針的類

定義引用計(jì)數(shù)來決定什么時候delete。將計(jì)算器保存在動態(tài)內(nèi)存中揍诽。

13.3交換操作

底層利用std::swap交換

在賦值運(yùn)算符中使用swap

13.6對象移動

某些情況下通過對象移動能夠“拷貝诀蓉、賦值”能夠節(jié)省很多資源栗竖。

13.6.1右值引用&&

右值引用必須綁定到右值的引用,利用&&來獲得右值引用渠啤。

左值=右值狐肢;一個左值表達(dá)式表示的是一個對象的身份(地址),而右值表達(dá)式表示的是對象的值沥曹。

常規(guī)引用為左值引用份名。不能將其綁定到要求轉(zhuǎn)換的表達(dá)式、字面常量或是返回右值的表達(dá)式妓美。

右值引用也不過是對象的另一個名字而已僵腺,可以綁定到左值引用不能綁定的對象上,但是不能將一個右值引用直接綁定到一個左值上壶栋。

左值持久辰如;右值短暫

左值具有持久的狀態(tài),而右值要么是字面常量贵试,要么是在表達(dá)式求值過程中創(chuàng)建的臨時對象琉兜。

13.6.2移動構(gòu)造函數(shù)和移動賦值運(yùn)算符

移動構(gòu)造函數(shù)第一個參數(shù)是該類的一個右值引用。直接移動毙玻,然后在析構(gòu)實(shí)參豌蟋。

noexcept(通知標(biāo)準(zhǔn)庫不拋出任何異常),必須在頭文件的聲明中和定義中(如果定義在類外)都指定noexcept桑滩。

移動構(gòu)造函數(shù)不分配任何新內(nèi)存梧疲。

移動賦值運(yùn)算符是先清空本身,在移動施符,在析構(gòu)實(shí)參往声。

與拷貝操作不同,移動操作用于不會隱式定義為刪除的函數(shù)戳吝。

用拷貝構(gòu)造函數(shù)代替移動構(gòu)造函數(shù)幾乎肯定是安全的(賦值也是如此)。

移動右值拷貝左值贯涎,但如果沒有移動構(gòu)造函數(shù)听哭,右值也被拷貝。

移動迭代器

一個迭代器一般解引用運(yùn)算符返回一個指向元素的左值塘雳。而移動迭代器的解引用運(yùn)算符生成有個右值引用陆盘。

13.6.3右值引用和成員函數(shù)

實(shí)參類型決定了新元素是拷貝還是移動到容器中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末败明,一起剝皮案震驚了整個濱河市隘马,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妻顶,老刑警劉巖酸员,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜒车,死亡現(xiàn)場離奇詭異,居然都是意外死亡幔嗦,警方通過查閱死者的電腦和手機(jī)酿愧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邀泉,“玉大人嬉挡,你說我怎么就攤上這事』阈簦” “怎么了庞钢?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長因谎。 經(jīng)常有香客問我焊夸,道長,這世上最難降的妖魔是什么蓝角? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任阱穗,我火速辦了婚禮,結(jié)果婚禮上使鹅,老公的妹妹穿的比我還像新娘揪阶。我一直安慰自己,他們只是感情好患朱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布鲁僚。 她就那樣靜靜地躺著,像睡著了一般裁厅。 火紅的嫁衣襯著肌膚如雪冰沙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天执虹,我揣著相機(jī)與錄音拓挥,去河邊找鬼。 笑死袋励,一個胖子當(dāng)著我的面吹牛侥啤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茬故,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼盖灸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了磺芭?” 一聲冷哼從身側(cè)響起赁炎,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钾腺,沒想到半個月后徙垫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讥裤,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年松邪,在試婚紗的時候發(fā)現(xiàn)自己被綠了坞琴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡逗抑,死狀恐怖剧辐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邮府,我是刑警寧澤荧关,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站褂傀,受9級特大地震影響忍啤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仙辟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一同波、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叠国,春花似錦未檩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至项棠,卻和暖如春悲雳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背香追。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工合瓢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翅阵。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓歪玲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掷匠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 13.1 拷貝岖圈,賦值與銷毀 以上這些操作讹语,必須明白定義與不定義會對類的操作產(chǎn)生何種影響,變編譯器定義的合成版本未必...
    龍遁流閱讀 366評論 0 1
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,506評論 1 51
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,776評論 1 10
  • 精致寶寶望著筐里的饅頭蜂科,眼神直愣愣的顽决,說著我特別想懂的話短条,看我不理他,一邊用小手拍我胳膊才菠,一邊啊啊啊的茸时。小家伙對美...
    ef19cd0c10f7閱讀 177評論 0 0
  • Swift 是一種支持多編程范式和編譯式的開源編程語言,蘋果于2014年WWDC(蘋果開發(fā)者大會)發(fā)布,用于開發(fā) ...
    零度_不結(jié)冰閱讀 350評論 0 0