一、列表初始化

1)C++11以前,定义初始化的几种不同形式,如下:

  int data = 0;   //赋值初始化

  int data = {0};   //花括号初始化

  int data(0);  //构造初始化

2)C++11以旧语法中花括号初始化形式为基础,设计了列表初始化语法,统一了不同的初始化形式

  a)数据类型 变量{初始化列表}

  //聚合类型

  struct Persion

  {

    char name[64];

    struct Date//成员是聚合类型

    {

      int year;

      int month;

      int day;

    }Age;

  };

  //

  class Student

  {

  public:

    Student(int year,int month,int day) : _year(year),_month(month),_day(day) {}

    friend std::ostream& operator << (std::ostream &os, Student const & s)

    {

      os << s._year << "-" << s._month <<  "-" << s._day;

    }

  private:

    int _year;

    int _month;

    int _day;

  }

  int main()

  {

    int a{1};

    std::cout << a << std::endl;

    double b{1.1};

    std::cout << b << std::endl;

    //聚合类型(任意类型的数组)

    int c[]{1,2,3,4,5};

    copy(c,c + sizeof(c) / sizeof(c[0]),ostream_iterator<decltype(*c)>(cout, " "));

    std::cout << std::endl;

    //

    Persion persion{"张三",2019,11,14};

    std::cout << persion.name << persion.year << persion.day << std::endl;

    Student student{2019,11,14};

    std::cout << student << std::endl;

  }

  聚合类型

  1)任意类型的数组

  2)满足特定条件的类:

    a、无自定义的构造函数

    b、无私有或保护的非静态成员变量

    c、无基类

    d、无虚函数

    e、无通过“=”或者“{}”丰类声明部分被初始化的非静态成员变量

  3)聚合类型的元素或者成员可以是聚合类型也可以是非聚合类型

  4)对聚合类型使用列表初始化,相当于用列表初始化的值作为参数,调用相应的构造函数。

  b)变长初始化列表:initializer_list

  class Num

  {

  public:

    Num(std::initializer_list list)

    {

      for(auto i : list)

      {

        _vector.push_back(i);

      }

    }

    friend std::ostream& operator << (std::ostream &os, Num n)

    {

         //copy(n._vector.begin(),n._vector.end(),ostream_iterator<decltype(n._vector[0]>(os," ");

      for(auto i : n_vector)

      {

        os << i << " " ;

      }

      return os;

    }

  private:

    std::vector<int> _vector;

  }

  int main()

  {

    Num num{1,2,3,4,5,6,7};

    std::cout << num << std::endl;

  }

  initializer_list作为轻量级的列表容器,不但可以用在构造函数中,也可以作为普通函数的参数,传递不定数量的实参,

  相对于传统标准容器,效率更高(轻量级列表容器,仅保存初始化列表元素的引用,而非其副本)

C++11常用特性介绍——列表初始化的更多相关文章

  1. C++11常用特性介绍——auto类型修饰符

    1.C++11常用特性介绍 从本篇开始介绍C++11常用特性,大致分:关键字及新语法.STL容器.多线程.智能指针内存管理,最后讲一下std::bind和std::function 二.关键字和新语法 ...

  2. C++11常用特性介绍——array容器

    std::array是具有固定大小的数组,支持快速随机访问,不能添加或删除元素,定义于头文件<array>中. 一.概要 array是C++11新引入的容器类型,与内置数组相比,array ...

  3. C++11常用特性介绍——decltype关键字

    一.decltype的意义 有时我们只想从表达式的类型推断出要定义的变量类型,但是不想用其值进行初始化的时候,C++11新标准引入了decltype类型说明符,它的作用是选择并返回操作数的数据类型,在 ...

  4. C++11常用特性介绍——左值引用、右值引用

    一.左值.右值 1)左值:可以放在赋值号左侧.可以被赋值的值:左值必须要在内存中有实体. 2)右值:必须放在赋值号右侧.取出值赋值给其它变量:右值可以在内存中也可以在CPU寄存器中. 二.引用 引用是 ...

  5. C++11常用特性介绍——Lambda表达式

    一.C++11采用配对的方括号[]来创建一个匿名函数并执行,如: #include <iostream> int main() { auto func = []{ std::cout &l ...

  6. C++11常用特性介绍——constexpr变量

    一.constexpr变量 1)将变量声明为constexpr类型以便由编译器来验证变量的值是否为一个常量表达式,声明为constexpr的变量一定是一个常量,而且必须用常量表达式来初始化,如: in ...

  7. C++11常用特性介绍——for循环新用法

    一.for循环新用法——基于范围的for循环 for(元素类型 元素对象 : 容器对象) { //遍历 } 1)遍历字符串 std::string str = "hello world&qu ...

  8. C++11常用特性介绍——nullptr关键字及用法

    一.nullptr关键字及用法 1)NULL的二义性 void func(int) {} void func(int*) {} 当函数调用func(NULL)时会执行哪个函数呢? 先看C++对NULL ...

  9. 【转】C++11常用特性的使用经验总结

    出处 http://www.cnblogs.com/feng-sc C++11已经出来很久了,网上也早有很多优秀的C++11新特性的总结文章,在编写本博客之前,博主在工作和学习中学到的关于C++11方 ...

随机推荐

  1. 微信小程序 scroll-view 左右横向滑动没有效果(无法滑动)问题

    小程序组件 scroll-view 中分别有上下竖向滑动和左右横向滑动之分,在这次项目中刚好需要用到横向滑动,但在测试过程中发现横向滑动没有了效果(静止在那里没移动过),经调试发现: 1.scroll ...

  2. windows10桌面突然变灰了

    不靠谱的第三方软件重装系统,装了以后系统有点问题,会隔一段时间变灰 了 windows+ctrl+c 直接就恢复色彩了

  3. 后端分页神器,mybatis pagehelper 在SSM与springboot项目中的使用

    mybatis pagehelper想必大家都耳熟能详了,是java后端用于做分页查询时一款非常好用的分页插件,同时也被人们称为mybatis三剑客之一,下面 就给大家讲讲如何在SSM项目和sprin ...

  4. 普及C组第二题(8.4)

    2266. 古代人的难题 (File IO): input:puzzle.in output:puzzle.out 时间限制: 1000 ms  空间限制: 60000 KB 题目: 门打开了, 里面 ...

  5. 7_1 除法(UVa725)<选择合适的枚举对象>

    如果把数字0到9分配成2个整数(各五位数),现在请你写一支程序找出所有的配对使得第一个数可以整除第二个数,而且商为N(2<=N<=79),也就是:abcde / fghijk = N这里每 ...

  6. 了解 go 的 Context

    go 的 Context 一直对 go 的 Context 一知半解,不了解其用途,因此在这里着重了解一下 go 语言的 Context 飞雪无情的一个博文对 go 的 Context 讲的比较易懂一 ...

  7. Go非缓冲/缓冲/双向/单向通道

    1. 非缓冲和缓冲 package main import ( "fmt" "strconv" ) func main() { /* 非缓冲通道:make(ch ...

  8. iOS 音视频播放

    播放控制切换为: ijkplayer wiki: https://github.com/changsanjiang/SJVideoPlayer/wiki/Use-ijkplayer 播放控制切换为: ...

  9. Java进阶学习(1)之类与对象(下)

    类与对象 函数与调用 函数是通过对象来调用的 this 是成员函数的特殊的固有的本地变量 它表达了调用这个函数的那个对象 调用函数 通过 . 运算符,调用某个对象的函数 在成员函数内部直接调用自己(t ...

  10. JavaScript ES5类 原型 原型链 组合、原型、寄生式继承

    ES5类 原型  原型链 继承 JavaScript中,原型是相对于构造函数(类)的叫法(或者说概念),原型链是相对于构造函数(类)的实例对象的叫法. 对于JavaScript对象,如果在对象自身上找 ...