C++11:复习新增功能
标签(空格分隔): c++
新类型
C++11中新增的数据类型有long long
和unsigned long long
,以支持64位整型;新增了类型char16_t
和char32_t
,以支持16位和32位的字符表示;还新增了“原始”字符串。
统一的初始化
C++使得大括号可以用来初始化所有内置定义和用户定义的类型。使用初始化列表时,可以添加等号。也可不添加:
int x = {5};
short q[5]{1,2,3,4,5};
另外,列表初始化语法也可以用在new表达式中
int * ar = new int[4]{2,3,4,5};
创建对象时,也可以使用大括号:
String str{"Hello World"};
缩窄
初始化列表语法可以防止精度缩窄。当我们使用大括号将高精度数字用来初始化低精度变量时将不被允许:
short s = 3.14159265358;//ok
short s2 {3.14159265358};//error
但是允许将低精度的值或者处于正确范围内的值用来初始化高精度
double d{1};//ok
short s{22};//ok
声明
auto
在C++11以前,auto关键字是一个存储类型说明符,在C++11后将其变为自动类型推断:
auto m = 112;//type is int
关键字auto还可以用来简化模板
decltype
关键字decltype将变量的类型声明为指定表达式的指定类型。下面的语句是y与x表达式的类型相同
decltype(x) y;
这在定义模板时有用,因为在定义模板时我们可能并不知道要返回值的具体类型
template<typename X,typename Y>
void eq(X x,Y y){
decltype(X*Y) z;
...
}
返回引用类型
C++11新增了一种函数声明语法:在函数的后面声明函数的返回类型:
auto foo(double ,int) ->double;
这种语法声明能够让你使用decltype来指定模板的函数返回类型:
template<typename X,typename Y>
auto foo(X x,Y y)->decltype(X*Y){
...
}
模板别名
对于冗长或者复杂的标识符,如果能够创建别名将会很方便。以前C++提供了typedef。现在C++11提供了林外一种创建别名的方式:即使用using=
using itType = std::vector<std::string>::iterator;
nullptr
在原来的C++版本中常使用0来表示空指针,但是其引发的问题在于这容易引起混乱,这表示一个整数0还是一个空指针?C++11提供了一个新的关键字nullptr用来表示空指针,虽然其内部表示任然是整数0,但是却不能显式的转换为0;
作用域内枚举
C++中允许在同一个类中定义两个名称相同的枚举类型,并且使用作用域解析符加以区分。并且我们还能指定枚举的内部表达方式。
对类的修改
显式转换运算符
C++很早就支持对象的自动类型转换,但是由于自动类型转换可能会引发一些问题,所以C++引入了关键字explicit用来禁止单参数构造函数导致的自动类型转换。C++11扩展了explicit的用法,使得可以对函数转换做类似的操作。
类内成员的初始化
在C++11中我们可以在类定义中给变量赋初值:
class String{
_length = 0;
...
};
这样我们就不必在每一个构造函数中去初始化大量的变量
右值运算
传统的C++引用使得标识符关联到坐直。C++11新增了右值引用,这是使用&&表示的。右值引用可以关联到右值。即可以出现在赋值表达式右边。