1 新的关键词nullptr

c++11引入新的关键词nullptr,用于表示空指针,用于替换之前c提供的NULL(最初NULL是定义在stdlib中的宏定义,通常是0)。

2 新的别名定义机制 alias declaration

c++提供了使用typedef定义的别名机制,但是有时候很难理解。为了更好的使用别名机制,c++11提供了新的别名定义机制,类似代码如下:

  // alias declarations
using VInt = int; // type alias
using PInt = int *; // pointer alias
using RInt = int &; // reference alias
using MyFunc = int (*)(void); // function pointer alias VInt i = ;
PInt pi = &i;
RInt ri = i;
MyFunc func = nullptr;

3 自动类型推断关键字auto

c++11扩展了auto的函数,编译器可按照实际的初始化参数推断需要的参数类型,并初始化之。其用法类似下面代码:

// item初始化为val1+val2的结果
auto item = val1 + val2;

需要注意的一点是,auto、const以及引用类型一起使用的时候其语法可能不是简单的类型推断,编译器推断类型的机制可能与我们能想到的简单推断不太一致。也就是说如果需要定义auto引用、auto常量时需要明确指定,否则直接使用auto编译器会简单的使用对应的类型,而直接忽略const和引用的限制。相关简单示例代码如下:

  /* auto specifier */
// a_i is int, a_pi is a pointer to int, a_ri is a reference to int
auto a_i = , *a_pi = &a_i, &a_ri = a_i;
// error like this, for a_f is float while a_d is double
//auto a_f = 0.0f, a_d = 0.0;

4 自动类型推断关键字decltype

c++11提供了新的类型推断关键字decltype,主要用于自动推断表达式类型,但不需要初始化的情况(auto提供了推断类型+初始化)。

// result is any type that expr has.
decltype(expr) result;

与auto自动类型推断相比,decltype的自动类型推断很直接,expr是什么类型,通常decltype返回也是一样的类型。用法如下:

  /*decltype specifier*/
const int ci = , &cr = ci, *cp = &ci;
decltype(ci) x = ;// x has type const int
decltype(cr) y = x;// y has type const int &
decltype(cr) z;// error,z is a reference and must be initialized decltype(cr+) b;// b has type int
decltype(*cp) c;// error, c is a reference and must be initialized int i = ;
decltype(i) d;// d has type int
decltype((i)) e;// error ,e is a reference and must be initialized

需要区分两点,对于有括号的情况、以及指针取值的情况,decltype返回的是左值引用(上面代码中的后两个error)。

5 新的for循环语法,range for

c++本身的for循环需要三个语句,初始化、条件、增量,对于有些操作需要额外写很多代码。针对需要遍历STL容器中的每个元素的情况,可以考虑使用range for。其具体语法如下:

for(declaration:expression)
statement;

比如我们把std::string的字母全部变成小写字母可以这么写:

  /* range for */
using std::string;
string str("UPPER test");
for (auto &c : str)
c = tolower(c);

尤其是配合auto和decltype使用,更可以节省很多代码(相信大家都有使用STL迭代器的经验,代码很长,但功能就是为了遍历)。

需要注意一点,range for在使用时不能向容器中插入或删除元素,只能修改。

6 列表初始化机制 list initialization

结合c++11,变量初始化有以下几种方式:

int x = ;
int x = {}; // list initialization
int x();
int x{}; // list initialization

针对STL模板定义也提供了新的形势,示例代码如下:

    /* vector */
vector<vector<int>> ivec; // list initialization
vector<string> strvec{"a", "bc", "def"};
vector<string> v2{""};
vector<string> v3{};
vector<string> v4{, "s"};

使用大括号的通常是列表初始化,但是某些情况也不是,比如上例中v3、v4实际调用的vector的构造函数(这是编译器做的处理,在初始化列表中的类型和模板类型不匹配时)。

附加说明

本文内容主要是关于 c++ primer 第五版的前4章中涉及c++11内容的整理。

所有代码都在gcc v4.8.1的版本中编译测试过,相关源码可以从我的git下载,url如下:https://git.oschina.net/Tocy/SampleCode.git,位于c++11目录下的cpp_primer_test1.cpp文件中。

c++ primer读书笔记之c++11(一)的更多相关文章

  1. c++ primer读书笔记之c++11(三)

    1 =default构造函数限定符 c++11针对构造函数提供了=default限定符,可以用于显式指定编译器自动生成特定的构造函数.析构或赋值运算函数.参考代码如下: class CtorDftTy ...

  2. c++ primer读书笔记之c++11(四)

    1  带有作用域的枚举 scoped-enumeration 相信大家都用过枚举量,都是不带有作用域的,在头文件中定义需要特别注意不要出现重名的情况.为了解决这种问题,c++11提供了带作用于的枚举. ...

  3. c++ primer读书笔记之c++11(二)

    1 新的STL模板类型,std::initializer_list<T> c++11添加了initializer_list模板类型,用于提供参数是同类型情况的可变长度的参数传递机制,头文件 ...

  4. C++ Primer 读书笔记:第11章 泛型算法

    第11章 泛型算法 1.概述 泛型算法依赖于迭代器,而不是依赖容器,需要指定作用的区间,即[开始,结束),表示的区间,如上所示 此外还需要元素是可比的,如果元素本身是不可比的,那么可以自己定义比较函数 ...

  5. Key Technologies Primer 读书笔记,翻译 --- Struct 学习 1

    原文链接:https://struts.apache.org/primer.html 本来想写成读书笔记的,结果还是变成翻译,谨作记录,学习.   1.HTML -- 见我前面文章 2.Interne ...

  6. c++ primer 读书笔记

    顺序容器:为程序提供控制元素存储和访问顺序的能力,这种顺序与元素加入到容器时的位置相对应,而与元素值无关. 另外还有根据关键字的值来存储元素的容器:有序.无序关联容器. 另外STL还有三种容器适配器, ...

  7. 【读书笔记】2016.11.19 北航 《GDG 谷歌开发者大会》整理

    2016.11.19 周六,我们在 北航参加了<GDG 谷歌开发者大会>,在web专场,聆听了谷歌公司的与会专家的技术分享. 中午免费的午餐,下午精美的下午茶,还有精湛的技术,都是我们队谷 ...

  8. string,vector和array(C++ Primer读书笔记)

    string string是标准库类型,使用时需要包涵头文件,使用using声明. include <string> using std::string; 1.定义和初始化 string ...

  9. 函数(C++ Primer读书笔记)

    C++ Primer 第五版课后题 练习6.32 :下面的函数合法吗?如果合法,说明其功能:如果不合法,修改其中的错误并解释原因. #include <iostream> using na ...

随机推荐

  1. iOS获取真机沙盒文件、获取真机本地数据

    有时我们需要对真机内的数据进行分析,那么如何获取沙盒所有数据文件呢? 1.设备连接到电脑,打开xcode 2.打开window-devices 3.打开后,选择设备名,选择app,导出数据 4.最后拿 ...

  2. 使用 WM_COPYDATA 在进程间共享数据

    开发中有时需要进程间传递数据,比如对于只允许单实例运行的程序,当已有实例运行时,再次打开程序,可能需要向当前运行的实例传递信息进行特殊处理.对于传递少量数据的情况,最简单的就是用SendMessage ...

  3. 【Android】Android实现监听返回键,主键(HOME),菜单键

    目录结构: contents structure [+] 简介 监听 返回键 监听 主键(Home键) 监听 菜单键 一.简介 本篇文章介绍如何在Android中实现监听返回键,主键,菜单键.一般情况 ...

  4. 【java】详解java中的注解(Annotation)

    目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...

  5. Postgresql: UUID的使用

    默认安装的 Postgresql 是不带 UUID 函数的,为了生成一个 UUID,我们必须装载它到数据库中. CREATE EXTENSION "uuid-ossp"; 然后就可 ...

  6. ios app: 使用企业license设置发布app的过程

      ios开发者证书与企业证书的内容,关系,以及ios app 使用企业license设置发布app的过程 iOS是一个非常封闭的系统.授权文件(.mobileprovision)和签名证书文件(.c ...

  7. mac mini 制作fusion drive 的方法

    下载yosemite,格式化磁盘,运行如下命令,制作os x 启动盘   sudo /Applications/Install\ OS\ X\ Yosemite.app/Contents/Resour ...

  8. css中position:fixed实现div居中

    上下左右 居中 代码如下 复制代码 div{ position:fixed; margin:auto; left:0; right:0; top:0; bottom:0; width:200px; h ...

  9. Eclipse安装PlantUML插件

    新技术的诞生和更新,新工具的发现和使用是两件让人开心的事情. 还记得Visio下苦苦的画流程图的时光吗,现在一切都变得so easy,因为有PlantUML! 官网:http://plantuml.c ...

  10. Desugar Scala(17) -- Option和for,以及脑子里发生的事情

    欢迎关注我的新博客地址:http://cuipengfei.me/blog/2014/08/30/options-for/ Scala里的forkeyword是个非常有趣的东西. 能够用来把多层嵌套f ...