1

私はこの質問に答えています:集合体とポッド ユーザー定義のデフォルトコンストラクターを持つC ++のクラスのオブジェクトが、そのデータメンバーの一部のみが初期化されている場合、残りのデータメンバーは値が初期化されますか?以下は、コンパイルエラーが発生したプログラムです。

#include <iostream>
using namespace std;

class A {
public:
    A() {
        i=10;
        f = 10.0f;
        c = 45;
        d = 10.0;
    }

    void show() {
        cout << i << "\t" << f << "\t" << c << "\t" << d<<"\n";
    }

private:
    int i;
    float f;
    char c;
    double d;
};

int main() {
    A a={20,20.0f};
    a.show();
}
4

2 に答える 2

3

private非静的データメンバーがあるため、クラスは集計として適格ではありません。

アグリゲートは、ユーザー提供のコンストラクター(12.1)、非静的データメンバー用のブレースまたはイコールイニシャライザー(9.2)、プライベートまたは保護された非静的データメンバー(条項11)、基本クラスなし(条項10)、および仮想関数なし(10.3)。

編集:

非集約クラスのオブジェクトの場合、一部のデータメンバーのみが初期化されると、残りは値が初期化されます(0が割り当てられます)?

ルールは次のように指定されます。

C ++ 11 8.5.4リスト初期化[dcl.init.list]パラ3:

オブジェクトまたはタイプTの参照のリスト初期化は、次のように定義されます
。—初期化子リストに要素がなく、Tがデフォルトのコンストラクターを持つクラス型である場合、オブジェクトは値で初期化されます。
—それ以外の場合、Tがアグリゲートの場合、アグリゲートの初期化が実行されます(8.5.1)。
—それ以外の場合、Tがstd :: initializer_listの特殊化である場合、initializer_listオブジェクトは以下に説明するように構築され、同じタイプのクラスからのオブジェクトの初期化のルールに従ってオブジェクトを初期化するために使用されます(8.5)。
—それ以外の場合、Tがクラス型の場合、コンストラクターが考慮されます。該当するコンストラクターが列挙され、オーバーロード解決(13.3、13.3.1.7)によって最適なコンストラクターが選択されます。引数のいずれかを変換するためにナローイング変換(以下を参照)が必要な場合、プログラムの形式が正しくありません。
—それ以外の場合、Tが参照型の場合、Tによって参照される型の一時的なprvalueはリストで初期化され、参照はその一時的なものにバインドされます。[注:通常どおり、参照型が非const型への左辺値参照である場合、バインディングは失敗し、プログラムは不正な形式になります。—end note]
—それ以外の場合、イニシャライザリストに単一の要素がある場合、オブジェクトまたはリファレンスはその要素から初期化されます。要素をTに変換するためにナローイング変換(以下を参照)が必要な場合、プログラムの形式が正しくありません。
—それ以外の場合、初期化子リストに要素がない場合、オブジェクトは値で初期化されます。
—それ以外の場合、プログラムの形式が正しくありません。

あなたのプログラムは、言及されたシナリオのいずれにも当てはまらないため、不正なケースに当てはまります。

于 2012-09-26T07:06:51.327 に答える
0

次のような4つの引数でコンストラクターを宣言する必要があります

A(int i = 10, float f = 10.0f, int c = 45, float d = 10.0f):
i(i), f(f), c(c), d(d)
{

}

これで、変数を中かっこで初期化できます

于 2012-09-26T07:06:09.877 に答える