博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ primer读书笔记之c++11(一)
阅读量:6573 次
发布时间:2019-06-24

本文共 2802 字,大约阅读时间需要 9 分钟。

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 = 99;  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 = 0, *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 = 0, &cr = ci, *cp = &ci;  decltype(ci) x = 0;// 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+0) b;// b has type int  decltype(*cp) c;// error, c is a reference and must be initialized    int i = 100;  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 = 0;int x = {
0}; // list initializationint x(0);int x{
0}; // list initialization

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

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

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

 附加说明

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

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

转载地址:http://mzljo.baihongyu.com/

你可能感兴趣的文章
Map集合案例
查看>>
python3 在不同操作系统安装第三方库方法
查看>>
spark shuffle:分区原理及相关的疑问
查看>>
Laravel5.5 使用第三方Vendor添加注册验证码
查看>>
mysql优化
查看>>
Gradle -help
查看>>
css3做的nav
查看>>
css选择器顺序的小技巧
查看>>
互联网架构师必备技术 Docker仓库与Java应用服务动态发布那些事
查看>>
Intellij IDEA 2018.2 搭建Spring Boot 应用
查看>>
SNMP AGENT函数介绍
查看>>
Git提交到多个远程仓库(多看两个文档)
查看>>
期末大作业
查看>>
[Usaco2005 Open]Disease Manangement 疾病管理 BZOJ1688
查看>>
【Android视图效果】分组列表实现吸顶效果
查看>>
title: postGreSQL 插件 timescaleDB 安装使用 date: 2019-02-14 18:02:23
查看>>
并发容器与框架——并发容器(一)
查看>>
网络编程socket
查看>>
学界 | 伯克利最新研究:用算法解决算法偏差?公平机器学习的延迟影响
查看>>
多文件上传示例源码(默认支持各种类型,包括图片)
查看>>