1.快速初始化成员变量
①在C++98的标准
可以在类中使用 “=初始值” 的方式来对类中的成员进行初始化,但是是十分严格的,,如果静态成员不满足常量性,且成员不是整型或枚举类型,是无法初始化的
非静态成员的初始化,在构造函数中进行
②在c++11当中,可以使用= {} 来对非静态成员变量来进行初始化
class Test
{
int a = 10;
double b{ 1.3 };
vector<int> c{ 1,2,3,4,5 };
};
列表初始化和大括号初始化,二者并非等价的
class Test
{
int a = 10;
double b = 1.3 ;
C e{1}; //C e(1) Error
string d{ "Hello" }; //string d( "Hello" ); Error
vector<int> c{ 1,2,3,4,5 };//vector<int> c( 1,2,3,4,5); Error
};
2.初始化列表和就地初始化
我们可以使用就地初始化和初始化列表来对成员变量进行赋值
那么当二者同时使用的时候,结果是什么呢?
class Test
{
public:
Test() { cout << "default " << endl; }
Test(int num, string& str):nNum(num), s(str)
{
}
private:
int nNum = 10;
string s{ "Hello" };
};
Test Defobj;
Defobj.Get();//10 Hello
string a("world");
Test Obj(50, a);
Obj.Get();//50 world
我们可以看出,初始化列表总是后作用于就地初始化的,可以说初始化列表的优先级更大
对于非常量的静态成员变量,还是保持和C++98一样的标准
private:
static int a = 20; //不能过编译
3.非静态成员的sizeof
在C++98标准中,对非静态成员使用sizeof是不允许的。
只能sizeof静态成员或者对象的实例
只可以sizeof(class.staticvar)
或者sizeof(obj.var)
要想通过类获取非静态成员大小必须
sizeof(((class*)0) -> var)
C++11无需这么做,可以直接求取