只要类型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