C++11——類

使用 = default 生成默認(rèn)構(gòu)造函數(shù)

在新標(biāo)準(zhǔn)下草戈,如果我們想要一個(gè)默認(rèn)構(gòu)造函數(shù),我們可以在參數(shù)列表的后面添加= default來要求編譯器為我們自動(dòng)生成一個(gè)默認(rèn)構(gòu)造函數(shù)椒丧。= default可以和類內(nèi)部的聲明或者類外部的定義一起出現(xiàn)慢蜓。與任何其他函數(shù)一樣亿絮,如果= default出現(xiàn)在類體內(nèi),則默認(rèn)構(gòu)造函數(shù)將被內(nèi)聯(lián)岭粤;如果它出現(xiàn)在類外的定義中惜索,則默認(rèn)情況下不會(huì)內(nèi)聯(lián)。

Code:
    class Sales_data{
        Sales_data() = default;  // the default constructor and is inlined
        Sales_data(const std::string &s): bookNo(s) { }
    private:
        std::string bookNo;
    };

如果= default能工作剃浇,那么就要求類的成員變量必須具有默認(rèn)的初始化器(如:內(nèi)置類型int巾兆,doublestring等虎囚、其他具有默認(rèn)構(gòu)造函數(shù)的類角塑。)。如果某個(gè)類的成員變量不支持默認(rèn)初始化器對(duì)其進(jìn)行默認(rèn)初始化淘讥,那么必須顯示編寫構(gòu)造函數(shù)來完成各個(gè)成員變量的初始化圃伶。

類類型(Class Type)成員的類內(nèi)初始化器

下面我們以一個(gè)例子來說明。我們除了定義Screen類,還將定義一個(gè)窗口管理器類Window_mgr窒朋,它表示給定顯示器上的Screen集合搀罢。這個(gè)類將有一個(gè)Screen向量,其中每個(gè)元素代表一個(gè)特定的Screen對(duì)象侥猩。默認(rèn)情況下榔至,我們希望我們的Window_mgr類有一個(gè)默認(rèn)構(gòu)造函數(shù)來實(shí)現(xiàn)對(duì)Screen向量進(jìn)行初始化。 在新標(biāo)準(zhǔn)下欺劳,最佳的實(shí)現(xiàn)方式是使用類內(nèi)初始化器:

Code:
    class Window_mgr {
    private:
        // Screens this Window_mgr is tracking
        // by default, a Window_mgr has one standard sized blank Screen
        std::vector<Screen> screens{Screen(24, 80, ' ') };
};

當(dāng)我們初始化類類型的成員時(shí)唧取,我們?cè)跒樵摮蓡T類型的構(gòu)造函數(shù)提供參數(shù)。在這種情況下划提,我們使用具有單個(gè)元素的初始化器列表來初始化vector成員枫弟。該初始化器列表包含一個(gè)Screen值,該值傳遞給vector <Screen>構(gòu)造函數(shù)以創(chuàng)建單元素向量鹏往。該值由Screen構(gòu)造函數(shù)創(chuàng)建媒区,該構(gòu)造函數(shù)采用兩個(gè)大小參數(shù)和一個(gè)字符來創(chuàng)建給定大小的空白屏幕。
正如我們所看到的掸犬,類內(nèi)初始化器必須使用初始化的形式(我們?cè)诔跏蓟?code>Screen的數(shù)據(jù)成員時(shí)使用的方式)或使用花括號(hào)的初始化器列表形式(就像我們對(duì)screens所做的那樣)。

委托構(gòu)造函數(shù)

新標(biāo)準(zhǔn)擴(kuò)展了構(gòu)造函數(shù)初始值設(shè)定項(xiàng)的使用绪爸,以便讓我們定義所謂的委托構(gòu)造函數(shù)湾碎。委托構(gòu)造函數(shù)使用其自己的類中的另一個(gè)構(gòu)造函數(shù)來執(zhí)行其初始化。它將一些(或全部)工作“委托”給另一個(gè)構(gòu)造函數(shù)奠货。
與任何其他構(gòu)造函數(shù)一樣介褥,委托構(gòu)造函數(shù)具有成員初始化列表和函數(shù)體。在委托構(gòu)造函數(shù)中递惋,成員初始化列表具有單個(gè)條目柔滔,該條目是類本身的名稱。與其他成員初始值設(shè)定項(xiàng)一樣萍虽,該類的名稱后跟帶括號(hào)的參數(shù)列表睛廊。參數(shù)列表必須與類中的另一個(gè)構(gòu)造函數(shù)匹配。

Code:
    class Sales_data {
    public:
        // nondelegating constructor initializes members from corresponding arguments
        Sales_data(std::string s, unsigned cnt, double price):
                bookNo(s), units_sold(cnt), revenue(cnt*price) { }
        // remaining constructors all delegate to another constructor
        Sales_data(): Sales_data("", 0, 0) {}
        Sales_data(std::string s): Sales_data(s, 0,0) {}
        Sales_data(std::istream &is): Sales_data(){ read(is, *this); }
    private:
        std::string bookNo;
        unsigned units_sold;
        double revenue;
    };

Sales_data中杉编,除了一個(gè)構(gòu)造函數(shù)之外的所有構(gòu)造函數(shù)都委托他們的工作超全。第一個(gè)構(gòu)造函數(shù)接受三個(gè)參數(shù),使用這些參數(shù)初始化數(shù)據(jù)成員邓馒,并且沒有進(jìn)一步的工作嘶朱。我們還定義了一個(gè)默認(rèn)構(gòu)造函數(shù),該函數(shù)委托三參數(shù)的構(gòu)造函數(shù)來實(shí)現(xiàn)自己的初始化光酣,而且該構(gòu)造函數(shù)也沒有做其他的工作疏遏。接受字符串的構(gòu)造函數(shù)也將自己的初始化工作委托給三參數(shù)版本。
接受參數(shù)std::istream的構(gòu)造函數(shù)也是委托構(gòu)造函數(shù)。它將自己的初始化工作委托給默認(rèn)構(gòu)造函數(shù)财异,后者又委托給三參數(shù)構(gòu)造函數(shù)倘零。一旦這些構(gòu)造函數(shù)完成它們的工作,就會(huì)運(yùn)行istream和構(gòu)造函數(shù)的主體代碼宝当。它的構(gòu)造函數(shù)體調(diào)用read函數(shù)來讀取給定的istream视事。
當(dāng)一個(gè)構(gòu)造函數(shù)將初始化工作委托給另一個(gè)構(gòu)造函數(shù)時(shí),被委托的構(gòu)造函數(shù)的初始化器列表和函數(shù)體都會(huì)運(yùn)行庆揩。在Sales_data中俐东,被委托的構(gòu)造函數(shù)的函數(shù)體剛好為空。如果委托構(gòu)造函數(shù)的函數(shù)體中有代碼订晌,則該代碼在被委托的構(gòu)造函數(shù)返回之后才會(huì)運(yùn)行虏辫。

constexpr構(gòu)造函數(shù)

雖然構(gòu)造函數(shù)不能是const,但是文字類(literal class)中的構(gòu)造函數(shù)可以是constexpr函數(shù)锈拨。實(shí)際上砌庄,文字類必須提供至少一個(gè)constexpr構(gòu)造函數(shù)。
constexpr構(gòu)造函數(shù)可以以= default的形式進(jìn)行聲明奕枢。然而constexpr構(gòu)造函數(shù)需要同時(shí)滿足構(gòu)造函數(shù)的條件(它可以沒有return語(yǔ)句)和constexpr函數(shù)的條件(它可以擁有的唯一可執(zhí)行語(yǔ)句是return語(yǔ)句)娄昆。所以constexpr構(gòu)造函數(shù)的函數(shù)體通常是空的。我們通過在函數(shù)聲明前加上關(guān)鍵字constexpr來定義一個(gè)constexpr構(gòu)造函數(shù)缝彬。

Code:
    class Debug {
    public:
        constexpr Debug(bool b = true): hw(b), io(b), other(b) { }
        constexpr Debug(bool h, bool i, bool o):
                      hw(h), io(i), other(o) { }
        constexpr bool any() { return hw || io || other; }
        void set_io(bool b) { io = b; }
        void set_hw(bool b) { hw = b; }
        void set_other(bool b) { hw = b; }
    private:
        bool hw;      // hardware errors other than IO errors
        bool io;      // IO errors
        bool other;   // other errors
};

constexpr構(gòu)造函數(shù)必須初始化每個(gè)數(shù)據(jù)成員萌焰。初始值設(shè)定項(xiàng)必須使用constexpr構(gòu)造函數(shù)或者是常量表達(dá)式。
constexpr構(gòu)造函數(shù)用于生成constexpr類型的對(duì)象以及constexpr函數(shù)中的參數(shù)或返回類型谷浅。

Code:
    constexpr Debug io_sub(false, true, false);   // debugging IO
    if (io_sub.any())    // equivalent to if(true)
        cerr << "print appropriate error messages" << endl;
    constexpr Debug prod(false);   // no debugging during production
    if (prod.any())      // equivalent to if(false)
        cerr << "print an error message" << endl;

參考文獻(xiàn)

[1] Lippman S B , Josée Lajoie, Moo B E . C++ Primer (5th Edition)[J]. 2013.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扒俯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子一疯,更是在濱河造成了極大的恐慌撼玄,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墩邀,死亡現(xiàn)場(chǎng)離奇詭異掌猛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)眉睹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門留潦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辣往,你說我怎么就攤上這事兔院。” “怎么了站削?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵坊萝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)十偶,這世上最難降的妖魔是什么菩鲜? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮惦积,結(jié)果婚禮上接校,老公的妹妹穿的比我還像新娘。我一直安慰自己狮崩,他們只是感情好蛛勉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著睦柴,像睡著了一般诽凌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坦敌,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天侣诵,我揣著相機(jī)與錄音,去河邊找鬼狱窘。 笑死杜顺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蘸炸。 我是一名探鬼主播哑舒,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼幻馁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起越锈,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤仗嗦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后甘凭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稀拐,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年丹弱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了德撬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡躲胳,死狀恐怖蜓洪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坯苹,我是刑警寧澤隆檀,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響恐仑,放射性物質(zhì)發(fā)生泄漏泉坐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一裳仆、第九天 我趴在偏房一處隱蔽的房頂上張望腕让。 院中可真熱鬧,春花似錦歧斟、人聲如沸纯丸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)液南。三九已至,卻和暖如春勾徽,著一層夾襖步出監(jiān)牢的瞬間滑凉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工喘帚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畅姊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓吹由,卻偏偏與公主長(zhǎng)得像若未,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子倾鲫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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