沒有學(xué)不會的 C++:禁止成員函數(shù)(disallow functions)

本文將介紹禁止編譯器自動生成某些函數(shù)的2種方法,及在某些場景下(例如嵌入式編程中)计福,禁止析構(gòu)函數(shù)給程序帶來的好處豌鹤。

還記得如何禁止默認(rèn)構(gòu)造函數(shù)嗎,即定義一個帶參數(shù)的構(gòu)造函數(shù)即可鸭廷,如下面的代碼將會編譯失敗

class OpenFile {
public:
    // 定義一個帶參構(gòu)造函數(shù)
    OpenFile(string filename) {/*...*/}
};

int main() {
    OpenFile f; // error: no matching constructor for initialization of 'OpenFile'
}

除此之外枣抱,我們還可以顯示的禁止某些函數(shù)的定義

  1. 在 C++ 03 中,我們可以將這些函數(shù)聲明在 private 作用域中辆床,且不定義它們
  2. 在 C++ 11 中佳晶,提供了 delete 關(guān)鍵字來實現(xiàn)此功能

假設(shè)你有一個文件類 OpenFile,你不希望這類對象互相復(fù)制佛吓,因為這會把文件寫亂宵晚,此時你可以禁止該類的復(fù)制構(gòu)造函數(shù)和賦值操作符,在 C++ 03 中维雇,你可以這樣做

class OpenFile {
private:
    OpenFile(OpenFile& rhs);
    OpenFile& operator=(const OpenFile& rhs);
}淤刃;

C++ 11中是這樣的

class OpenFile {
public:
    OpenFile(OpenFile& rhs) = delete;
    OpenFile& operator=(const OpenFile& rhs) = delete;
};

在某些情況下吱型,如果你不希望繼承來自基類的函數(shù)逸贾,你也可以這樣顯示聲明

class Base {
public:
    void foo();
};

class Derived : public Base {
public:
    void foo() = delete; // 不繼承 foo()
};

int main() {
    Derived d;
    d.foo(); // error: attempt to use a deleted function
}

禁止析構(gòu)函數(shù)

在嵌入式編程中,由于椊蛑停空間比較小的原因铝侵,我們會避開將一些大對象存儲在棧中,而選擇將他們存放在堆中触徐,棧中對象的特點是:當(dāng)對象離開局部空間(函數(shù)或程序塊)咪鲜,存儲在棧中的對象會自動釋放,對象的析構(gòu)函數(shù)會被調(diào)用撞鹉,此時疟丙,如果我們將對象的析構(gòu)函數(shù)定義在 private 域中,即禁止外部釋放對象鸟雏,就可以有效地保護對象不被存儲在棧中享郊。

當(dāng)然,存儲在堆中的對象還是要提供銷毀功能的孝鹊,你可以額外定義一個「自定義的析構(gòu)函數(shù)」炊琉,如下:

class BigBlock {
public:
    BigBlock();
    void destroyMe() {delete this;}
private:
    ~BigBlock() {/*...*/}
};

int main() {
    BigBlock *b = new BigBlock();
    b->destroyMe(); 
}

總結(jié),本文主要介紹了以下內(nèi)容

  1. C++ 11: f() = delete; 使用 delete 關(guān)鍵字
  2. C++ 03: 將函數(shù)聲明在 private 中又活,且不定義它
  3. private 析構(gòu)函數(shù): stay out of stack.

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末苔咪,一起剝皮案震驚了整個濱河市锰悼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悼泌,老刑警劉巖松捉,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異馆里,居然都是意外死亡隘世,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門鸠踪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丙者,“玉大人,你說我怎么就攤上這事营密⌒得剑” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵评汰,是天一觀的道長纷捞。 經(jīng)常有香客問我,道長被去,這世上最難降的妖魔是什么主儡? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮惨缆,結(jié)果婚禮上糜值,老公的妹妹穿的比我還像新娘。我一直安慰自己坯墨,他們只是感情好寂汇,可當(dāng)我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捣染,像睡著了一般骄瓣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耍攘,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天榕栏,我揣著相機與錄音,去河邊找鬼少漆。 笑死,一個胖子當(dāng)著我的面吹牛硼被,可吹牛的內(nèi)容都是我干的示损。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼嚷硫,長吁一口氣:“原來是場噩夢啊……” “哼检访!你這毒婦竟也來了始鱼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤脆贵,失蹤者是張志新(化名)和其女友劉穎医清,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卖氨,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡会烙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了筒捺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柏腻。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖系吭,靈堂內(nèi)的尸體忽然破棺而出五嫂,到底是詐尸還是另有隱情,我是刑警寧澤肯尺,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布沃缘,位于F島的核電站,受9級特大地震影響则吟,放射性物質(zhì)發(fā)生泄漏槐臀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一逾滥、第九天 我趴在偏房一處隱蔽的房頂上張望峰档。 院中可真熱鬧,春花似錦寨昙、人聲如沸讥巡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欢顷。三九已至,卻和暖如春捉蚤,著一層夾襖步出監(jiān)牢的瞬間抬驴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工缆巧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留布持,地道東北人。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓陕悬,卻偏偏與公主長得像题暖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,926評論 2 361

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

  • 1.C和C++的區(qū)別胧卤?C++的特性唯绍?面向?qū)ο缶幊痰暮锰帲?答:c++在c的基礎(chǔ)上增添類,C是一個結(jié)構(gòu)化語言枝誊,它的重...
    杰倫哎呦哎呦閱讀 9,540評論 0 45
  • R摘抄原文 P201 演講要想成功况芒,唯一的準(zhǔn)備方法就是像你正式演講那天一樣大聲說出來。通過事先說出自己演講中要說的...
    SuperBuddy閱讀 591評論 0 0
  • 閱兵 山河地動震山搖叶撒,南岳山下石鼓院绝骚。 文曲不來空談文,文武兼?zhèn)渖n生才痊乾! 將士帳前挑燈練皮壁,不負(fù)男兒熱血情。 ...
    逗霸君閱讀 319評論 1 3
  • 皮囊是用來使用的 不是用來伺候的
    獨舒閱讀 189評論 0 0
  • 葉瀾依 山有木兮木有枝哪审,心悅君兮君不知蛾魄。 葉瀾依,這個甄嬛傳里近乎是最后一個入宮的女子湿滓,卻是我最敬服的女子...
    江藍(lán)藍(lán)閱讀 684評論 0 2