C++11 中的几个新特性

C++11的标准已经确定,除了增加了不少库函数外,在语法方便也得到了许多增强。其中如下几个语法就是我比较喜欢的:

自动类型推导auto

现在c++终于在编译器级别支持类似C#的var关键字了,在c++里的关键字是auto,基本用法如下:

auto i = 0;        //int

auto c = ‘c‘;    //char

auto s = "hello world";    //const char*

auto关键字的一个很直观的好处是我们可以简化stl容器遍历里的那个iterator了:

for(auto it = v.begin(); it != v.end(); it++)

{

cout << *it << endl;

}

Lambda 表达式

Lambda 表达式的主要用来构造匿名函数,它可以替换绝大部分场景的仿函数(感觉把刚刚引入STL库的std::bind也顺手给秒了),并且有更好的可读性。一个简单的示例如下:

auto k = [](int x, int y)
{ return x + y; };

cout << k(3, 2) << endl;

可以看到,它的基本语法形式为: [capture] (parameters) {body},后两部分和C#的匿名函数的语法非常,但最前面的 [capture] 的作用是什么呢?它是用来引用表达式外的局部变量的,例如:

int i1 = 0, i2 = 3;

auto k = [&i1, &i2] () { i1 = 3; i2 = 5; };

cout << i1 << " " << i2 << endl;

除了是前面所述的普通局部变量外,还可以是如下特殊符号:

  • =    所有局部变量,以按值的方式传递(包括this指针)
  • &    所有局部变量,以按引用的方式传递(包括this指针)
  • this this指针

Range-based for-loop

这个其实就是类似C#里面的foreach,不过它并没有引入新关键字,而是直接用的for

int p[8] = {2, 3, 5, 7, 11, 13, 17, 19};

for (auto& i: p)

{

printf("%d ", i);

}

除了支持数组外,它也支持stl中的迭代器遍历,for_each函数基本上可以下岗了。至于它的原理,可以参考这篇文章

枚举类

在C语言中,枚举等同于一个数字常量,编译器并没有对它做过多的处理,在C++11中,引入了enum class以替换枚举,它的定义方式如下:

enum class Color { Red, Blue};

enum class Fruit { Banana, Apple};

除了多加了一个class外,没有别的变化,但它定义的枚举功能和C#中的枚举相似。和C语言的传统枚举相比,主要有如下两个区别:

  1. 强类型的语法检查
  2. 枚举名称只需要在class范围内唯一

强类型的语法检查可以有效防止枚举之间的非法转换和比较,Color::Red == Fruit::Banana之类的判断无法编译通过。

而枚举名称只需要在class范围内唯一则有效缩短了枚举的长度,对于Color枚举,在C语言中,为了防止歧义和命名冲突,往往需要定义为Color_Red、Color_Blue的形式。

静态断言static_assert

静态断言主要提供了在代码中实现编译期可以确定的断言,如果出错则直接以编译错误的形式显示出来,从而加强程序的健壮性。这个其实就是以前的boost.static_assert,不过在编译器的支持下变得更加友好了。示例如下:

static_assert(sizeof(int) == 4, "int needs to be 4 bytes to use this code");

密闭类和密闭方法

C++11中也引入了类似C# seal关键字的方式实现密闭类和密闭方法,以阻止对象继承、方法重载。不过它的关键字是final,和java类似。

final类

class Base final

{

};

class Derived : public Base //继承密闭类,语法错误

{

};

final方法

class Base

{

virtual void A() final;

};

class Derived : public Base

{

virtual void A(); //重写密闭方法,编译出错

};

显式覆盖

对于虚函数的重写,在c++ 11中可以通过关键字显式覆盖,从而获得更严格的语法检查。

class Base

{

virtual void A(float=0.0);

virtual void B() const;

virtual void C();

void D();

};

class Derived: public Base

{

virtual void A(int=0) override; //定义不一致,编译错误

virtual void B() override;        //返回类型不是const,编译错误

virtual void C() override;        //正确

void D() override;                //不是虚函数,编译错误

};

PS:我倒觉得这个语法检查应该默认就加上,通过关键字显式去掉检查,而不是像这样显式打开检查。万恶的向上兼容呀。

其它

其它还有几个语法我也很喜欢,如取消字符串转义、委托构造函数、deleted和defaulted成员函数、统一的初始化语法等,但这些在VC里面还不支持,无法实现跨平台开发,暂时就不介绍了。

时间: 2024-10-22 11:32:21

C++11 中的几个新特性的相关文章

C++11中的有趣的新特性(constexpr ) (Range-based for loop)

#include <iostream> #include<stdexcept> using namespace std; //constexpr keyword constexpr int sqare(int tmp) { return tmp*tmp; } int main() { int myArray[sqare(2)]={1,2,3,4}; //Range-based for loop for(int  &tmp : myArray) { tmp++; } for(

浅析Android 5.0中多媒体相关的新特性

本文来源于本人在所属公司内部分享的一次培训内容,由于100%是AOSP开源内容,所以应该可以分享出来给大家. Android L是在今年2014年6月的Google I/O开发者大会上正式推出的,其中包含了诸多改进,包括新的Material Design交互设计,卡片式风格的通知栏,对64位和ART的支持等等,本文则重点关注一些多媒体相关的新特性. 由于Android L发布的时间仅有半年,无论国内还是国外的相关资料比较匮乏,很多内容本人只能是在Android developer网站中对L版本的

Visual Studio 2015 RC中的ASP.NET新特性和问题修正

(此文章同时发表在本人微信公众号"dotNET每日精华文章") 微软在Build大会上发布了Visual Studio 2015 RC,这也预示着Visual Studio 2015及其背后框架的功能特性已经确定,我们也可以来看看和之前的CTP到底有什么区别. 在Build大会宣布发布Visual Studio 2015 RC之后,微软的Web开发和工具团队在其博客上发表了一篇介绍Visual Studio 2015 RC新特性和问题修正的文章.同VS2015 RC伴随发布的是.NET

Java 9 中的 9 个新特性

Java 8 发布三年多之后,即将快到2017年7月下一个版本发布的日期了. 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它的更新. 这里有九个令人兴奋的新功能将与 Java 9 一起发布. 1. Java 平台级模块系统 Java 9 的定义功能是一套全新的模块系统.当代码库越来越大,创建复杂,盘根错节的"意大利面条式代码"的几率呈指数级的增长.这时候就得面对两个基础的问题: 很难真正地对代码进行封装, 而系统并没有对不同部分(也就是 JAR 文件)之间的依赖

Oracle12c 中RAC功能增强新特性之ASM&amp;amp;Grid

1.    自动存储管理(ASM)方面的增强 1.1.   Flex ASM 在典型的网格架构安装中,每个节点有自己的ASM实例运行并扮演该节点上数据库的存储容器的角色,对这种安装配置,存在单点失败的风险.例如,如果该节点上的ASM实例出现问题或失败,那么,运行在该节点上的数据库和实例都将会被影响.为了避免ASM实例的单点失败,Oracle12c 提供一个flex ASM特性.Flex ASM总体来说是个不同的概念和架构,其中,只需要几个ASM实例运行在簇中的一组服务器上,但一个节点上的ASM实

.NET Framework 2.0中的数据访问新特性

1. 异步数据访问 ? 支持异步数据编程 ? SqlConnection – BeginOpen – EndOpen ? SqlCommand – BeginExecuteNonQuery – BeginExecuteReader – BeginExecuteXmlReader – EndExecuteNonQuery – EndExecuteReader – EndExecuteXmlReader 2. 多活动结果集(MARS) ? 在 SQL Server 2005 中支持多活动结果集 ?

C++11 标准新特性:Defaulted 和 Deleted 函数

前两天写的铁字中提到了C++的删除函数,今天特地去网上查了查,转载了一篇不错的文章... 转载自 http://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/index.html C++11 标准新特性:Defaulted 和 Deleted 函数 本文将介绍 C++11 标准的两个新特性:defaulted 和 deleted 函数.对于 defaulted 函数,编译器会为其自动生成默认的函数定义体,从而获得更高的代

C++11 标准新特性: 右值引用与转移语义

C++ 的新标准 C++11 已经发布一段时间了.本文介绍了新标准中的一个特性,右值引用和转移语义.这个特性能够使代码更加简洁高效. 查看本系列更多内容 | 3 评论: 李 胜利, 高级开发工程师, IBM 2013 年 7 月 10 日 内容 在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move

【转】C++11 标准新特性:Defaulted 和 Deleted 函数

原文链接http://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/ 本文将介绍 C++11 标准的两个新特性:defaulted 和 deleted 函数.对于 defaulted 函数,编译器会为其自动生成默认的函数定义体,从而获得更高的代码执行效率,也可免除程序员手动定义该函数的工作量.对于 deleted 函数, 编译器会对其禁用,从而避免某些非法的函数调用或者类型转换,从而提高代码的安全性.本文将通过代码示例详