C/C++编程:列表初始化&列表赋值

1059 篇文章 280 订阅

列表初始化

由来

C++在初始化数组时,可以使用下面花括号加初始值的形式:

int arr[] = {1, 2, 3};

在C++中,如有下面这样的类:

class Tester
{
    public:
        Tester(int value):m_value(value * 2){}

    void print(){
        cout << m_value << endl;
    }

private:
    int m_value;
};

那么它的初始化可以写成这样:

Tester tester_array[] = {6, 7, 8, 9, 10};

Tester的构造函数可以被正常的调用

问题是这种方法的运用范围很窄,很多场景都用不了。比如vector

vector<int> int_vector;

它的初始化方法就下面两种:

int_vector.push_back(5);
int_vector.push_back(4);
int_vector.push_back(3);
int_vector.push_back(2);
int_vector.push_back(1);
int int_array[] = {1, 2, 3, 4, 5};

for(int i = 0; i < sizeof(int_array)/sizeof(int_array[0]); ++i)
{
    int_vector.push_back(int_vector[i]);

}

无论哪种方法,都给人一种如鲠在喉的感觉

因此,C++11中扩展了使用花括号初始化变量的应用范围,称这种初始化方式为列表初始化

比如:

vector<int> int_vector = {5, 4, 3, 2, 1};
list<int> int_list = {5, 4, 3, 2, 1};
map<int, const char*> id2Name = {{1,"Zhang"},{2, "Wang"},{3, "Li"}};

另一种写法
下面和写法也合法,和上面的几种写法等价。

vector<int> int_vector{5, 4, 3, 2, 1};
list<int> int_list {5, 4, 3, 2, 1};
map<int, const char*> id2Name{{1,"Zhang"},{2, "Wang"},{3, "Li"}};

使用场景

在使用大括号内的初始值设定项列表初始化变量时,将发生列表初始化。 大括号内的初始值设定项列表可在以下情况中使用:

  • 初始化变量
  • 使用关键字初始化类 new
  • 从函数返回对象
  • 自变量传递给函数
  • 直接初始化中的自变量之一
  • 在非静态数据成员的初始值设定项中
  • 在构造函数初始值设定项列表中
class MyClass {
public:
    MyClass(int myInt, char myChar) {}
private:
    int m_int[]{ 3 };
    char m_char;
};
class MyClassConsumer{
public:
    void set_class(MyClass c) {}
    MyClass get_class() { return MyClass{ 0, '\0' }; }
};
struct MyStruct{
    int my_int;
    char my_char;
    MyClass my_class;
};
int main() {
    MyClass mc1{ 1, 'a' };
    MyClass* mc2 = new MyClass{ 2, 'b' };
    MyClass mc3 = { 3, 'c' };

    MyClassConsumer mcc;
    mcc.set_class(MyClass{ 3, 'c' });
    mcc.set_class({ 4, 'd' });

    MyStruct ms1{ 1, 'a', { 2, 'b' } };
}

使用大括号包围的值列表赋值

{}包围的值列表除了可以用于初始化变量外,还可以用于赋值语句中。

也就是说:

vector<int> vi{1, 2, 3, 4, 5};

也可以:

vector<int> vi;
vi =678910};

和初始化一样,使用{}包围的值列表也有同样的优势:

  • 一个是防止窄化,可以简单的理解为防止精度降低。比如,下面的代码是无法编译通过的:
double pai = 3.1415926;
int pi;

pi = {pai};        //编译错误。
  • 另外,如果{}里的初始化列表为空,编译器会创建一个值初始化的临时量并赋值给赋值对象
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值