首页 > 编程语言 > 详细

C++11:05列表初始化

时间:2020-04-25 00:25:51      阅读:63      评论:0      收藏:0      [点我收藏+]

列表初始化(list initalization)

0、课前秀

  • C++98/03对于不同类型(数组,结构体,类)的初始化,有不同的方法
int i_arr[3]={1,2,3};//普通数组  initializer list

struct A
{
    int x;
    struct B
    {
        int i;
        int j;
    }b;
}a={1,{2,3}};//POD类型

//拷贝初始化(copy-initialization)
int i=0;
class Foo
{
    public:
    Foo(int){}
}foo=123;  //需要拷贝构造函数
//直接初始化(direct-initialization)
int j(10);
Foo bar(123);

1、统一的初始化

  • int a5 = {3}; int a6 {3};//C++98/03不具备,C++11可以直接在变量名后面跟上初始化列表
  • Foo a3 = {123}; //虽然用了=,但仍然是列表初始化
  • 注意:在初始化时,{}前面的等于号是否书写对初始化行为没有影响

2、列表初始化的使用细节

  • 什么时候认为是聚合类型
struct Foo
{
	int x;
    double y;
    int z;
    Foo(int,int){}
};
Foo foo {1,2.5,1};//error  【无法将Foo看做一个聚合类型】
  • 还是有点坑,没有完全get到

3.1、任意长度的 初始化列表

3.2、std::initializer_list的一些细节

4、防止类型收窄

  • 类型收窄:是导致数据内容发生变化或者精度丢失的隐式类型转换。
struct Foo
{
    Foo(int i) {std::cout<<i<<std::endl;}
};

Foo foo(1.2); //能正常编译,但i却不能完整地保存一个浮点型的数据
  • 隐式类型转换中,遇到类型收窄的情况,初始化列表就不会允许这种转换发生,但不同的编译器情况不太一样。

ReadMe

  • 20200423第1版:参考《深入应用C++11》
    • 没太学好

C++11:05列表初始化

原文:https://www.cnblogs.com/fewolflion/p/12770686.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!