小古銀的官方網站(完整教程):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"
。