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);