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新特性,敬请期待!