C++中列表初始化的使用细节和问题
在 C++11中,可将列表初始化语法用于类吗?可以,只要提供与某个构造函数的参数列表匹配的内容,并用大括号将它们括起:
Stock hot_tip = {"Derivatives plus plus",100,45.0};
Stock jock{"Sport Age Storage, Inc");
Stock temp {};
在前两个声明中,用大括号括起的列表与下面的构造函数匹配:
Stock::Stock(const std::string & co,long n = 0,double pr = 0.0);
因此,将使用该构造函数来创建这两个对象。创建对象jock时,第二和第三个参数将为默认值0和 0.0。第三个声明与默认构造函数匹配,因此将使用该构造函数创建对象temp。
另外,C++11还提供了名为 std:initialize_list 的类,可将其用作函数参数或方法参数的类型。这个类可表示任意长度的列表,只要所有列表项的类型都相同或可转换为相同的类型。
使用初始化列表主要是考虑性能问题,对于内置类型,如int,float等,使用初始化列表和构造函数体内初始化差别不大,但对于类类型来说,最好使用初始化列表。参见【0voice C++】
除了III中说明的性能原因之外,有些情况下初始化列表是不可或缺的:
1、常量成员*,*引用类型成员:这两种成员变量只能在定义时初始化,而不能重写赋值,所以要写在初始化列表中。
2、没有默认构造函数的类类型成员。由上面的例子可以看出,使用初始化列表不用调用类类型成员的默认构造函数来初始化,而是直接使用拷贝构造函数初始化。
初始化列表中初始化成员的顺序是按照成员变量声明的顺序完成的,而不是以初始化列表中的顺序。
#include<iostream>
using namespace std;
class Test1 {
public:
Test1(int a):j(a), i(j) {} //i未定义
int i;
int j;
};
int main() {
Test1 t1(100);
cout << t1.i << " " << t1.j << endl;
return 0;
}