关于初始化的部分问题(初始化和赋值的区别、列表初始化的方式、类数据成员初始化方式)


初始化和赋值的区别

初始化的含义是床关键变量时赋予其一个初始值,而赋值的含义时把对象的当前值擦除,而已一个新值来替代。


列表初始化

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)。对类内初始值的限制如下:

  1. 放在花括号里
  2. 放在等号右边
  3. 不能使用圆括号

因为我们无法避免这样的情况:

class Widget 
{
    
    
private: 
  typedef int x;
  int z(x);
};

这样的话,就会变为函数声明。

猜你喜欢

转载自blog.csdn.net/Jormungand_V/article/details/112756408