1 原始字面量

有时候在输出一个路径字符串时,编译器会将其中的部分内容识别成转义字符进行输出,可以用R “xxx(原始字符串)xxx”其中()两边的字符串可以省略。原始字面量R可以直接表示字符串的实际含义,而不需要额外对字符串做转义或连接等操作。

string str2 = R"(D:\hello\world\test.text)";

2 nullptr

在之前的C++中,为指针进行初始化的时候通常用NULL,在C语言中NULL的本质是一个(void*)0,而在C++中NULL的本质就是0,一个int类型值,底层实现为:

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

因为C++中不允许一个void *指针隐式转换为其它类型指针,比如:

void *ptr1 = NULL;
int *ptr2 = ptr1;//错误
int *ptr2 = (int *)ptr1;//正确

C++11没有对这一特性进行修改,而是引入了nullptr专门用于初始化空类型指针,其可以隐式转换为其它类型的指针,从而避免了野指针(没有明确指向的指针)

3 constexpr

const在C++11之前就有,用处在于变量只读以及修饰常量,但要注意两者是不一样的

变量只读:比如函数中我们不希望传入的参数被修改
void func(const int num) 修饰常量:有时提前定义一个常量,并用于描述数组大小
const int a = 20;
int arr[a];

C++11中用constexpr修饰常量表达式,常量表达式指的就是由多个(≥1)常量(值不会改变)组成并且在编译过程中就得到计算结果的表达式。其效率高于运行时计算的非常量表达式,其不需要每次运行都计算

要注意的时是,constexpr不能取代const,在表示常量的时候,两者是相同的,但是在用于变量只读的时候,比如引用传参的时候设置只读属性还是用const,constexpr达不到修饰变量只读的效果。

4 auto自动类型推导

使用auto声明的变量必须要进行初始化,以让编译器推导出它的实际类型,在编译时将auto占位符替换为真正的类型。

auto的使用限制

  • 不能作为函数参数使用。因为只有在函数调用的时候才会给函数参数传递实参,auto要求必须要给修饰的变量赋值,因此二者矛盾。
  • 不能用于类的非静态成员变量的初始化
  • 不能使用auto关键字定义数组
  • 无法使用auto推导出模板参数

auto的应用

  • 用于泛型编程,在使用模板的时候,很多情况下我们不知道变量应该定义为什么类型就用auto
  • 用于stl容器的遍历
#include <map>
int main()
{
map<int, string> person;
map<int, string>::iterator it = person.begin();
for (; it != person.end(); ++it)
{
// do something
}
return 0;
} //简化后为:
map<int, string> person;
// 代码简化
for (auto it = person.begin(); it != person.end(); ++it)
{
// do something
}

5 decltype类型推导

使用auto只能进行初始化变量的推导,而decltype可以进行表达式的推导,其也是在编译阶段实现的

推导规则

  • 表达式为普通变量或者普通表达式或者类表达式,在这种情况下,使用decltype推导出的类型和表达式的类型是一致的。
  • 表达式是函数调用,使用decltype推导出的类型和函数返回值一致。
  • 表达式是一个左值,或者被括号( )包围,使用 decltype推导出的是表达式类型的引用(如果有const、volatile限定符不能忽略)。

6 final和override

C++中增加了final关键字来限制某个类不能被继承,或者某个虚函数不能被重写,如果使用final修饰函数,只能修饰虚函数,并且要把final关键字放到类或者函数的后面。

override关键字确保在派生类中声明的重写函数与基类的虚函数有相同的签名,同时也明确表明将会重写基类的虚函数,这样就可以保证重写的虚函数的正确性,也提高了代码的可读性,和final一样这个关键字要写到方法的后面。使用了override关键字之后,假设在重写过程中因为误操作,写错了函数名或者函数参数或者返回值编译器都会提示语法错误

7 函数模板允许默认参数

8 using

在C++中using用于声明命名空间,使用命名空间也可以防止命名冲突。在程序中声明了命名空间之后,就可以直接使用命名空间中的定义的类了。C++11中用using可以来定义类型的别名,和typedef的效果一样

typedef 旧的类型名 新的类型名;
// 使用举例
typedef unsigned int uint_t; using 新的类型 = 旧的类型;
// 使用举例
using uint_t = int;

其好处体现在函数指针的定义上

// 使用typedef定义函数指针
typedef int(*func_ptr)(int, double); // 使用using定义函数指针
using func_ptr1 = int(*)(int, double);

使用using定义函数指针别名的写法看起来就非常直观了,把别名的名字强制分离到了左边,而把别名对应的实际类型放在了右边,比较清晰,可读性比较好。

但using最主要的特性还是可以通过使用using来为一个模板定义别名,比如:

template <typename T>
using mymap = map<int, T>;

使用typedef重定义类似很方便,但是它有一点限制,比如无法重定义一个模板,比如我们需要一个固定以int类型为key的map,它可以和很多类型的value值进行映射,如果使用typedef这样直接定义就非常麻烦:

typedef map<int, string> m1;
typedef map<int, int> m2;
typedef map<int, double> m3;

9 基于范围的for循环

基本语法

for (declaration : expression)
{
// 循环体
}

在上面的语法格式中declaration表示遍历声明,在遍历过程中,当前被遍历到的元素会被存储到声明的变量中。expression是要遍历的对象,它可以是表达式、容器、数组、初始化列表等。

通常建议以引用的方式进行修改,不仅可以对其进行写操作,而且还避免了每次遍历的拷贝操作。

#include <iostream>
#include <vector>
using namespace std; int main(void)
{
vector<int> t{ 1,2,3,4,5,6 };
cout << "遍历修改之前的容器: ";
for (auto &value : t)
{
cout << value++ << " ";
}
cout << endl << "遍历修改之后的容器: "; for (auto &value : t)
{
cout << value << " ";
}
cout << endl; return 0;
}

对容器的遍历过程中,如果只是读数据,不允许修改元素的值,可以使用const定义保存元素数据的变量,在定义的时候建议使用const auto &,这样相对于const auto效率要更高一些。

#include <iostream>
#include <vector>
using namespace std; int main(void)
{
vector<int> t{ 1,2,3,4,5,6 };
for (const auto& value : t)
{
cout << value << " ";
} return 0;
}

使用普通的for循环方式(基于迭代器)遍历关联性容器, auto自动推导出的是一个迭代器类型,需要使用迭代器的方式取出元素中的键值对(和指针的操作方法相同):

  • it->first
  • it->second

    使用基于范围的for循环遍历关联性容器,auto自动推导出的类型是容器中的value_type,相当于一个对组(std::pair)对象,提取键值对的方式如下:
  • it.first
  • it.second

普通循环与基于范围循环的区别:

对应基于范围的for循环来说,冒号后边的表达式只会被执行一次。在得到遍历对象之后会先确定好迭代的范围,基于这个范围直接进行遍历。如果是普通的for循环,在每次迭代的时候都需要判断是否已经到了结束边界。

10

C++11实用特性1的更多相关文章

  1. ES6相关实用特性

    本文总结ECMAScript6相关实用特性 目录 let和const 箭头函数 class 对象字段 模板字符串 解构赋值 函数参数扩展 迭代器for...of 模块加载 map和weakmap se ...

  2. C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)

    因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...

  3. C++11新特性总结 (二)

    1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; ...

  4. C++11新特性总结 (一)

    1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己写了,看别人写的代码估计都会有些吃力.C++ Primer5是学习C++1 ...

  5. 【转】C++11常用特性的使用经验总结

    出处 http://www.cnblogs.com/feng-sc C++11已经出来很久了,网上也早有很多优秀的C++11新特性的总结文章,在编写本博客之前,博主在工作和学习中学到的关于C++11方 ...

  6. C++ 11 新特性

    C++11新特性:          1.auto          2.nullptr          3.for          4.lambda表达式          5.override ...

  7. [转载] C++11新特性

    C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...

  8. 在C++98基础上学习C++11新特性

    自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...

  9. C++11常用特性的使用经验总结

    转自:http://www.cnblogs.com/feng-sc C++11已经出来很久了,网上也早有很多优秀的C++11新特性的总结文章,在编写本博客之前,博主在工作和学习中学到的关于C++11方 ...

  10. [转]C++11常用特性的使用经验总结

    转载出处 http://www.cnblogs.com/feng-sc C++11已经出来很久了,网上也早有很多优秀的C++11新特性的总结文章,在编写本博客之前,博主在工作和学习中学到的关于C++1 ...

随机推荐

  1. 01Java学习_概述

    概述 目录 概述 三个阶段 概述 历史(了解) Java 重要特点 开发工具 Java 运行机制及运行过程 下载和安装 JDK 配置环境变量 java 快速入门 博客中的图片内容全部采用 github ...

  2. Java Lambda 表达式常见面试问题与解答

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 在本文中,我们将讨论一些重要且常见的 Java Lambda 表达式面试问题和解答 1.什么是 Lambda 表达式? l ...

  3. 一款实用的.NET Core加密解密工具类库

    前言 在我们日常开发工作中,为了数据安全问题对数据加密.解密是必不可少的.加密方式有很多种如常见的AES,RSA,MD5,SAH1,SAH256,DES等,这时候假如我们有一个封装的对应加密解密工具类 ...

  4. 总结--flask部分

    Flask框架的诞生: Flask诞生于2010年,是Armin ronacher(人名)用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架. Flask本身相当于一个内核,其他几 ...

  5. Batrix企业能力库之物流交易域能力建设实践

    简介 Batrix企业能力库,是京东物流战略级项目-技术中台架构升级项目的基础底座.致力于建立企业级业务复用能力平台,依托能力复用业务框架Batrix,通过通用能力/扩展能力的定义及复用,灵活支持业务 ...

  6. 聊一聊Rust的enum

    enum在实际编程中是非常常用的,enum的目的就是为了清晰定义出散落在系统各个角落的相同概念的有限固定值. 一.enum介绍如果是简单定义固定值,我们可以使用常量const.比如 public co ...

  7. 1 HTTP是什么,HTTP不是什么?

    HTTP是什么? HTTP 全程超文本传输协议(HyperText Transfer Protocol). 包含三部分:超文本.传输.协议. 1. 协议 HTTP是一个用在计算机世界里的协议.它使用计 ...

  8. CodeForces - 764C

    C. Timofey and a tree time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  9. 面试官:说一下MySQL主从复制的原理?

    MySQL 主从复制(Master-Slave Replication)是一种数据复制技术,用于在多个数据库服务器之间的数据同步.在主从复制架构中,一个服务器被设置为主服务器(Master),充当数据 ...

  10. 10.elasticsearch集群red恢复损坏的索引

    背景 客户磁盘损坏,修复磁盘后,重启机器,发现elasticsearch启动成功,ES状态正常green,但是历史数据都没有加载进,查看ES存储数据目录,发现数据还在. 解决方案 首先,需要确认ind ...