博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++11新特性
阅读量:7021 次
发布时间:2019-06-28

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

什么是C++11

  C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++ Technical Report 1(TR1)程序库(数学的特殊函数除外)。

C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto、decltype,和模板的大量改进。

本文将对C++11的以上新特性进行简单的讲解,以便大家能够快速了解到C++11对C++的易用性方面祈祷的巨大作用。

 

新的关键字

auto

C++11中引入auto第一种作用是为了自动类型推导

auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推导,可以大大简化我们的编程工作

auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响

另外,似乎auto并不会影响编译速度,因为编译时本来也要右侧推导然后判断与左侧是否匹配。

auto a;       // 错误,auto是通过初始化表达式进行类型推导,如果没有初始化表达式,就无法确定a的类型auto int a = 10;  // 错误,auto临时变量的语义在C++ 11中已不存auto d = 1.0;auto str = "Hello World";auto ch = 'A';auto func = less
();vector
iv;auto ite = iv.begin();auto p = new foo() // 对自定义类型进行类型推导

 

auto不光有以上的应用,它在模板中也是大显身手,比如下例这个加工产品的例子中,如果不使用auto就必须声明Product这一模板参数:

template 
void processProduct(const Creator& creator) { Product* val = creator.makeObject(); // do somthing with val}

 

如果使用auto,则可以这样写:

template 
void processProduct(const Creator& creator) { auto val = creator.makeObject(); // do somthing with val}

抛弃了麻烦的模板参数,整个代码变得更加正解了。

decltype

decltype实际上有点像auto的反函数,auto可以让你声明一个变量,而decltype则可以从一个变量或表达式中得到类型,有实例如下:

int x = 3;decltype(x) y = x;

有人会问,decltype的实用之处在哪里呢,我们接着上边的例子继续说下去,如果上文中的加工产品的例子中我们想把产品作为返回值该怎么办呢?我们可以这样写:

template 
auto processProduct(const Creator& creator) -> decltype(creator.makeObject()) { auto val = creator.makeObject(); // do somthing with val}

 

nullptr

nullptr是为了解决原来C++中NULL的二义性问题而引进的一种新的类型,因为NULL实际上代表的是0,

void F(int a){    cout<<

 

序列for循环

在C++中for循环可以使用类似java的简化的for循环,可以用于遍历数组,容器,string以及由begin和end函数定义的序列(即有Iterator),示例代码如下:

int a[] = {
1, 2, 3, 4, 5};for (int b :a){ cout<<

 

Lambda表达式

lambda表达式类似Javascript中的闭包,它可以用于创建并定义匿名的函数对象,以简化编程工作。Lambda的语法如下:

[函数对象参数](操作符重载函数参数)mutable或exception声明->返回值类型{函数体}

vector
iv{
5, 4, 3, 2, 1};int a = 2, b = 1;for_each(iv.begin(), iv.end(), [b](int &x){cout<<(x + b)<
int{
return x * (a + b);});// (3)
  • []内的参数指的是Lambda表达式可以取得的全局变量。(1)函数中的b就是指函数可以得到在Lambda表达式外的全局变量,如果在[]中传入=的话,即是可以取得所有的外部变量

    (a)、空。没有使用任何函数对象参数。

    (b)、=。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。

    (c)、&。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)。
    (d)、this。函数体内可以使用Lambda所在类中的成员变量。
    (e)、a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。
    (f)、&a。将a按引用进行传递。
    (g)、a, &b。将a按值进行传递,b按引用进行传递。
    (h)、=,&a, &b。除a和b按引用进行传递外,其他参数都按值进行传递。
    (i)、&, a, b。除a和b按值进行传递外,其他参数都按引用进行传递。

 

 

  • 、(操作符重载函数参数),标识重载的()操作符的参数,没有参数时,这部分可以省略。参数可以通过按值(如:(a,b))和按引用(如:(&a,&b))两种方式进行传递。

  • mutable或exception声明,这部分可以省略。按值传递函数对象参数时,加上mutable修饰符后,可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)。exception声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用throw(int)。

  • ->返回值类型,标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略。

  • 、{函数体},标识函数的实现,这部分不能省略,但函数体可以为空。

变长参数的模板

我们在C++中都用过pair,pair可以使用make_pair构造,构造一个包含两种不同类型的数据的容器。比如,如下代码:

auto p = make_pair(1, "C++ 11");

由于在C++11中引入了变长参数模板,所以发明了新的数据类型:tuple,tuple是一个N元组,可以传入1个, 2个甚至多个不同类型的数据

auto t1 = make_tuple(1, 2.0, "C++ 11");auto t2 = make_tuple(1, 2.0, "C++ 11", {
1, 0, 2});

这样就避免了从前的pair中嵌套pair的丑陋做法,使得代码更加整洁

另一个经常见到的例子是Print函数,在C语言中printf可以传入多个参数,在C++11中,我们可以用变长参数模板实现更简洁的Print

template
void Print(Head head, typename... tail) { cout<< head <

Print中可以传入多个不同种类的参数,如下:

Print(1, 1.0, "C++11");

 

更加优雅的初始化方法

在引入C++11之前,只有数组能使用初始化列表,其他容器想要使用初始化列表,只能用以下方法:

int arr[3] = {
1, 2, 3}vector
v(arr, arr + 3);

在C++11中,我们可以使用以下语法来进行替换:

int arr[3]{
1, 2, 3};vector
iv{
1, 2, 3};map
{
{
1, "a"}, {
2, "b"}};string str{
"Hello World"};

 

然后呢…

如果你想了解更多C++11令人兴奋的新特性,我会向你推荐这两个博客:

转载于:https://www.cnblogs.com/DswCnblog/p/3551248.html

你可能感兴趣的文章
在选择屏幕添加长文本,换行等等 全在这里
查看>>
Dubbo背景和简介
查看>>
网络基础——1
查看>>
scp命令的用法详解
查看>>
JAVA里自定义注解来进行数据验证
查看>>
转://Oracle 数据备份与恢复微实践
查看>>
[转载] 七龙珠第一部——第013话 悟空的大变身
查看>>
隐马尔可夫HMM中viterbi算法
查看>>
UOJ #449. 【集训队作业2018】喂鸽子
查看>>
优化WebLogic 服务器性能参数
查看>>
论普通程序员与架构师
查看>>
高性能的JavaScript--数据访问(2)
查看>>
线程池-Threadlocal
查看>>
Mac MySQL 启动失败
查看>>
2017 5月15日上午
查看>>
整理UWP中网络和设备信息获取的帮助类,需要的拿走。
查看>>
用户访问网站的流程
查看>>
重积分与曲线积分补充习题
查看>>
IoC
查看>>
spring源码深度解析笔记
查看>>