C++98中,支持在类声明的时候使用等号"="初始化类中静态成员常量,这种声明方式我们称之为"就地"声明。但是C++98要求静态成员必须满足常量性,而且类型必须是整型或者枚举型,而非静态成员变量的初始化则必须在构造函数中进行。如:
class Init{
public:
Init(): a(0){}
Init(int d): a(d){}
private:
int a;
const static int b = 0;
int c = 1; //成员,无法通过编译
static int d = 0; //成员,无法通过编译
static const double e = 1.3; //非整型或者枚举型,无法通过编译
static const char* const f = "e"; //非整型或者枚举型,无法通过编译
};
在C++11中,允许使用等号=或者花括号{}进行就地的非静态成员变量初始化。如:
struct C {
C(int i, int j):c(i),d(j) {};
int c;
int d;
};
struct init {
int a = 1;
string b{"hello"};
C c{1, 3};
};
需要注意的是,初始化列表的效果总是优先于就地初始化的。如
struct C {
C() {};
C(int i):c(i) {};
int c = 2;
};
int main(){
C c1;
C c2(500);
cout << c1.c << endl; //输出2
cout << c2.c << endl; //输出500
return 0;
}
另外对于非常量的静态成员变量,C++11与C++98保持一致,还是要在头文件以外的的位置定义它,这会保证编译时,类静态成员的定义最后只存在于一个目标文件中。如:
struct C {
C() {};
C(int i):c(i) {};
int c = 2;
static int d = 3;//报错 Non-const static data member must be initialized out of line
};
网友评论