C++11之列表初始化

列表初始化格式

1、C++98/03中的列表初始化格式:

int arr_int[3] = { 1, 2, 3 };
long arr_long[] = { 4, 5, 6 };struct A
{int x;int y;
};
A a = { 1, 2 };

2、C++11中的列表初始化格式:

int arr_int[3] = { 1, 2, 3 };
long arr_long[] = { 4, 5, 6 };struct A
{int x;int y;
};
A a = { 1, 2 };
A b{3, 4}; //C++98/03 error.

列表初始化的使用条件

1、C++98/03标准中对于普通数组和POD类型可以直接使用列表初始化;
2、C++11标准中对于普通数组和聚合类型可以直接使用列表初始化;
3、C++11标准中对于非聚合类型可以通过自定义构造函数的方式使用列表初始化。

// 对于非聚合类型可以通过自定义构造函数的方式使用列表初始化
class A
{public:ST(int m, double n, int p) : a(i), b(j), c(k) {}int a;double b;virtual void func(){}private:int c;
};
A a { 1, 2.5, 2 };//C++11 ok

注意:POD类型是聚合类型的子集。

POD类型的定义

概念

简而言之,一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是一个POD类型。
也就是说,能用memset/memcpy 等函数进行操作的类、结构体就是 POD 类型的数据。

特征

1、is_trival(平凡的)
条件:

如果一个类或者结构体的构造/析构函数、拷贝/移动构造函数、拷贝/移动运算符要么由编译器自动生成,要么被C++11的default修饰,且不能有 虚函数 和 虚基类,则它是平凡的。

判定:

使用std::is_trivial::value 来判断是否“平凡”。

2、is_standard_layout(布局要有序)
条件:

1、普通成员(非静态成员)有相同的访问级别;
2、第一个成员必须是当前类的;(不能是其他类型的成员子对象)
3、只要有父类,普通成员只能在其中一个类中,不可分散;(普通成员需要集中到某一个类中定义)。

判定:

使用std::is_standard_layout::value来判断是否“布局有序”。

参考:
1、https://www.cnblogs.com/zzyoucan/p/3918614.html
2、https://zhuanlan.zhihu.com/p/45545035

聚合类型的定义

1、类型是一个普通数组;
2、类型是一个类(class\struct\union),且
a、无用户自定义的构造函数;
b、无私有或保护的非静态数据成员;
c、无基类;
d、无虚函数;
e、不能有在声明时使用{}或=直接初始化的非静态数据成员。

注意:

聚合类型的定义并非递归的。即当一个类的非静态成员是非聚合类型时,这个类也有可能是聚合类型。

struct A
{int x;double y;
private:int z;
};
A a { 1, 2.5, 1 }; // error, 非静态成员的访问属性不同struct B
{A a;int x;double y;
};
B b{ {}, 1, 2.5 }; // OK, 对于非聚合类A的初始化相当于使用无参构造函数

任意长度的初始化列表

概念:

通过给自定义类型增加一个 以std::initializer_list为参数的 构造函数,让它拥有任意长度初始化的能力。

class Map
{public:Map(std::initializer_list<map<int, int>::value_type> list){for (auto it = list.begin(); it != list.end(); ++it){_data.insert(*it);}}private:std::map<int, int> _data;
};
Map map_ = { { 1, 2 }, { 3, 4 }, { 5, 6 } };

std::initializer_list

1、是一个轻量级的容器类型;
2、std::initializer_list可以接收任意长度的初始化列表,但要求元素必须是同种类型 T(或可转换为 T);
3、它有 3 个成员接口:size()、begin()、end();
4、它只能被整体初始化或赋值。

C++11新特性之列表初始化、POD、聚合类相关推荐

  1. [C++11新特性](24)列表初始化,右值引用,可变参数模板,lambda表达式,包装器

    文章目录 列表初始化 {}初始化 initializer_list auto.nullptr.范围for decltype STL的变化 右值引用 简介 移动构造与移动赋值 完美转发 新的类功能 可变 ...

  2. 【初阶与进阶C++详解】第二十二篇:C++11新特性(列表初始化+变量类型推到+右值引用+新增默认成员函数+可变模板参数+lambda表达式+包装器function_bind)

  3. PotgreSQL 11 新特性之智能分区连接/聚合

    文章目录 智能分区连接 智能分区聚合 PostgreSQL 11 提供了两个分区级别的新功能: 智能分区连接(partition-wise join),对于两个分区方式相同的分区表,如果使用分区键进行 ...

  4. C++ 11 新特性(十四)C++类

    (一)综述:类是我们自己定义的数据类型 设计时要考虑的角度: 站在设计和实现的角度来考虑: 站在使用者的角度考虑: 父类,子类之间的考虑: (二)explicit 首先, C++中的explicit关 ...

  5. [翻译]Adobe Flash Player 11新特性

    Adobe Flash Player 11带来了很多改进,您将在网络上看到更多精彩的内容.就像当年Flash Player 7改变了网络视频,ActionScript 3改变了开发Flash内容的方式 ...

  6. C++11新特性之新类型与初始化

    C++11新特性之新类型与初始化 snoone | 2016-06-23 11:57    浏览量(148)    评论(0)   推荐(0) 数据 这是C++11新特性介绍的第一部分,比较简单易懂, ...

  7. 【C++】C++11新特性列表

    我们学习的标准是C++98,我们知道计算机的知识更新非常快,本文旨在大致了解C++11的新特性,如果想要仔细了解,请阅读<C++Primer中文版 第五版>本文的页码也是这本书的页码,这里 ...

  8. C++11新特性(原封不动转载待查)

    C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...

  9. 深入浅出之C++11新特性

    1. auto类型赋予新含义 1.1 auto类型定义 在之前的 C++ 版本中,auto 关键字用来指明变量的存储类型,它和 static 关键字是相对的.auto 表示变量是自动存储的,这也是编译 ...

最新文章

  1. Python,OpenCV进行直方图反投影
  2. 自学必看篇:从零基础到精通的Python学习路线(附加教程)
  3. flash写保护原理_一种基于flash写保护的防止flash被意外篡改的方法与流程
  4. PHP脚本批量清除nginx缓存的方法
  5. websocket 携带请求头_WebSocket与Nginx的小秘密
  6. URL重写后,在有页面回发时的处理
  7. mysql accountlevel1_mysql---修改表结构
  8. 福建省队集训被虐记——DAY3
  9. Rust: 如何与DLL文件进行交互?
  10. 网络安全实验1——口令攻击和钓鱼攻击
  11. 大唐杯 5G协议与信令 任务六、任务七(24:30-35:00)
  12. 5种常用的相关分析方法
  13. USB和串口的区别是什么?
  14. 高等数学-学习笔记-闻彬
  15. 虚拟钢琴音源插件-GSi Genuine Sounds Vol.I Piano Edition v1.0.2 CE-win
  16. 解决NUC8豆子峡谷装黑苹果键盘错位的设置
  17. 程序员如何防止加班猝死
  18. 创意简约土木黑灰配色PPT模板
  19. 【C语言编程练习】计算三角形的面积
  20. stm32LL库串口空闲中断+DMA接收

热门文章

  1. 技术宅男徐明星“回归”
  2. 《爱情公寓》剧红角色红 演员总差一点点
  3. 【译】10 款国外实用、有趣的 GitHub 简介 README
  4. keil出现大量未知语法错误(系统移植)
  5. 程序员求职:选择大公司还是小公司
  6. SyntaxError: Unexpected end of JSON input (file: C:\Users\admin\Desktop\...)
  7. Python练习——输出10个不重复的英文字母
  8. z-index设置说明
  9. 使用OpenCV测量图像中物体的大小
  10. 写一个函数,将一个字符串中的元音字母复制到另一个字符串,然后输出