只要類型Type
具有默認構造函數,這是正確的。當你聲明模板時你假設了一些關於類型的東西,並不是每個類型都可以在特定模板的構造函數中傳遞。在這裏,對於標準類型和那些具有默認構造函數的東西,一切都會很好。如果使用不提供默認構造函數的類型初始化類Foo
,那將是一個錯誤。
回答你的第二個問題:
如果你已經在命名空間內定義您的變量,它會被初始化爲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),所述對象被設置爲0 (零)的值變換至T;
請注意,枚舉是標量類型。
要值初始化類型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
中間人>一個:-166889576,中間人> B:32767
中間人>一個:-166889576,中間人> 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;
中間人>一個:0,中間人> b:0
中間人>一個:0,中間人> b:3-
只要'Type'具有默認構造函數,或者是內置的,你所做的就是正確的。 – juanchopanza 2013-03-24 21:34:30
寫'a()'可以處理'int','char'等類型。 – Gradient 2013-03-24 21:35:36
是的,它可以寫成'Foo():a(),b(){}' – juanchopanza 2013-03-24 21:36:29