Type
タイプにデフォルトのコンストラクターがある限り、これは正しいです。テンプレートを宣言するとき、型についていくつかのことを想定していますが、特定のテンプレートのコンストラクターですべての型を渡すことができるわけではありません。ここでは、すべてが標準タイプとデフォルトのコンストラクターを持つタイプで問題ありません。Foo
デフォルトのコンストラクターを提供しない独自の型で クラスを初期化すると、エラーになります。
2番目の問題に答えるには:
名前空間スコープで変数を定義した場合、値は0に初期化されます。
enum SomeEnum {
EValue1 = 1,
EValue2 = 4,
};
SomeEnum e; // e is 0
int i; // i is 0
int main()
{
cout << e << " " << i; //prints 0 0
}
の列挙子の値e
とは異なる値を持つ可能性があることに驚かないでください。SomeEnum
各列挙型には基礎となる整数型(、、、、などint
)short
がlong
あり、その列挙型のオブジェクトの可能な値のセットは、基礎となる積分型が持つ値のセットです。列挙型は、いくつかの値に便利な名前を付けて新しい型を作成するための単なる方法ですが、列挙型の値のセットによって列挙型の値を制限することはありません。
タイプTのオブジェクトをゼロ初期化するということは、次のことを意味します
。— Tがスカラータイプ(3.9)の場合、オブジェクトはTに変換された値0(ゼロ)に設定されます。
列挙はスカラー型であることに注意してください。
タイプTのオブジェクトを値初期化するということは、次のことを意味します。
—Tがクラスタイプの
場合何とか—Tが非ユニオンクラスタイプの
場合何とか— Tが配列型の場合、何とか何とか—それ以外の場合、オブジェクトはゼロです。 -初期化
typedef enum {a,b,c,d} EnumType;
template <typename Type>
class Foo
{
public:
Foo() {} // <---- "Member 'b' was no initialized in this constructor"
public:
Type a;
EnumType b;
};
/*
*
*/
int main(int argc, char** argv) {
Foo<int> fo;
std::cout<<std::endl<<"fo.a:"<<fo.a<<",fo.b:"<<fo.b<<std::endl;
EnumType e=d;
fo.b=d;
std::cout<<std::endl<<"fo.a:"<<fo.a<<",fo.b:"<<fo.b<<std::endl;
Foo<int>* go=new Foo<int>;
std::cout<<std::endl<<"go->a:"<<go->a<<",go->b:"<<go->b<<std::endl;
go->b=d;
std::cout<<std::endl<<"go->a:"<<go->a<<",go->b:"<<go->b<<std::endl;
fo.a:-137090040、fo.b:32767
fo.a:-137090040、fo.b:3
go-> a:-166889576、go-> b:32767
go-> a:-166889576、go-> b:3
今:
Foo<int>* go=new Foo<int>();
std::cout<<std::endl<<"go->a:"<<go->a<<",go->b:"<<go->b<<std::endl;
go->b=d;
std::cout<<std::endl<<"go->a:"<<go->a<<",go->b:"<<go->b<<std::endl;
go-> a:0、go-> b:0
go-> a:0、go-> b:3