1 4 基于范围的for循环在C++03 98中,不同的容器和数组,遍历的方法不尽相同,写法不统一,也不够简洁,而C++11基于范围的for循环以统一、简洁的方式来遍历容器和数组,用起来更方便了。1 4 1 for循环的新用法
类型收窄指的是导致数据内容发生变化或者精度丢失的隐式类型转换。考虑下面这种情况:struct Foo{ Foo(int i) { std::cout << i << std::endl; }};Foo foo(1 2);以上代码在C++中能够正常通过编译
1 任意长度的初始化列表读者可能注意到了,C++11中的stl容器拥有和未显示指定长度的数组一样的初始化能力,代码如下:int arr[] { 1, 2, 3 };std::map<std::string, int> mm ={ { "1", 1 }, {
在C++11中,初始化列表的使用范围被大大增强了。一些模糊的概念也随之而来。上一节,读者已经看到了初始化列表可以被用于一个自定义类型的初始化。但是对于一个自定义类型,初始化列表现在可能有两种执行结果:s
在上面我们已经看到了,对于普通数组和POD类型,C++98 03可以使用初始化列表(initializer list)进行初始化:int i_arr[3] = { 1, 2, 3 };long l_arr[] = { 1, 3, 2, 4 };struct A{ int
我们知道,在C++98 03中的对象初始化方法有很多种,如代码清单1-7所示。代码清单1-7 对象初始化示例 initializer listint i_arr[3] = { 1, 2, 3 }; 普通数组struct A{ int x; stru
在C++98 03中,类模板可以有默认的模板参数,如下:template <typename T, typename U = int, U N = 0>struct Foo{ };但是却不支持函数的默认模板参数:template <typename T = int>
大家都知道,在C++中可以通过typedef重定义一个类型:typedef unsigned int uint_t;被重定义的类型名叫typedef-name。它并不是一个新的类型,仅仅只是原有的类型取了一个新的名字。因此,下面这样将不是合法的
1 2 模板的细节改进C++11改进了编译器的解析规则,尽可能地将多个右尖括号(>)解析成模板参数结束符,方便我们编写模板相关的代码。1 2 1 模板的右尖括号在C++98 03的泛型编程中,模板实例化有一个很烦琐的地
在泛型编程中,可能需要通过参数的运算来得到返回值的类型。考虑下面这个场景:template <typename R, typename T, typename U>R add(T t, U u){ return t+u;}int a = 1; float b = 2 0;
1 ?获知表达式的类型上一节所讲的auto,用于通过一个表达式在编译时确定待定义的变量类型,auto所修饰的变量必须被初始化,编译器需要通过初始化来确定auto所代表的类型,即必须要定义变量。若仅希望得到类型,而
1 1 类型推导C++11引入了auto和decltype关键字实现类型推导,通过这两个关键字不仅能方便地获取复杂的类型,而且还能简化书写,提高编码效率。1 1 1 auto类型推导1 auto关键字的新意义用过C 的读者可能知道,从
本章要讲到的C++11特性可以使程序更简洁易读,也更现代。通过这些新特性,可以更方便和高效地撰写代码,并提高开发效率。用过C 的读者可能觉得C 中的一些特性非常好用,可以让代码更简洁、易读。比如var可以在编
前言第一篇 C++11改进我们的程序第1章 使用C++11让程序更简洁、更现代 21 1 类型推导 21 1 1 auto类型推导 21 1 2 decltype关键字 91 1 3 返回类型后置语法——auto和decltype的结合使用 141 2 模板
为什么要写这本书2011年C++11标准刚发布时,广大C++开发者奔走相告,我也在第一时间看了C++之父Bjarne Stroustrup的C++11 FAQ(http: www stroustrup com C++11FAQ html),虽然只介绍了一部分特性,而且特性
在StackOverflow的最近一次世界性调查中,C++11在所有的编程语言中排名第二, C++11受到程序员的追捧是毫不意外的,因为它就像C++之父Bjarne Stroustrup说的:它看起来就像一门新的语言。C++11新增加了相当多的
[1] 本章内容在 [Stroustrup,2013]的第13~15章有更加详细的描述。[2] 注意把声明(用作接口)和定义(用作实现)区别开来;参见3 1节。[3] 头文件的作用是描述接口和强调逻辑结构;参见3 2节。[4]
程序异常负责报告运行时发生的错误。如果我们能在编译时发现错误,显然效果更好。这是大多数类型系统以及自定义类型接口说明的主要目的。不过,我们也能对其他一些编译时可知的属性做一些简单检查,并以编译器错
使用异常机制通报越界访问错误是函数检查实参的一个示例,此时,因为基本假设,即所谓的前置条件(precondition)没有满足,所以函数将拒绝执行。在正式地说明Vector的下标运算符时,我们应该规定类似于索引值必
让我们重新考虑Vector的例子。对2 3节中的向量,当我们试图访问某个越界的元素时,应该做什么呢?Vector的作者并不知道使用者在面临这种情况时希望如何处理(通常情况下,Vector的作者甚至不知道向量被用在何种程