学科分类
目录
C++基础

统一的初始化

C++语言中对数据的初始化操作有好几种写法,例如下面的代码都是对整型变量进行初始化:

int n1 = 0;
int n2 = {0};
int n3(0);
int n4{0};

以上代码定义四个整型变量并且都初始化为0,方法繁多,不方便记忆及使用。C++11新标准中,使用花括号完成数据初始化的方法被广泛使用。新标准中将这种初始化的形式称为列表初始化,无论是初始化对象还是为对象赋值,都可以使用列表初始化方式完成。

列表初始化的语法格式如下所示:

类型 对象 = {初值};
类型 对象{初值};

根据列表初始化的语法形式,可以看出上面对整型变量初始化的形式中,对n2、n4通过列表初始化完成了初始化操作。

列表初始化应用于内置类型时,有一个特点:若使用列表初始化并且初始值存在丢失信息的风险时,编译器给出错误提示,若有如下代码:

double d = 3.1415926;
int n1{d}, n2{d}; //错误,使用列表初始化,使用double值对int值初始化时存在丢失数据的风险
int n3(d), n4 = d; // 正确,没有使用列表初始化,发生隐式类型转化,对double值进行了截断

此外,列表初始化还可以初始化动态开辟的数组,范例代码如下所示:

#include <iostream>
using namespace std;
int main()
{
  int *ar_base = new int[5]{1, 2, 3, 4, 5};   //列表初始化给出了数组元素初值
  cout << "array items:";
  for (int i = 0; i < 5; i++)
​    cout << ar_base[i] << " ";
  cout << endl;
  return 0;
}

类对象也可通过列表初始化给出初值,如例1所示。

例1

 1    #include <iostream>
 2    class Base{
 3    public:
 4        Base(int con_n):n(con_n){};
 5        void output(){ cout << n << endl; }
 6    private:
 7        int n;
 8    };
 9    int main()
 10    {
 11        Base *p = new Base[3]{Base(1), Base(2), Base(3)};
 12        for (int i = 0; i < 3; i++)
 13            p[i].output();
 14        system("pause");
 15        return 0;
 16    }

程序运行结果如图1所示。

图1 例1运行结果

例1中定义了指针变量p,指向动态开辟的类对象数组,数组元素通过列表完成了初始化。

点击此处
隐藏目录