-1

私は効果的なC++を読んでいて、初期化リストの前述の利点の1つを本当に理解できませんでした。私が理解していることから、初期化リストは、特に不要なデフォルトコンストラクターの呼び出しを回避するのにも役立つということです。それで、私がそのような簡単なコード例を作成したことをテストするために

class base
{
public:

    base()
    {
        std::cout << "Default Constructor called \n";
    }
    base (int i)
    {
        std::cout << "Int constructor called \n";
    }
};

class der : public base
{
private:
    base b;
public:
    der(int i):b(i)
    {
        std::cout << "Derived constructor called \n";
    }
};

void main()
{
    der d(12);
}

ここでは、intコンストラクターのみが呼び出され、代わりに基本クラスの両方のコンストラクターが呼び出されると想定していました。誰かがこの概念を明確にしていただけませんか。

4

4 に答える 4

4

問題は、実際には の 2 つのインスタンスがありbase、1 つはメンバーとして、もう 1 つはベースとしてあることです。メンバーに変更するder(int i):base(i),b(i)か、メンバーを削除してください。

于 2013-01-25T00:53:40.380 に答える
1

タイプのメンバーをクラスに追加していることbaseder注意してください。これも構築する必要があります。そのメンバーは、引数を取らないコンストラクターで初期化されています。あなたがおそらく意味していたのは:

class base
{
private:
    int num;
public:

    base()
    {
        std::cout << "Default Constructor called \n";
    }
    base (int i) : num(i)
    {
        std::cout << "Int constructor called \n";
    }
};

class der : public base
{
private:
    //base b;
public:
    der(int i):base(i)
    {
        std::cout << "Derived constructor called \n";
    }
};

void main()
{
    der d(12);
}
于 2013-01-25T00:56:35.400 に答える
1

derbase instancesYlisar が説明したように、 には 2 つの があります。base にはデフォルトのコンストラクターがあるため、コンストラクターで暗黙的に呼び出されます。

また、C++ は以下の 2 つの形式のメイン関数のみをサポートします。C++ にはありませんvoid main()

§3.6.1 主な機能

実装は、メイン関数を事前定義してはなりません。この関数はオーバーロードされません。型 int の戻り値の型を持つ必要がありますが、それ以外の場合、その型は実装定義です。すべての実装は、main の次の定義の両方を許可する必要があります。

int main() { /* ... */ }

int main(int argc, char* argv[]) { /* ... */ }

于 2013-01-25T01:04:50.290 に答える
0

あなたのderには、2つの基本クラスがあり、1つは継承用で、もう1つはb(derのメンバー)です。

于 2013-01-25T01:49:40.277 に答える