域名做網(wǎng)站出售合法嗎最強(qiáng)大的搜索引擎
問題
我們知道,在C++中,如果沒有為一個(gè)類顯式定義構(gòu)造函數(shù),那么編譯器會(huì)為我們隱式地定義一個(gè)默認(rèn)構(gòu)造函數(shù)。那么,你有沒有想過,這個(gè)隱式定義的默認(rèn)構(gòu)造函數(shù)(合成的默認(rèn)構(gòu)造函數(shù))的訪問權(quán)限是什么呢?它跟類中其他成員的權(quán)限有沒有什么關(guān)系呢?
比如,下面這個(gè)類,它的所有成員都是 private
的,那么它的合成的默認(rèn)構(gòu)造函數(shù)會(huì)是 private
的嗎?
class MyClass {
// 編譯器為MyClass合成的默認(rèn)構(gòu)造函數(shù)的訪問控制權(quán)限是什么呢?
private:int val1;double val2;void info();
};
分析
事實(shí)上,通過編碼很容易找到答案:
class MyClass {
// 編譯器為MyClass合成的默認(rèn)構(gòu)造函數(shù)的訪問控制權(quán)限是什么呢?
private:int val1;double val2;void info();
};void func() {MyClass obj; // 正常編譯,不會(huì)報(bào)錯(cuò),說明默認(rèn)構(gòu)造函數(shù)是public的
}
從上面的代碼可以看出,實(shí)際上編譯器合成的默認(rèn)構(gòu)造函數(shù)永遠(yuǎn)都是 public
權(quán)限的,無(wú)論其中的成員是什么訪問權(quán)限。
關(guān)于這一點(diǎn),cppreference 中也有清晰的說明:
If no user-declared constructors of any kind are provided for a class type, the compiler will always declare a default constructor as an inline public member of its class.
如果用戶沒有為一個(gè)類提供任意種類的構(gòu)造器,編譯器總是會(huì)為該類聲明一個(gè)作為內(nèi)聯(lián)公共成員的默認(rèn)構(gòu)造器。
拓展
事實(shí)上,不僅僅是合成的默認(rèn)構(gòu)造函數(shù),包括編譯器合成的拷貝控制成員(合成的拷貝構(gòu)造函數(shù)、合成的移動(dòng)構(gòu)造函數(shù)、合成的賦值運(yùn)算符和合成的析構(gòu)函數(shù)),也都是永遠(yuǎn)是 public
的。
參考
- Are synthesized copy control members always public?
- Default constructors