目录
一、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;
}