前言
该篇文章讲述C++11新特性中
①static_assert
②noexcept修饰符
③强类型枚举
④using类型的别名
static_assert
//语法
static_assert("常量表达式","提示的字符串");
静态断言,在C++11以前,C/C++提供了一种调试工具:assert断言,这是一个宏,用于在运行阶段对断言进行检查,assert(flag == true)如果条件为真,程序执行,否则调用abort()(程序将直接退出,并发出sigabrt消息)
C++11新增关键字static_assert,用于在编译阶段对断言进行测试
static_assert相较于assert的优势:
①更早的报告错误,我们知道构建是早于运行的,更早的报告错误以为着开发成本的降低
②减少运行时的开销,静态断言是编译时检测的,减少了运行时的开销
static_assert的第一个参数必须是常量表达式,不能是变量,因为是在编译阶段进行测试,变量还不存在,C++11之前的assert断言测试可以是变量,因为是在运行阶段测试
noexcept修饰符
C++11之前,如果我们想抛出一个异常或者限制抛出异常,那么可以
void func()
{
throw 1; //抛出一个异常
}
void func1() throw() //代表此函数不能抛出异常,如果抛出,就会异常
{
throw 1;
}
C++11用noexcept代替throw(),所以代码可以改写成
void func1() noexcept //代表此函数不能抛出异常,如果抛出,就会异常
{
throw 1;
}
强类型枚举
C++11之前,我们平常用的枚举类型可以是这样的,定义一个枚举类型FUNC
enum FUNC{OK,error}; //正确
但如果再定义一个枚举类型FUNC1,如下代码图,就会报错,错误提示为OK的重定义,因为这两枚举的作用域是相同的,编译器分不清楚OK到底是FUNC的还是FUNC1的
enum FUNC{OK,error};
enum FUNC1{OK,pause};//错误,OK的重定义
int main()
{
FUNC Y = OK; //OK赋值失败,OK的重定义
FUNC N = error;
}
为了解决这个问题,C++11出现强类型枚举,将枚举的作用域变为类,语法格式为
enum class/struct 枚举名{};
enum class FUNC{OK,error}; //强枚举类型
enum struct FUNC1{OK,pause};//强枚举类型
int main()
{
FUNC Y = FUNC::OK; //正确,类名::表明是FUNC的OK
FUNC N = FUNC::error;
}
这样就不会出现枚举重定义的错误,因为每个枚举的作用域都是类,但使用枚举量的时候,必须限定作用域,以表明是哪个枚举类的枚举量
强类型枚举可以指定成员变量的的类型
enum class FUNC:char{OK,error};//指定枚举为char类型
不指定则默认为int类型
using类型的别名
C++11之前可以通过 typedef给一个类型起别名,给int类型起了别名为int32
typedef int int32;
C++11使用using关键字给类型起别名
using int32 = int;
这篇文章对你有帮助的话~就点个赞吧~
点赞收藏关注就是对我最大的支持~
一起学习C++11新特性~