09C++11保证稳定性和兼容性

1. long long 整型

​ c++ 中,在进行隐式类型转换时,一般按照低等级整型转换成高等级整型(长度越大的等级越高、相同大小的有符号类型和无符号类型的等级相同),有符号的转换为无符号。

2. 静态断言

​ 在 c++ 中,标准在 <cassert> 或者 <assert.h> 头文件中为程序员提供了 assert 宏,用于在运行时进行断言。

​ 通过预处理指令 #if 和 #error 的配合,也可以让程序员在预处理阶段进行断言。

​ c++11 引入的静态断言 static_assert 可以用来在编译时做一些断言。static_assert 接收两个参数,一个是断言表达式,这个表达式通常需要返回一个 bool 值;一个则是警告信息,它通常也就是一段字符串。当断言表达式结果为false,则会打印提示信息。

static_assert(sizeof(int) == 8, "This 64-bit machine should follow this!");
int main()
{
    return 0;
}

​ 必须注意的是, static_assert 的断言表达式的结果必须是在编译时期可以计算的表达式,及必须是常量表达式。如果使用了变量,则会导致错误。

int positive(const int n)
{
    static_assert(n>0, "value must >0");
}
3. noexcept 修饰符与 noexcept 操作符 (略)

​ noexcept,表示其修饰的函数不会抛出异常。在 c++11 中,如果 noexcept 修饰的函数抛出了异常,编译器可以选择直接调用 std::teminate() 函数来终止程序的运行,这比基于异常机制的 throw() 在效率上会高一些.....

4. 扩展的 friend 语法

​ c++11 中,声明友元类的时候可以省略 class 关键字,并且也可以使用 typedef 声明的类。这样的改动,使得程序员可以为类模板声明友元了。

class P;
template <typename T> class People
{
    friend T;    
}
People<p> PP;  //类型P在这里是People类型的友元
People<int>	  //对于 int 类型模板参数,友元声明被忽略
5.override 关键字

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

​ ——如果某子类中的函数接口后面添加了 override 关键字,则表示该接口是对基类虚接口的一个重载。

6. 模板函数的默认模板参数

​ c++11 中,模板类和模板参数都允许有默认模板参数。

void defParm(int m=3){}
template <typename T = int>
class DefClass(){};
template <typename T = int>
void defTempParm(T a);

​ 不过在语法上,与类模板有些不同的是,在为多个默认模板参数声明制定默认值的时候,程序员必须遵照“从右往左”的规则进行指定。而这个条件对函数模板来说并不是不是必须的。

template<typename T1, typename T2 = int> class DefClass1;
template<typename T1 = int, typename T2> void defFunc1(T1 a, T2 b);

posted @ 2020-07-18 14:53  洛克十年  阅读(155)  评论(0编辑  收藏  举报