C++中的初始化列表

4 篇文章 0 订阅

C++11扩大了列表初始化的适用范围,使其可以用于所有内置类型和用户定义的类型(即类对象)。

1、当列表初始化用于内置类型的变量时,这种初始化形式有一个重要的特点:如果我们使用列表初始化且初始化值存在丢失信息的风险,则编译器将报错。也就是说在使用列表初始化时编译器将禁止将变量类型进行缩窄转换,即不能将宽的变量类型通过列表初始化的形式初始化给窄的变量。例子如下:

#include <iostream>

using namespace std;

int main()
{
    int i = 3;
    double d = 3.14;

    char c1{ i };//int转化成char
    short a{ i };//int转化成short

    char c2{ d };//double转化成char
    short c3{ d };//double转化成short
    float f{ d };//double转化成float

    system("pause");
    return 0;
}

在VS2015中编译结果如下:

在g++中编译结果如下:

从上面可以看出,在VS中会报错,而在g++中只是给出警告。

2、对于列表初始化内置类型的变量,编译器虽然禁止将变量类型进行缩窄转换。但是对于字面值常量,如果在较窄类型的取值范围内,部分类型的字面值常量可以用来列表初始化较窄的类型。例子如下:

#include <iostream>

using namespace std;

int main()
{
    //66是int类型的,因为对于十进制的字面值默认是带符号数,
    //其类型是int、long、long long中尺寸最小的那个
    //66.6是double类型,因为默认浮点型字面值是一个double
    char c1{ 66 };  //int转化成char
    short s{ 66 }; //int转化成short

    char c2{ 66.6 }; //double转化成char
    int i{ 66.6 }; //double转化成int
    float f{ 66.6 };//double转化成float

    //扩展
    double d1{ 66 }; //int转化成double
    double d2{'c'};//char转化成double
    double d3{66.6f};//float转化成double

    system("pause");
    return 0;
}

在VS2015中编译结果如下:

从上面结果可知:对于浮点型字面常量不允许列表初始化更窄的类型变量,即使都是浮点型;而对于整型字面值常量可以列表初始化更窄的类型变量。对于整型字面值常量、字符型字面值常量可以列表初始化double型变量,在3中我们将看到用int型变量不能列表初始化double类型变量。对于float型字面值常量可以列表初始化double型变量,这和3中一致。

3、在《C++ primer plus》中P796页中:列表初始化允许转换为更宽的类型。但实验中发现列表初始化并不是允许所有的窄类型转化成宽类型变量。例子如下:

#include <iostream>

using namespace std;

int main()
{
    char c = 'c';
    short s = 3;
    int i = 3;
    float f = 3.14f;

    int i1{ s };//short转换成int
    int i2{ c };//char转换成int
    double d1{ c };//char转换成double
    double d2{ s };//short转换成double
    double d3{ i };	//int转换成double

    double d4{ f };//float转换成double
    int64_t it{ f };//float转换成int64_t(8byte)

    system("pause");
    return 0;
}

在VS2015中编译结果如下:

从结果可以看出使用列表初始化时,只允许窄整型向宽整型、窄浮点型向更宽的浮点型转换。窄整型不能向更宽的浮点型转换,窄浮点型也不能向更宽的整型转换。

4、总结

总结以上,可以得出结论如下:

    在使用列表初始化初始内置类型的变量时:

         1)使用了列表初始化,将禁止将任何内置类型的变量进行缩窄转换。

         2)对于使用字面值常量列表初始化内置类型的变量时,对于整型字面值常量可以缩窄成整型变量类型。浮点型字面值量

               不能缩窄成整型变量类型和浮点变量类型。

         3)使用列表初始化内置类型变量时,只允许窄整型变量向宽整型变量、窄浮点型变量向更宽的浮点型变量转换。窄整型变

               量不能向更宽的浮点型变量转换,窄浮点型变量也不能向更宽的整型变量转换。但是对于字面值常量,窄整型的字面值

               常量可以向宽整型的浮点型变量转换。

 

====》》》对于字面值常量的类型,可以参考《C++ primer》P35页

====》》》对于列表初始化,可以参考《C++ primer》P39页和《C++ primer plus》P796页

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值