![](/img/trans.png)
[英]Should the deleted default constructor be in Public or Private?
[英]two default Constructor, one in public and one in private
我的問題是關於 OOP(C++) 中的構造函數。 當我將類中的默認構造函數定義為 private 並且當我在 main 中將該類的對象初始化為默認值時,就會發生默認構造函數不可訪問的錯誤。 沒關系。 但是隨后我也在 Public 部分創建了默認參數構造函數,當我再次在 main 中初始化對象時,就會發生對函數重載的模棱兩可的調用。 所以我的問題是,如果不能從 main 訪問私有構造函數,那么編譯器應該調用公共部分中的構造函數,這是默認參數構造函數。 請回答為什么會發生這種情況。
是否允許程序的某個范圍訪問函數和/或實例化類類型由編譯器在執行重載解析后決定。 這意味着可用的構造函數不會被它們的private
或public
可見性“過濾”。
在您的場景中,這在查看main
函數時可能沒有直接意義,您似乎從中實例化了相關類的對象。 但是想象一下,您使用該類的成員函數創建了該類的一個實例:在這里, private
成員和public
成員都是可見的,編譯器將無法決定應該采用哪一個。
作為旁注,如果您不希望您的類由默認構造= delete
創建,請選擇= delete
它。 此外,一個默認構造函數和一個帶有默認單個參數的構造函數當然可以重構為兩個構造函數,例如使用類內初始化器。
例如上課
#include "iostream"
class Type
{
private:
Type()
{
std::cout<<"Private Default";
}
public:
Type()
{
std::cout<<"Public Default";
}
};
int main()
{
Type obj;
}
這里兩個默認構造函數都在Type::Type()
范圍內你不能像這樣重載,即沒有私有范圍或公共范圍都在Type
范圍內所以你不能根據 c++ 重載規則重載它。
以上代碼的輸出:
main.cpp:11:5: error: ‘Type::Type()’ cannot be overloaded
Type()
^~~~
main.cpp:6:5: error: with ‘Type::Type()’
Type()
^~~~
main.cpp: In function ‘int main()’:
main.cpp:19:10: error: ‘Type::Type()’ is private within this context
Type obj;
^~~
main.cpp:6:5: note: declared private here
Type()
^~~~
如果您對c++11
感到滿意,則可以刪除構造函數,例如
class Type
{
public:
Type() = delete;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.