C++11新关键字noexceptoverridefinal把我们的心意告诉编译器

Posted 老虎中的小白Gentle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++11新关键字noexceptoverridefinal把我们的心意告诉编译器相关的知识,希望对你有一定的参考价值。

noexcept告诉编译器不抛异常

异常时一定要处理的,如果一个函数出现异常,它内部不对该异常做处理,异常会一直往上传递,给函数的调用者。到最后一直没有被处理,程序就会终止,调用std::terminate(),它默认调用std::abort()。

void foo()noexcept;
void foo()noexcept(true);//和上面等价,告诉编译器这个函数不要抛出异常

当然了你可以指定函数不抛出异常的条件,例如

void swap(Type& x, Type& y)noexcept(noexcept(x.swap(y)))
{
    x.swap(y);
}

你需要通知C++(特别是std::vector)你的move(搬移)构造函数和析构函数不会抛出异常。当vector增加时,它要搬移到一个比自己原来大两倍的空间,move构造函数将被调用。如果搬移构造函数不是noexcept,则std::vector不能使用它。

override告诉编译器我要重写父类方法

#include <iostream>

using namespace std;

class Base
{
    virtual void vfunc(float){}
};


class Derived1:Base
{
    virtual void vfunc(int){} //本意是想重写父类的函数的,不小心参数类型写错了,
                        //编译器没报错,它不是你肚子里面的蛔虫,不知道你的想法
};

class Derived2:Base
{
    virtual void vfunc(int) override{}//编译器报错了,因为你告诉它要重写函数,可是参数不一致了

    virtual void vfunc(float) override{}
};

int main()
{


}

报错的提示
在这里插入图片描述
其实,这个重写父类函数是经常会发生的,如果我们不写override并且参数类型或个数写错了话,编译器不提醒我们的,就会发生本意是想重写父类函数的却弄成在子类新写了一个函数

final告诉编译是最后一个

final告诉编译我这个类是继承体系的最后一个类了或是这个函数不能再被重写了

class Base1 final{}; //继承体系最后的一个类
class Derived1 : Base1{}; //error:

class Base2
{
    virtual void f()final{} //不能再被重写了
};
class Derived2:Base2
{
    void f();//error:
};

报错信息
在这里插入图片描述

以上是关于C++11新关键字noexceptoverridefinal把我们的心意告诉编译器的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出之C++11新特性

C++11新关键字noexceptoverridefinal把我们的心意告诉编译器

C++11新关键字noexceptoverridefinal把我们的心意告诉编译器

C++11类的新语法和特性

C++11新特性:3—— C++ decltype类型推导完全攻略

C++11新特性:3—— C++ decltype类型推导完全攻略