1 语法改进

1.1 模板表达式中的空格

  • 在c++03 及以前
vector<list<int>>;   //Error
vector<list<int> >; //OK
  • c++11
vector<list<int>>;   //OK

1.2 nullptr 和 std::nullptr_t

  • 在c++03 及以前
void f(int);
void f(void*);
f(0); //call f(int)
f(NULL); //有歧义
  • c++11
f(nullptr);//call f(void*)

nullptr是关键词,其类型是std::nullptr_t

2 auto-自动类型推断

auto i = 42;   //int
double f();
auto d = f(); //double
auto n; //Error
static auto vat = 0.19; vector<string> v;
auto pos = v.begin(); auto f = [](int x)-> bool{return x+1;}

3 for循环

基本形式:

for( decl : coll ){
statement
}

等价于:

for( auto _pos = coll.begin(), _end = coll.end(); _pos != NULL; ++_pos){
decl = * _pos;
statement
}

或者(其中begin()和end()是全局函数):

for( auto _pos = begin(coll), _end = end(coll); _pos != NULL; ++_pos){
decl = * _pos;
statement
}
  • 示例1
for( int i : {2, 3, 4, 5,8} ){
std::cout<< i << std::endl;
}
  • 示例2。使用引用方式,修改容器中的元素。
std::vector<double> vec;
...
for( auto & elem : vec ){
elem *= 3;
}
  • 示例3。结合模板,同时使用const修饰元素。
template < typename T>
void printElements( const T& coll ){
for( const auto& elem : coll ){
std::cout<< elem << std::endl;
}
}
  • 示例3。结合模板,同时使用const修饰元素。
template < typename T>
void printElements( const T& coll ){
for( const auto& elem : coll ){
std::cout<< elem << std::endl;
}
}
  • 示例4。range方式使用for循环,会调用拷贝构造函数。
Get() const{
return m_data;
}
private:
int m_data;
}; ostream& operator<<(ostream& os, const X& x)
{
os << x.Get();
return os;
} int main(){
vector<X> v = {1, 3, 5, 7, 9};
cout << "\nElements:\n";
for (auto x : v)
{
cout << x << ' ';
}
return 0;
}

输出:

X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor. Elements:
X copy ctor.
1 X copy ctor.
3 X copy ctor.
5 X copy ctor.
7 X copy ctor.
9

为了防止调用拷贝构造函数,提高下率,加上引用。

    for (auto &x : v)
{
cout << x << ' ';
}

执行输出:

X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor. Elements:
1 3 5 7 9

发现已经不调用拷贝构造函数了。

  • 反面示例。在for循环中,不能显示调用(使用explicit)类型转换函数:
class C  {
public :
explicit C( const std::string & s); //显示转换
...
}; int main(){
std::vector<std::string> vs;
for( const C& elem : vs ){
std::cout << elem << std::endl;
}
}

报错。去掉“explicit”后,可正常运行。

invalid initialization of reference of type ‘const C&’ from expression of type ‘std::__cxx11::basic_string<char>’

4 字符串

  • 原始字符串

在字符串前面加上关键字R,表示这是一个原始字符串。

下面这两个是等效的。

    "\\\\n"
R"\\n"

下面这两个也是等效的。

    R"nc(a\
b\nc()"
)nc";
"nc(a\\\n b\\nc()\"\n )nc";
  • 编码的字符串

使用编码前缀制定字符串编码。如下

    L"hello"    // 定义wchar_t编码的字符串

前缀有以下几种:

- u8表示UTF-8编码。

- u表示char16_t

- U表示char32_t

- L表示宽字符集,类型wchar_t

5 强枚举类型

c++11中的枚举类型如下所示:

enum class Salutation : char { mr, ms, co, none };
  • 与int类型之间显示转换是不允许的。
  • 使用 Salutation::mr 方式引用枚举类型。
  • 可以显示的指定一个后台类型,如上例中的char。如果不显示指定,默认是int类型。

    待续。。。

C++11 带来的新特性 (1)的更多相关文章

  1. C++11 带来的新特性 (4)—— 匿名函数(Lambdas)

    1 语法 Lambdas并不是新概念,在其它语言中已经烂大街了.直接进入主题,先看语法: [ captures ] ( params ) specifiers exception attr -> ...

  2. C++11 带来的新特性 (3)—— 关键字noexcept

    1 关键字noexcept 从C++11开始,我们能看到很多代码当中都有关键字noexcept.比如下面就是std::initializer_list的默认构造函数,其中使用了noexcept. co ...

  3. C++11 带来的新特性 (2)—— 统一初始化(Uniform Initialization)

    1 统一初始化(Uniform Initialization) 在C++ 11之前,所有对象的初始化方式是不同的,经常让写代码的我们感到困惑.C++ 11努力创造一个统一的初始化方式. 其语法是使用{ ...

  4. (数据科学学习手札139)geopandas 0.11版本重要新特性一览

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在几天前,geopandas ...

  5. Mysql8.0.11简介,新特性

    MySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8 ...

  6. 发布倒计时!JDK11为我们带来哪些新特性?

    今年7月底,JDK11已经进入了Rampdown Phase Two阶段,这标志着该版本所有特性已经被冻结,不会有新的JEP会加入版本中. 这一阶段将会修复P1–P2级BUG,之后,JDK11预定于今 ...

  7. Git 2.7: 一个新的带来许多新特性和性能提升的主要版本

    在2.6版本发布两个月之后,Git 2.7发布.该版本带来了许多新特性以及性能的提升. 本文选取了Git 2.7带来的主要变化: git remote支持get-url子命令,可以显示指定远端的URL ...

  8. kafka 幂等生产者及事务(kafka0.11之后版本新特性)

    1. 幂等性设计1.1 引入目的生产者重复生产消息.生产者进行retry会产生重试时,会重复产生消息.有了幂等性之后,在进行retry重试时,只会生成一个消息. 1.2 幂等性实现1.2.1 PID ...

  9. Xcode8 带来的新特性和坑

    Xcode8新特性 Interface Builder 随着14年的iPhone6和6P出来之后,iPhone的屏幕尺寸也越来越多,屏幕适配是一个需要解决的问题,以后不一定苹果又出什么尺寸的iPhon ...

随机推荐

  1. Jenkins安装后无法安装插件

    处理方法 Jenkins -- 管理插件 -- 高级 -- 升级站点 将URL 中的https 改为 http

  2. 【实用Windows双系统一键备份还原工具】Winclone Pro for Mac

    [简介] 今天和大家分享最新的 Winclone Pro 7.3.3 Mac 版本,这是一款Mac上强大易用的Windows分区备份还原工具,类似于Windows上的一键Ghost,能够将 PC 上的 ...

  3. 使Python走向Effective系列目录

    Effective以一词,并不单单局限于执行速度层面的高效率,同时有着令代码易于阅读.易于测试且易于维护等意思,此外,它还蕴藏着易于扩展.易于修改和易于多人协作等更为高阶的理念.如果能够通过一些具体的 ...

  4. 0. Java虚拟机系列备忘预览图

    打算把Java虚拟机这块单独弄一个主题出来,做做备忘,结构如图所示: 后面还有一部分待更新...

  5. TCP和UDP的优缺点及区别

    1.TCP是什么? TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TCP的优点: 可靠,稳定 TCP的可靠体 ...

  6. C++预编译头文件 – stdafx.h

    预编译头文件的由来 也许请教了别的高手之后,他们会告诉你,这是预编译头,必须包含.可是,这到底是为什么呢?预编译头有什么用呢? 咱们从头文件的编译原理讲起.其实头文件并不神秘,其在编译时的作用,就是把 ...

  7. 隧道6in4 和隧道6to4(GNS3)

    隧道6in4实验配置 拓扑图 Device Interface IP Address(IPv6) R1 F 0/0 10.1.81.1 F 0/1 2001:db8:cafe:81::10 R2 F ...

  8. robot framework

    一.步骤 1.创建工程和测试套件 2.创建测试案例 3.写脚本,运行案例 4.查看运行结果 report报告主要是概括性的报告,总结案例执行情况.log报告是更为详细的案例步骤的报告. 二.RIDE工 ...

  9. 有关mysql索引

    1.首先我们需要明确一下什么是索引以及为什么要使用索引: 索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构.在生产环境中,对于数据库我们最常进行的是查询的操作,而当我们的数据非 ...

  10. ubuntu16.04 安装vscode

    1.通过官方PPA安装Ubuntu make sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make sudo apt-get update su ...