C++中列表初始化的使用细节和问题

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值