[英]why does my class only work with two constructors c++
這行不通
當我的班級中沒有空白的構造函數時,代碼將不會運行,並導致錯誤,指出該類不存在默認構造函數。
#include <iostream>
class myClass
{
public:
myClass(int val)
:x(val)
{}
private:
int x;
};
int main()
{
myClass random;
return 0;
}
這有效
#include <iostream>
class myClass
{
public:
myClass(int val)
:x(val)
{}
myClass()
{}
private:
int x;
};
int main()
{
myClass random;
return 0;
}
這是因為當您嘗試實例化對象myClass random
,您正在嘗試調用沒有的默認構造函數。
如果將其更改為myClass random(3)
(基本上是嘗試調用您擁有的構造函數),則會看到編譯器不會有問題。
如果要讓myClass random
可以正常編譯,則您的類中必須具有默認構造函數。
在class
(任何構造函數)中聲明構造函數后,編譯器將不會自動為您生成默認構造函數(這就是您所稱的空白構造函數)。
如果您不想實現默認的構造函數(如果只希望使用默認行為,通常是個好主意),則可以告訴編譯器從C ++ 11開始為您生成它。
class myClass {
public:
myClass(int val)
:x(val)
{}
myClass() = default; // the compiler handles the implementation
private:
int x;
};
在第一種情況下,您已經定義了一個參數化的構造函數。 定義構造函數后,編譯器現在不會像以前那樣自動定義默認構造函數。
如果未定義構造函數,則編譯器會自動定義一個默認構造函數,但如果定義了另一個構造函數,則編譯器將不會這樣做。
即在第一種情況下,默認構造函數不存在。 在第二種情況下,您已經定義了一個,因此沒有錯誤。
請參閱默認構造函數 。
如果沒有為類類型提供任何用戶聲明的構造函數,則編譯器將始終將默認構造函數聲明為其類的內聯公共成員。
但是,您的類中聲明了一個構造函數,因此編譯器不會聲明默認構造函數。 您必須自己明確聲明一個人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.