C++11新特性总结

C++11新特性

本文章作为作者的笔记文章,也可以供广大程序猿们进行参考。

为保持C++稳定性以及兼容性增加的新特性

noexcept修饰符

C++98中,我们有一套完整的不同于C的异常处理系统,通过这套异常处理系统,C++拥有了很大的异常处理能力。一般使用throw()动态异常声明,但是事实上,该特性很少被使用,于是就被C++11弃用了,被随之的noexcept取代了。
noexcept不会抛出异常,但是如果修饰的函数抛出了异常,则会调用std::terminate()函数来终止程序的运行,这比异常机制的throw效率会高一些。因为throw会导致函数栈被依次展开,并依帧调用在本帧中已构造的自动变量的析构函数等。

快速初始化成员变量

C++98中支持了直接初始化静态成员变量,而在C++11中标准还允许了直接用=和花括号{}进行就地的非静态成员变量初始化。

sizeof

C++98sizeof只支持静态成员或者对象的实例进行操作,并不支持对静态成员进行操作,而C++11可以支持。

friend扩展

C++中,声明一个类为另一个类的友元时,不再需要使用class关键字。例如:

class CodeX;

class Liuzirong 
{
	friend class CodeX; //C++98
}
class Qiuyuxin
{
	friend CodeX;  //C++11
}

final/override

当你写了一个虚函数,而你不想让虚函数被重写时,可以使用final控制来使虚函数不被重写。
而你重写了虚函数,当继承关系比较复杂时,你不知道你的函数是否为虚函数时,在重写虚函数的时候,你可以添加override控制来声明此函数为虚函数。但是如果和基类的同名函数运用了override,则必须重写基类的同名函数,否则会报错。

模板函数的默认模板参数

C++11中模板和函数一样,可以有默认的参数。但是程序员必须按照“从右往左”的顺序进行默认参数的指定。

extern模板

在C++98标准中虽说没有extern模板,但是有extern变量。extern的进行变量声明的好处是,两个.c文件生成的目标文件.o文件只会有一个同名变量的定义。如果没有extern,虽说对最终没有啥影响,因为链接器会进行合并,最终只会有一份,但是链接器还需要去做实例化的工作,如果还要移除重复代码,这样的工作过于冗余了。
示例:

//test.h
extern template void fun<int>(int);

//a.c
#include "test.h"
template void fun<int>(int); //显式实例化
void test1()
{
	fun(3);
}

//b.c
#include "test.h"
template void fun<int>(int);
void test1()
{
	fun(3);
}

局部和匿名类型做模板参数

C++98中局部类型和匿名的类型都不能作为模板类的实参。但是C++11可以,但是匿名类型的声明不能再模板实参位置。

通用为本,专用为末

继承构造函数

以上是我已经知道的C++11新特性,后续会继续更新还有的C++11新特性,敬请期待!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值