簡體   English   中英

為什么我的課程只能與兩個構造函數一起使用c ++

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM