非静态成员的类内初始化
class Mem
{
public:
Mem(int i): m(i){} //初始化列表给m初始化
int m;
};
class Group
{
public:
Group(){}
private:
int data = 1; // 使用"="初始化非静态普通成员,也可以 int data{1};
Mem mem{2}; // 对象成员,创建对象时,可以使用{}来调用构造函数,有参构造
string name{"mike"};
};
列表初始化
C++引入了一个新的初始化方式,称为列表初始化(list initialize),具体的初始化方式如下
int a[]{1,3,5};
int i = {1};
int j{3};
初始化列表可以用于初始化结构体类型,例如:
struct Person
{
string name;
int age;
};
int main()
{
Person p = {"Frank", 25};
cout << p.name << ":" << p.age << endl;
}
其他一些不方便初始化的地方使用,比如vector的初始化,如果不使用这种方式,只能用构造函数来初始化,难以达到效果
vector<int> ivec1(3,5);
vector<int> ivec2={5,5,5};
vector<int> ivec3={1,2,3,4,5,6}; //不适用初始化列表而使用构造函数难以达到效果
防止类型收窄
类型收窄指的是导致数据内容发生变化或者精度丢失的隐式类型转换,使用列表初始化可以防止类型收窄
int main(void)
{
const int x = 1024;
const int y = 10;
char a = x; // 收窄,但可以通过编译
char* b = new char(1024); // 收窄,但可以通过编译
char c = { x }; // err, 收窄,无法通过编译
char d = { y }; // 可以通过编译
unsigned char e{ -1 }; // err,收窄,无法通过编译
float f{ 7 }; // 可以通过编译
int g{ 2.0f }; // err,收窄,无法通过编译
float * h = new float{ 1e48 }; // err,收窄,无法通过编译
return 0;
}