C++11使用{}大括号初始化

您所在的位置:网站首页 用构造函数初始化 C++11使用{}大括号初始化

C++11使用{}大括号初始化

2024-01-11 23:01| 来源: 网络整理| 查看: 265

  在C++11中,使用{}可进行如下各项的初始化:

类成员快速初始化 数组、集合(列表)初始化 自定义类型初始化

  C++11可以将{}初始化器用于任何类型(可以使用等号,也可以不适用),这是一种通用的初始化语法。

集合、函数

  在C++11中,集合(列表)的初始化已经成为C++的一个基本功能,被称为“初始化列表(initializer list)”

示例代码:

int a[] = { 1, 2, 3 }; //C++98支持,C++11支持 int b[]{2, 3, 4}; //C++98不支持,C++11支持 vector c{ 1, 2, 3 }; //C++98不支持,C++11支持 map d = {{ 1, 1.0f }, { 2, 2.0f }, { 3, 3.0f } };//C++98不支持,C++11支持

在C++11中,自动变量和全局变量的初始化方式包括:

等号=加上赋值表达式(assignment-expression),例如:int a=2+3; 等号=加上花括号表达式的初始化列表,例如:int a = {3+4}; 圆括号式的表达式列表(expression-lit),例如:int a(6+8); 花括号式的初始化列表:例如:int a{6+8};

  最后两种形式也可以用于获取堆内存new操作符中,例如:

int* i = new int(1); double* d = new double(1.2f);

  

  标准模板库STL中容器对初始化列表的支持源于头文件中initialize_list类模板的支持。程序员只要#include并声明一个以initialize_List模板类为参数的构造函数,也可以使得自定义类使用列表初始化。

enum Gender{ boy, girl }; class People { public: //initializer_list的构造函数 People(initializer_list ll) { auto iter = ll.begin(); for (; iter != ll.end(); ++iter) { data.push_back(*iter); } } private: vector data; }; //函数的参数列表使用初始化列表 void Fun(initializer_list iv){}

上述代码中,为People类定义了一个使用initializer_list模板类作为参数的构造函数,使用C++11的auto关键字来自动类型推断。 

可以使用{}以如下的方式初始化:

People people = { { "Garfield", boy }, { "HelloKitty", girl } };

上述代码也定义了一个使用initializer_list为参数的函数,也可以使用初始化列表:

Fun({ 1, 2 }); Fun({});//空列表

  同理,类和结构体的成员函数也可以使用初始化列表,包括一些操作符的重载函数。示例代码:

class Mydata { public: Mydata & operator[] (initializer_list input) { for (auto i = input.begin(); i != input.end(); ++i) { idx.push_back(*i); } return *this; } Mydata & operator = (int v) { if (idx.empty() != true) { for (auto i = idx.begin(); i != idx.end(); ++i) { d.resize((*i > d.size()) ? *i : d.size()); d[*i - 1] = v; } idx.clear(); } return *this; } void print() { for (auto i = d.begin(); i != d.end(); ++i) { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3