Effective C++里有提到,看过的都知道,初始化列表效率>=在函数体里赋值。
但有一点要特别注意,成员变量初始化的顺序取决于声明的顺序,而不是在初始化列表中的顺序。vc不说啥,gcc会报warning。如果遇到初始化有依赖关系的,要特别注意。
struct A
{
int a;
double b;
A() : a(0), b(0.0) {}
A(int a_in, double b_in) : a(a_in), b(b_in) {}
~A() {}
};
// Equivalent version
struct B
{
int a;
double b;
B() { a = 0; b = 0.0; }
B(int a_in, double b_in) { a = a_in; b = b_in; }
~B() {}
};
以上代码是等价的。
然而,如果成员变量的类型是非POD类型,比如自定义类型,那么list initialization的代码会变成struct Member1
{
int val;
// Will not compile if un-commenting the line below
// Member1() = delete;
Member1(int a) : val(a) {}
};
struct Member2
{
double val;
// Will not compile if un-commenting the line below
// Member2() = delete;
Member2(double b) : val(b) {}
};
struct A
{
Member1 m1;
Member2 m2;
A() : m1(), m2() {}
A(int a, double b)
{
m1 = a;
m2 = b;
}
/* Equivalent version:
* A(int a, double b) : m1(), m2() { m1 = a; m2 = b; }
*/
};
所以在A(int a, double b)这个构造函数里等于是做了更多的工作:先default construct m1和m2,然后再做m1和m2的copy initialization。
1 2 3 4 5 6 7 8 9 10 | class A { ... private : int a; public : const int b; float * &c; static const char * d; static double * e; }; |
a b c
b c
b c d e
b c d
b
c
1,const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间。
2,static表示的是静态的。类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。即使没有具体对象,也能调用类的静态成员函数和成员变量。一般类的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。
3,在C++中,static静态成员变量不能在类的内部初始化。在类的内部只是声明,定义必须在类定义体的外部,通常在类的实现文件中初始化,如:double Account::Rate = 2.25;static关键字只能用于类定义体内部的声明中,定义时不能标示为static
4,在C++中,const成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。
const数据成员 只在某个对象生存期内是常量,而对于整个类而言却是可变的 。因为类可以创建多个对象,不同的对象其const数据成员的 值可以不同。所以不能在类的声明中初始化const数据成员,因为类的对象没被创建时,编译器不知道const数据成员的值是什么。
const数据成员的初始化只能在类的构造函数的初始化列表中进行。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现,或者static cosnt。