2013-05-23 5 views
5

定数データメンバを含むクラスに対してデフォルトのコンストラクタがコンパイラによって追加されないのはなぜですか? 私は定数データメンバ 'a'を宣言しており、クラス 'ClassA'のオブジェクトを作成しようとしているときにNo Appropriate Defaultコンストラクタが利用可能であるという点で、以下のコードを参照してください。助けてください。constデータメンバを含むクラスにデフォルトのコンストラクタが存在しない理由

#include "stdafx.h" 
#include <iostream> 
using namespace std; 

class ClassA 
{ 
    private: 
    const int a; 
    public : 
    void print() 
    { 
     cout << "hello world" << endl; 
    } 
}; 

int main() 
{ 
    ClassA obj; 
    obj.print(); 
    return 0; 
} 
+4

'a'を初期化する必要があります。 – chris

+0

他にもコメントがあるにもかかわらず、 'a'の明白な初期化は、デフォルトの初期化子、すなわちint()であり、これはゼロで初期化されます。はい、これは(ほとんど)無意味ですが、デフォルトのコンストラクタでは不可能な理由について誰かが参考にしていますか? – Keith

+0

@Keithそれは単なる言語の選択です。組み込みのデータメンバーは、デフォルトでは初期化されません。 – juanchopanza

答えて

2

初期化後にconst値を変更することはできないので、どのようにデフォルトコンストラクタがその値を選択することができますか。したがって、デフォルトのコンストラクタは作成されません

0

コンストラクタ内のconstメンバーを明示的に初期化しなければならないと思っています。コンストラクタをどこかに設定する必要があります。constであるので、好きな場所に設定できます。 a以来

2

const変数であるタイプintしたがって、CまたはC++のデフォルト値を持っていない、あなたは、静的であることを宣言すると、次のようにコンストラクタを使用せずに、

class ClassA 
{ 
    private: 
    const static int a=10; 
    public : 
    void print() 
    { 
     cout << "hello world" << endl; 
    } 
}; 

int main() 
{ 
    ClassA obj; 
    obj.print(); 
    return 0; 
} 
1

それを初期化しますaの値は未定義です。たとえば、リリースモードで実行されている場合にデバッグで実行される場合、VC++はaの値に異なるデフォルト値を設定します。デバッグで

、VC++ populates uninitialized memory次の値を持つ:

  • 0xCCCCCCCC - 初期化されていないスタックメモリをマークするために、MicrosoftのC++のデバッグランタイムライブラリと多くのDOS環境で使用されます。
  • 0xCDCDCDCD - 通常ます。HeapAlloc(から返された初期化されていないヒープメモリをマークするために、MicrosoftのC/C++デバッグのmalloc()関数で使用される)

だからaあなたのプログラムを初期化しないことにより、それぞれ異なるのconst値を持つことになります時間。

4

C++ 03ルールは、12.6.2/4 [class.base.init]で指定されています。クラスの非スタティックメンバがコンストラクタのメンバ初期化子リストに記述されていない場合は、const修飾子であれば、ユーザが宣言したコンストラクタを持つ非PODクラス型でなければなりません。形成された。暗黙的に定義されたコンストラクタは、空のメンバ初期化子リスト(および空のボディ)で定義されます。この場合、暗黙的に宣言されたデフォルトのコンストラクタが暗黙的に定義されるため、プログラムが不正になります。

C++ 11のルールは同じものになります。メンバ初期化子リストに指定されていない非静的データメンバはで、デフォルトはに初期化されています。 C++ 11 8.5/6 [dcl.init]、 "[...]プログラムがconst修飾型のオブジェクトのデフォルト初期化を呼び出す場合TTは、ユーザー提供のクラス型でなければなりませんデフォルトのコンストラクタです。 "この場合、同じルールになる。

+0

+1を参照してください。 – Keith

関連する問題