C++11之列表初始化

1. 在C++98中,标准允许使用花括号{}来对数组元素进行统一的集合(列表)初始化操作,如:int buf[] = {0};int arr[] = {1,2,3,4,5,6,7,8}; 可是对于自定义的类型,却是无法这样去初始化的,比如STL标准模板库中容器,使用的频率非常之高,如vector,若要初始化其内容,则需要每次进行push_back 或使用迭代器去初始化,这是极其不便的。C++11 中,可以”列表初始化“方式来快速的初始化内置类型或STL中容器。

2.集合(列表)的初始化方式已经成为C++语言的一个基本功能,列表初始化的方式对:内置类型(int、float、double、char等)、数组、自定义的类、函数参数列表、STL标准模板库等都是有效的。

int main(int argc,char **argv)
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10}; //c++98编译通过 c++11编译通过
    int buf[]{11,22,33,44,55,66,77};    //c++98编译失败
    vector<int> _vec= {10,20,30,40,50,60};  //c++98编译失败

    //c++98编译失败
    map<int,std::string> _map{{1,"lxg"},{2,"the answer"},{3,"hello world."}};
    return 0;
}

3. 初始化列表可以在花括号“{}”之前使用等号=,其效果与不带等号的初始化相同。如:`int a{10}` 和 `int a = {10}`。 所以,自动化变量和全局变量的初始化在C++11中被丰富了。比如可以使用以下几种方式来完成初始化操作: ① 等号“=” 加上赋值表达式(assignment_expression)。如:int a = 1+2. ② 等号“=”加上花括号{}的初始化列表。如:int b = {1+3}. ③ 圆括号式的表达式列表。如:int a(1+2). ④ 花括号{}的初始化列表。如:int a{1+3}. ③④两种方式也可以 用new操作符中。比如:`int *p = new int(2); char *c = new char{‘g‘};`

4. 正如2.中所描述,列表初始化方式同样也适用于自定义的类中。因为标准模板库中容器对初始化类别的支持源自于 <initializer_list> 头文件中<initializer_list 类模板的支持。因此,只需要在应用中#include <initializer_list> 头文件,同时声明一个以 initializer_list<T> 模板类为参数的构造函数。

————————————————
版权声明:本文为CSDN博主「此处不归牛顿管」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lixiaogang_theanswer/article/details/82563961

原文地址:https://www.cnblogs.com/xiang-yin/p/12056475.html

时间: 2024-10-07 22:45:46

C++11之列表初始化的相关文章

c++11——列表初始化

1. 使用列表初始化 在c++98/03中,对象的初始化方法有很多种,例如 int ar[3] = {1,2,3}; int arr[] = {1,2,3}; //普通数组 struct A{ int x; struct B{ int y; int z; } b; }a = {1, {3,4}}; //POD类型,可以直接使用memcpy复制的对象 int i = 0; Foo foo = f;//拷贝初始化 int i(0); Foo f(123); //直接初始化 在c++98/03中,普通

C++学习笔记18,C++11中的初始化列表构造函数(二)

C++11中的初始化列表构造函数(Initialize_list Constructors)是将std::initializer_list<T>作为第一个参数的构造函数,并且没有任何其他参数(或者其他参数具有默认值).例如: #include <iostream> #include <initializer_list>//必须包含该头文件 #include <vector> using namespace std; class A { private: ve

C++11列表初始化

列表初始化:1.旧语法中定义了初始化的几种不同形式,如下: int data = 0; //赋值初始化 int data = {0}; //花括号初始化 int data(0); //构造初始化 int data{0}; //花括号初始化 2.C++11以旧语法中花括号初始化形式为基础,设计了列表初始化语法,统一了不同的初始化形式. 数据类型 变量{初始化列表} 1 #include <iostream> 2 #include <iterator> 3 using namespac

C++列表初始化

在C++11中,使用花括号来初始化变量得到全面的应用,也可以用花括号来对变量赋值.当用于内置类型变量时,这种初始化的一个重要特点是如果使用列表初始化且初始值存在丢失信息的风险,编译器将报错. int _tmain(int argc, _TCHAR* argv[]) { long double ld = 3.1415926536; int a{ ld }; int b = { ld }; int c(ld); int d = ld; return 0; } 编译将得到以下错误: (11): err

【共读Primer】51.[6.3]返回类型和return语句--列表初始化返回值 Page203

列表初始化返回值 C++11规定可以以列表初始化的方式来进行返回值的表达. vector<string> process() { if(expected.empty()) return {}; else if(expected == actual) return {"funcationX", "okay"}; else return {"funcationX", expected, actual}; } 主函数main的返回值 非vo

列表初始化 分析initializer_list&lt;T&gt;的实现

列表初始化(1)_统一初始化 1. 统一初始化(Uniform Initialization) (1)在C++11之前,很多程序员特别是初学者对如何初始化一个变量或对象的问题很容易出现困惑.因为可以用小括号.大括号或赋值操作符等多种方式进行初始化. (2)基于这个原因,C++11引入了“统一初始化”的概念.这意味着我们可以使用{}这种通用的语法在任何需要初始化的地方. [实例分析]初始化列表 #include <iostream> #include <vector> #includ

列表初始化

1 int var = 0; 2 int var = {0}; 3 int var {0}; 4 int var(0); 无论是初始化对象还是某些时候为对象赋新值,都可以用这样一组右花括号括起来的初始值. 当用于内置类型的变量时,这种初始化形式有一个重要特点:如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错,也就是说安全性比那些作转换的更高: 1 long double ld = 3.14 2 int a{ld},b={ld};// 错误:没发生转换,因为存在丢失信息的风险 3

11.栈的初始化

????????????????????????????11.栈的初始化 1.栈的概念: 2.满/空栈: ? ? ? ? ? ? ? ? ? ? 1.3:升/降栈: 1.4.栈桢的理解: ? 局部变量是保存在栈中的: Stack.c: 编译和反汇编: ? ? 传递参数: Func1: 保存寄存器的值: Main: Func1: Func2: ? ? ? ?

C++11新特性——初始化列表 initializer_list

破事水: 由于最近数据结构有个实验报告说是要对字符串进行排序,想偷个懒不想一个一个地赋值,虽然可以用strcpy和传入二级指针的形式直接写,但是这样感觉不美观漂亮. 然后就去膜了一下C++11的新特性——初始化列表,概念就不说了,就讲下这东西具体怎么用吧,就是正常的写一个构造函数,然后把参数改为initializer_list<数据类型> &t 如图所示. 可以理解为传入的参数数据被放到了一个储存器t中,利用C++11的auto可以直接遍历这个储存器t,然后把遍历到的值给结构体用.这里