初始化和赋值的区别
初始化的含义是床关键变量时赋予其一个初始值,而赋值的含义时把对象的当前值擦除,而已一个新值来替代。
列表初始化
C++定义了初始化的好几种不同形式,通常定义一个变量并初始化的方式有以下四种:
int x = 0;
int x = {
0};
int x{
0};
int x(0);
使用花括号来初始化变量在C++11新标准中得到了全面应用。这种初始化的形式被程为列表初始化(list initialization)。现在,无论是初始化对象,还是某些时候为对象赋新值,都可以使用列表初始化。
值得注意的是,当用于内置类型的变量时,如果使用列表初始化且初始值存在丢失信息的风险,则编译器将报错:
long double ld = 3.1415926536;
int a{
ld}, b = {
ld}; // 错误:转换未执行,因为存在丢失信息的危险
int c(ld), d = ld; // 正确:转换执行,且确实丢失了部分值
使用 long double 的值初始化 int 变量时可能丢失数据,所以编译器拒绝了 a 和 b 的初始化请求。其中,至少 ld 的小数部分会丢失掉,而且某些情况下 int 也可能存不下 ld 的整数部分。
类数据成员
C++11标准规定,可以为数据成员提供一个类内初始值(in-class initializer)。对类内初始值的限制如下:
- 放在花括号里
- 放在等号右边
- 不能使用圆括号
因为我们无法避免这样的情况:
class Widget
{
private:
typedef int x;
int z(x);
};
这样的话,就会变为函数声明。