c++11新特性

c++新特性是目前新特性中最为流行的,包括在面试的时候也经常问道,下面对c++11的新特性做简要介绍,比较基础,如果还要深入其他新特性,请参考后面文章!

c++11新特性

(1)auto关键字:工作原理是编译器根据上下文情况(输入变量已经运算情况),确定auto变量的真正类型,auto并没有让C++成为弱类型语言,也没有弱化变量什么;当auto作为函数返回值时,只能用于定义函数,不能用于声明函数;如果是声明则在文件的调用函数时,编译无法通过。但如果把实现写在文件中,可以编译通过,因为编译器可以根据函数实现的返回值确定auto的真实类型。如果读者用过inline类成员函数,这个应该很容易明白,此特性与inline类成员函数类似。

(2)nullptr关键字:在C98中,NULL有哦两层含义,分别在c++表示整型0和字符串为空;C++11中,nullptr可完全代替NULL,然而NULL和nullptr还是稍有不同,NULL可被转化为int类型,而nullptr不能。因此nullptr可以弥补NULL在进行模板推导或者函数重载时的缺陷。

(3)支持for(int i : arr)语句(范围for语句):这种有冒号的for循环叫做foreach循环,foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。含义是:i从arr中去挨个取元素,取一个循环一次,直至到大arr最后一个元素才循环截止。

map<string, string> address_book;

for (auto address_entry : address_book);//根据address_book中的成员去判断address_entry的类型

(4)override和final:override用于标示虚函数,明确说明子类可以重写覆盖父类的同名函数,避免造成重写隐藏的情况;如果父类中的函数并没有virtual关键字,没有加virtual是不允许重写的;要重写父类的方法,一定要函数名字和参数列表都一致,而且父类要有virtual关键字;final 用于标识类或成员函数,用来禁止子类继承或重写父类的成员函数,final 修饰成员方法,可以是虚函数,也可以是普通成员函数,虚函数则表示不允许子类重写覆盖, 普通成员函数则表示不允许子类重写隐藏(和父类的函数有不同参数类型),本文后半段将介绍重载重写的区别。

(5)匿名函数 Lambda:当代码里面有大量的小函数,而这些函数一般只被一两处调用,那么我们就可以重构成Lambda表达式,也就是匿名函数。作用就是当你想用一个函数,但是又不想费神去命名一个函数。 当然这个函数也可以赋予一个变量,变量的值就是Lambda,也就是函数名;匿名函数的格式为:[capture](params)->ret { body};

① [capture]里面是匿名函数需要使用外部的哪些变量,已经引用的形式。例如:

[a, &b],前文定义的a以值方式被表达式捕获,b则是以引用的方式;

[this] 以值的方式捕获 this 指针;

[&] 以引用的方式捕获所有的外部自动变量;

[=] 以值的方式捕获所有的外部自动变量;

[] 不捕获外部的任何变量。

注意:如果是const 类型的 lambda 表达式,该类型的表达式不能修改捕获capture列表中的值。

② (params)指定lambda表达式内部变量定义。

③ ->ret是返回类型,如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。如果没有 return 语句,则类似 void函数。

④ {body}是Lambda表达式主题结构。

例:auto function = [](int i){ return 2*i+10};// 可以体会auto的好处了

cout<< function(10) << endl; //输出为30

(6)模板别名:在C++98里,可以通过typedef 关键字定义一个基本类型的别名,比如 typedef unsigned int uint32,在这里我们定义了unsigned int类型的别名为uint32,在以后需要使用unsigned int的时候我们都可以用uint32替换;但是不能定义其他复杂的函数、模板类型;而在c++11中可以用typedef或者using为类、stl、函数等定义一个别名;如:

(1)using unit32=unsigned int;
(2)typedef map<std::string int> map1;
(3)using function=void(*)(int,string);//以前的命名:typedef void(*function)(int,string)

重载和重写的区别

(1)重载:两个函数必须在同一个类中;两个函数名字相同;但参数(类型或者参数个数不一样);virtual关键字可有可无。

(2)重写:两个函数分别位于派生类与基类;两个函数名字必须相同;参数个数与类型都相同;基类函数必须有virtual关键字。

备注:重写“隐藏”:是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

 (1)如果派生类的函数与基类的函数同名,但是参数不同。 此时,不论有无virtual关键字,基类的函数将被隐藏。但注意如果加上virtual则通过父类型指针或引用访问不用类名::的形式访问也可以访问;

 (2)如果派生类的函数与基类的函数同名,参数也相同,但基类函数没有virtual关键字。此时基类的函数被隐藏。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值