[C++11/14新特性] noexcept、override、final关键字

本文介绍了C++11中的noexcept关键字用于指定函数是否抛出异常,override用于确保虚函数的正确重载,final用于标记类不可继承和方法不可重写,这些特性有助于提高代码效率和保证程序结构清晰。
摘要由CSDN通过智能技术生成

目录

一、noexcept关键字

二、override关键字

三、final关键字

一、noexcept关键字

noexcept是C++11新引入的关键字,noexcept既是说明符,也是运算符。作为说明符,它的作用是指定函数是否抛出异常;作为运算符,它的作用是编译时检查,如果表达式不会抛出任何异常则返回 true,否则返回false。
noexcept主要作用:减少运行时开销
语法格式: noexcept 等价于 noexcept(true)
noexcept(false)表示允许抛出异常  noexcept(true)表示不允许抛出异常,如果在运行时,noexecpt函数向外抛出了异常(如果函数内部捕捉了异常并完成处理,这种情况不算抛出异常),程序会直接终止,调用std::terminate()函数,该函数内部会调用std::abort()终止程序。

代码示例:

#include<iostream>

// noexcept可以用于函数声明和函数定义中,如果将函数标记为noexcept,那么编译器就可以进行一些优化,从而提高程序性能。
void func1() noexcept 
{
    // Function body
    std::cout << "该函数不会抛出任何异常,编译器会进行优化" << std::endl;
}

void func2() noexcept(false)
{
    // Function body
    std::cout << "如果该函数可能抛出异常,则用noexcept(false)" << std::endl;
}

void myFunc() noexcept
{
    std::cout << "myFunc() called" << std::endl;
}

int main()
{
    try{
        myFunc();
    }
    catch(...){
        std::cout << "exception caught" << std::endl;
    }

    return 0;
}

运行结果:

我们并没有在主函数中捕获任何异常,这是因为我们的noexcept函数不会抛出异常,总之,noexcept关键字是一个非常有用的语法糖,它可以帮助我们指示函数是否可能抛出异常,从而进行一些优化。
如果您需要编写高性能的C++程序,noexcept关键字是您应该考虑的一个重要工具。

二、override关键字

override关键字 
如果派生类在虚函数声明时使用了override描述符,那么该函数必须重载其基类中的同名函数,否则代码将无法通过编译

代码示例:

#include<iostream>

/*
override关键字 
如果派生类在虚函数声明时使用了override描述符,那么该函数必须重载其基类中的同名函数,否则代码将无法通过编译
*/

class Base
{
public:
    virtual void print() = 0;
    virtual void dijkstra() = 0;
    virtual void myfunc() = 0;
};

class Derived : public Base
{
public:
    virtual void print() override;    // 编译器会告诉你缺少该函数的定义
    // void djikstra() override; // 无法通过编译 拼写错误 并非重载
    virtual void dijkstra() override;
    virtual void myfunc() override;   // 没有问题 对myfunc进行了重载
};

void Derived::myfunc()
{
    std::cout << "hello" << std::endl;
}

void Derived::print()
{
    std::cout << "my print" << std::endl;
}

void Derived::dijkstra()
{
    std::cout << "dijkstra" << std::endl;
}

int main()
{
    Derived derived;
    derived.print();
    derived.dijkstra();
    derived.print();

    return 0;
}

运行结果:

三、final关键字

C++11 final 关键字
允许将类标记为final 在类后面使用关键字final 意味着继承该类会导致编译错误
即表示该类不能再被继承

C++中还允许将方法(虚函数)标记为fianal,这意味着无法在子类中重写该方法

代码示例:

#include<iostream>

/*
C++11 final 关键字
允许将类标记为final 在类后面使用关键字final 意味着继承该类会导致编译错误
即表示该类不能再被继承
C++中还允许将方法(虚函数)标记为fianal,这意味着无法在子类中重写该方法
*/

class Base final
{
public:
    void print();
    virtual void myfunc() final;
};

// 编译器会报错 不能将final类 类型用作基类
/*
class Derived : public Base
{

};
*/

int main()
{
    
    return 0;
}

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值