一些C艹11的新标准…反正都是些泥萌大家都知道的过时东西;
initializer_list
C++11提供了模板类initializer_list,可将其作用于参数,如果类有接受initializer+list作为参数的构造函数,则初始化列表就语法只能用于该构造函数,且列表中的元素必须是同一种类型或可以转换为同一种类型;这个类包含了成员函数begin()和end()用于获得列表范围;
decltype
关键字decltype将变量的类型声明为表达式指定的类型; decltyoe(x) y
让y的类型与x相同,x是一个表达式; 比如:
这在定义模板的时候挺有用的,因为只有在模板被实例化的时候才能够确定类型;
返回类型后置
C++11新增了一种函数声明语法,在函数名和参数列表后面指定返回类型
他能让你使用decltype来指定模板函数类型:
这里解决的问题是,在编译器遇到my的形参列表之前,T U还不在作用域内,因此必须使用后置返回类型;
模板别名: using =
他能够创建模板别名,和typedef不同的是,他可以用于模板部分具体化:
作用域内枚举
传统的C++枚举提供了一种创建名称常量的方式; 但如果在同一个作用域内定义两个枚举,则他们不能重名;C++11新增了一种枚举解决了这些问题,这种枚举使用class或struct定义:
基于范围的for循环
对于内置数组以及包含方法begin()和end(0的类,可以使用基于范围的for循环来简化编程工作;
x将以此为prices中1的每个元素的值,x的类型应与数组元素的类型匹配; 吐过想修改数组或容器里的元素可以使用引用:
默认的方法和禁用方法
假设要使用某个默认的函数,而这个函数由于某种原因没有自动创建,例如提供了移动构造函数,则编译器不会自动创建默认的构造函数,复制构造函数和复值构造函数.在这情况下使用default显示的声明这些方法的默认版本:
关键字delet可以禁止编译器使用特定方法,且适用于任何函数,例如,要禁止复制构造函数可以:
class A
{
int a;
public:
A(int i = 0) : a(i){}
virtual void f(char ch) const {…};
}
class B
{
public:
B(int i = 0) : a(i){}
virtual void f(char ch) const {…};
}
```
由于B定义的是f(charch)而不是f(char ch); 这导致了程序不能使用: bingo(10); b.f('@')
类似这样的代码;
所以我们可以使用override,把它放在f(char * ch) 后面.如果与基类方法不匹配则将视为错误;
而final解决了另一个问题.可能想禁止派生类覆盖特定的虚方法,谓词可在参数后面加上final;例如,下面的代码禁止A的派生类重新定义f().virtual void f(char ch) const final{...};