C++入門教程(六十一):簡述繼承中的構造函數

小古銀的官方網站(完整教程):http://www.xiaoguyin.com/
C++入門教程視頻:https://www.bilibili.com/video/av20868986/

目錄

我們知道,構造函數不會被繼承到派生類。在上面的示例代碼中,由於類u32stringex沒有寫明構造函數,那麼,編譯器就會給它添加一個默認的構造函數。跟普通的類不一樣的是,普通的類的默認構造函數,除了給成員變量分配內存以外,什麼都不幹;而派生類的構造函數,除了給成員變量分配內存以外,還會調用基類的無參數構造函數,這樣才能確保基類的成員變量能夠正確地初始化。

如果基類沒有無參數的構造函數,而且派生類不寫構造函數時,那麼編譯器爲派生類添加默認構造函數時,找不到基類的無參數的構造函數,接下來就會報錯。

由於派生類必須要調用基類的構造函數,因此這個時候就要明確寫出派生類的構造函數並且調用基類的構造函數。

接下來就要說明如下調用基類構造函數。

基礎示例

#include <iostream>
#include <string>

class u32stringex : public std::u32string
{
public:
    u32stringex(void);
    u32stringex(std::size_t n, char32_t c);
};

int main(void)
{
    u32stringex text1; // aaaaa
    u32stringex text2(10, 'b'); // bbbbbbbbbb
    std::cout << "字符串1的字符數:" << text1.size() << std::endl;
    std::cout << "字符串2的字符數:" << text2.size() << std::endl;

    return 0;
}

u32stringex::u32stringex(void)
    : std::u32string(5, 'a')
{
}

u32stringex::u32stringex(std::size_t n, char32_t c)
    : std::u32string(n, c)
{
}

輸出結果:

字符串1的字符數:5
字符串2的字符數:10

基礎講解

調用基類的構造函數是寫在初始化列表中的。u32stringex的無參數構造函數調用了基類的std::u32string(5, 'a'),那麼u32stringex text1;中的text1的值就是"aaaaa";而u32stringex調用的也是基類的std::u32string(n, c),那麼u32stringex text2(10, 'b');中的text2的值就是"bbbbbbbbbb"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章