C++11:list initialization(列表初始化)

2020-01-11  本文已影响0人  fck_13

(1)简单的问题:如何创建一个含有5个int元素的vector,并且里面存储的值是不同的?
在C++11之前,要实现上述的功能,必须先构造一个含有5个元素的vector,然后修改vector的值

std::vector<int> v(5, 0);
v[0] = 1;
v[1] = 3;
v[2] = 3;
v[3] = 2;
v[4] = 10;

当有了列表初始化之后,我们可以这么写

std::vector<int> v{1, 3, 3, 2, 10};

这样是的初始化的工作简便了很多。
(2)语法
列表初始化分为两类:直接列表初始化和拷贝列表初始化

T object { arg1, arg2, ... };                   (1) 
T { arg1, arg2, ... }                           (2) 
new T { arg1, arg2, ... }                       (3) 
Class { T member { arg1, arg2, ... }; };        (4) 
Class::Class() : member{arg1, arg2, ...} {...   (5) 

代码示例:

#include <iostream>
#include <vector>

class Example1
{
  std::vector<int> v2{1, 2, 3, 4, 5};  //(4)
  std::vector<int> v3;
 public:
  Example1():v3{1, 2, 3, 4, 5}{} //(5)
  void print()
  {
    for(auto i : v2)
      std::cout<<i<<" ";
    std::cout<<"\n";
  }
};

int main()
{
  std::vector<int> v1{1, 2, 3, 4, 5};    //(1)
  std::vector<int>{1, 2, 3, 4, 5};         //(2) 这里是一个匿名对象
  auto pV4 = new std::vector<int>{1, 2, 3, 4, 5}; //(3) new 表达式
  return 0;
}
T object = {arg1, arg2, ...};               (6) 
function( { arg1, arg2, ... } )             (7) 
return { arg1, arg2, ... } ;                (8) 
object[ { arg1, arg2, ... } ]               (9) 
object = { arg1, arg2, ... }                (10)    
U( { arg1, arg2, ... } )                    (11)    
Class { T member = { arg1, arg2, ... }; };  (12)    

代码示例:

#include <iostream>
#include <vector>

class Example1
{
  std::vector<int> v2 = {1, 2, 3, 4, 5};    //(12)
  std::vector<int> v3;
 public:
  Example1():v3{1, 2, 3, 4, 5}{} 
  void print()
  {
    for(auto i : v2)
      std::cout<<i<<" ";
    std::cout<<"\n";
  }
};

void func(const vector<int>& v)
{
  for(auto i : v)
      std::cout<<i<<" ";
    std::cout<<"\n";
}

std::vector<int> func2()
{
  return {1, 2, 3, 4, 5};      //(8)
}

int main()
{
  std::vector<int> v1 = {1, 2, 3, 4, 5};  //(6)
  func({1, 2, 3, 4, 5});   //(7)
  std::vector<int> v2;
  v2 = func2();
  return 0;  //(10)
}

note: (9) 和(12)暂时没有想到很恰当的例子。

PS: 在C++11之前,我们可以使用{ }struct 和数组做一些初始化的工作

struct example2
{
  int c;
  int d;
};

struct example
{
  int a;
  double c;
  example2 e;
};

int main()
{
  int a[] = {1, 2, 3, 4, 5};
  example e={1, 0.0, {0, 0}};
  return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读