13.1 拷貝舒憾、賦值與銷毀(2)

三/五法則

??需要析構函數(shù)的類也需要拷貝和賦值操作
??如果這個類需要一個析構函數(shù)侥锦,我們幾乎可以肯定它也需要一個拷貝構造函數(shù)和一個拷貝賦值運算符帮孔。

??需要拷貝操作的類也需要賦值操作香浩,反之亦然
??某些類所要完成的工作类缤,只需要拷貝和賦值操作,不需要析構函數(shù)邻吭。一個類需要一個拷貝賦值運算符餐弱,幾乎可以肯定它也需要一個拷貝構造函數(shù)。

使用=default

??我們可以通過將拷貝控制成員定義為=default來顯式地要求編譯器生成合成的版本:

class Sales_data {
public:
      //拷貝控制成員囱晴;使用default
      Sales_data()=default;
      Sales_data(constr Sales_data&)=default;
      Sales_data& operator=(const Sales_data &);
      ~Sales_data()=default;
      //其他成員的定義膏蚓,如前
};
Sales_data& Sales_data::operator=(const Sales_data&)=default;

??當我們在類內(nèi)用=default修飾成員的聲明時,合成的函數(shù)將隱式地聲明為內(nèi)聯(lián)的畸写,如果我們不希望合成的成員是內(nèi)聯(lián)函數(shù)驮瞧,應該只對類外定義使用=default。

阻止拷貝

??有些情況下枯芬,我們想要阻止或者改變類的拷貝论笔。

??定義刪除的函數(shù)
??我們可以通過將拷貝構造函數(shù)和拷貝賦值運算符定義為刪除的函數(shù)來阻止拷貝。刪除函數(shù)是這樣一種函數(shù):我們雖然聲明了它們千所,但不能以任何方式使用它們狂魔。在函數(shù)的參數(shù)列表后面加上=delete來指出我們希望將它定義為刪除的:

 struct NoCopy {
       NoCopy()=default;  //使用合成的默認構造函數(shù)
       NoCopy(const NoCopy&)=delete;  //阻止拷貝
        //....
};

??與=default不同,=delete必須出現(xiàn)在函數(shù)第一次聲明的時候真慢,我們可以對任何函數(shù)指定=delete毅臊,我們只能對編譯器可以合成的默認構造函數(shù)或拷貝控制成員使用=default。

??析構函數(shù)不能是刪除的成員
??我們不能刪除析構函數(shù)黑界,如果析構函數(shù)被刪除管嬉,就無法銷毀此類型的對象了,對于一個刪除了析構函數(shù)的類型朗鸠,編譯器將不允許定義該類型的變量或創(chuàng)建該類的臨時對象蚯撩。對于刪除了析構函數(shù)的類型,我們可以動態(tài)分配這種類型的對象烛占,但是不能釋放這些對象:

struct NoDtor {
      NoDtor()=default;  //使用合成默認構造函數(shù)
      ~NoDtor()=delete;  //我們不能銷毀NoDtor類型的對象
}胎挎;
NoDtor nd;  //錯誤:NoDtor的析構函數(shù)是刪除的
NoDtor *p=new NoDtor();  //正確:但我們不能delete p
delete p;  //錯誤:NoDtor的析構函數(shù)是刪除的

??合成的拷貝控制成員可能是刪除的
??如果一個類為定義構造函數(shù)忆家,編譯器會為其合成一個默認構造函數(shù)犹菇,對某些類來說,編譯器將這些合成的成員定義為刪除的函數(shù)芽卿。如果一個類有數(shù)據(jù)成員不能默認構造揭芍、拷貝、復制或銷毀卸例,則對應的成員函數(shù)將被定義為刪除的称杨。

??private拷貝控制
??在新標準發(fā)布之前肌毅,類通過將其拷貝構造函數(shù)和拷貝賦值運算符聲明為private的來阻止拷貝。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末姑原,一起剝皮案震驚了整個濱河市悬而,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锭汛,老刑警劉巖笨奠,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異唤殴,居然都是意外死亡艰躺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門眨八,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人左电,你說我怎么就攤上這事廉侧。” “怎么了篓足?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵段誊,是天一觀的道長。 經(jīng)常有香客問我栈拖,道長连舍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任涩哟,我火速辦了婚禮索赏,結果婚禮上,老公的妹妹穿的比我還像新娘贴彼。我一直安慰自己潜腻,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布器仗。 她就那樣靜靜地躺著融涣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪精钮。 梳的紋絲不亂的頭發(fā)上威鹿,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音轨香,去河邊找鬼忽你。 笑死,一個胖子當著我的面吹牛弹沽,可吹牛的內(nèi)容都是我干的檀夹。 我是一名探鬼主播筋粗,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炸渡!你這毒婦竟也來了娜亿?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚌堵,失蹤者是張志新(化名)和其女友劉穎买决,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吼畏,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡督赤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了泻蚊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躲舌。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖性雄,靈堂內(nèi)的尸體忽然破棺而出没卸,到底是詐尸還是另有隱情,我是刑警寧澤秒旋,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布约计,位于F島的核電站,受9級特大地震影響迁筛,放射性物質(zhì)發(fā)生泄漏煤蚌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一细卧、第九天 我趴在偏房一處隱蔽的房頂上張望尉桩。 院中可真熱鬧,春花似錦酒甸、人聲如沸魄健。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沽瘦。三九已至,卻和暖如春农尖,著一層夾襖步出監(jiān)牢的瞬間析恋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工盛卡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留助隧,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像并村,于是被迫代替她去往敵國和親巍实。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

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