10
#include<iostream>
using namespace std;

class A {
public:
    int i;
};

int main() {
  const A aa;  //This is wrong, I can't compile it! The implicitly-defined constructor does not initialize ‘int A::i’
}

私が使うとき

class A {
public:
  A() {}
  int i;
};

これで結構です!コンプできます!暗黙的に定義されたコンストラクターを使用するとコンパイルできないのはなぜですか?

4

5 に答える 5

9

暗黙的に定義されたコンストラクターが機能しないのはなぜですか?

C++ 標準では次のように規定されているためです。

[dcl.init]パラグラフ 7: プログラムが const 修飾された型のオブジェクトの既定の初期化を呼び出す場合、ユーザー提供の既定のコンストラクターを持つクラス型にする必要がありますTT

これにより、const後で初期化できない初期化されていないデータを含むオブジェクトを作成しないことが保証されます。

const 修飾されたオブジェクトを初期化するには、ユーザー提供のデフォルト コンストラクターを用意するか、初期化子を使用する必要があります。

const A aa = A();

ここで、オブジェクトaaは値初期化オブジェクトである式A()で初期化されます。型の既定のコンストラクターがない場合、値の初期化によって値がゼロに設定されるため、既定のコンストラクターがなくてもクラス型を値で初期化できます。

ただし、標準のルールは厳しすぎます。データ メンバーがない場合や、すべてのデータ メンバーに適切なデフォルト コンストラクターがある場合でも、暗黙的に定義されたコンストラクターの使用が禁止されているため、変更を提案している標準に反する欠陥レポートがあります。 を参照してください。問題253

于 2013-10-01T09:06:41.093 に答える
2

使用しているコンパイラについては述べていません。VS2012 でこれを試してみたところ、警告C4269が表示されました。

これが問題である理由aaは、 const. コンストラクターを定義していないため、デフォルトのコンストラクターが使用され、何でもかまいませんi。また、変更することもできません ( aaconst であるため)。

コンストラクタを定義すると、 の初期化に満足していると見なされますi。ただし、この場合、実際には動作を変更していません。

このMSDNページから

このクラスのインスタンスはスタック上に生成されるため、m_data の初期値は何でもかまいません。また、const インスタンスであるため、m_data の値を変更することはできません。

于 2013-10-01T08:54:55.030 に答える
0

初期化されていないためiです。

class A 
{ 
    public:
    A()
    {
        i =0;
    }
    int i;
};

「暗黙のコンストラクター」とは、自動的に生成されるコンストラクターを意味し、 の値を初期化できないことを認識するため、エラーを生成しますi。これは、引数なしのコンストラクター、コピー コンストラクター、または (C++11 以降) 移動コンストラクターのいずれかです。

于 2013-10-01T08:41:43.400 に答える