1.成员类型
对于一个类,一般有四种成员类型
class MyClass
{
public:
MyClass();
~MyClass();
private:
int a ; 变量(非静态变量)
const int b; 常量(非静态常量) error
static int c; 静态变量
static const int d; 静态常量
};
注:对于非静态常量b,是需要进行初始化 的。
2.初始化
C++98中
常量和变量,需要在构造函数中初始化,静态常量才可以在类内初始化,这里了解一下就行,毕竟一般都是C++11;
在C++11当中,对C++98进行了改进。
常量、变量、静态常量---可以在类内初始化
静态变量 ---不可以在类内初始化。如下
int a =1;
const int b=2;
static int c=3;错误
static const int d=4;
//错误 C2864 MyClass::c: 带有类内初始化表达式的静态 数据成员 必须具有不可变的常量整型类型,
注:报错的意思就是,要在类内对静态成员进行初始化,必须是静态常量(d)才可以,而静态变量(c)不可以.
因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的
静态常量成员是可以在类内声明的
3.初始化方式
在C++11当中,允许在定义类的时候,在类内直接对非静态成员,静态成员常量利用 “=()”和“{ }”进行初始化。如以下
class MyClass
{
public:
MyClass();
~MyClass();
private:
int a1 = 1; //方式一
int a2 = {2}; //方式二
int a3{3}; //方式三
const int b1 = 1;
const int b2 = {2};
const int b3{3};
static int c; //类外初始化
static const int d1 = 1;
static const int d2 = {2};
static const int d3{3};
};
4.初始化列表
可以在构造函数时,对非静态成员使用初始化列表进行初始化,如对a,b的初始化
class MyClass
{
public:
MyClass(int v1,int v2):a(v1),b(v2) {};//初始化列表
~MyClass() {};
private:
int a;
const int b;
static int c; //类外初始化
static const int d ;
};
5.总结
C++11中,
1.非静态常量,非静态变量、静态常量---可以在类内初始化。用=()或{}都可以。静态变量 ---必须类外初始化。
2.非静态常量(const int)必须初始化。类内或者初始化列表 初始化
3.非静态变量(int) 可以不初始化,也可以在类内或者初始化列表 初始化
4.静态常量(static const int )必须类外初始化.
5.静态变量(static int )可以不初始化,也可以类内初始化,不可以用初始化列表