cpp11新特性快速预览
1.auto关键字
试想,曾经每次迭代vector之类的容器时,是否写了很长的迭代器类型声明:
std::vector<int>::iterator iter = vec.begin();
好了,有了auto后可以直接这么写:auto iter = vec.begin();
另外,auto还可以作为函数的返回类型,例如:
template<class T1, class T2>
auto add(const T1 v1, const T2 v2) -> decltype(v1 + v2)
{
return v1 + v2;
}
2.nullptr
曾经,我们一般在初始化指针的时候都是直接初始化为0,现在可以用nullptr才初始化,就这方面来说它们是没有区别的。
但,用nullptr初始化int | short | long类型时会有编译错误(可以初始化bool)
3.基于区间的循环
原生数组及其它容器提供了一致的迭代方法
//int vec[] = { 1, 10, 100 };
vector<int> vec;
vec.push_back(1);
vec.push_back(10);
vec.push_back(100);
for (auto &val : vec)
{
val *= 10;
cout<<val<<std::endl;
}
4. override与final
关于虚函数重写,子类中的虚函数必须与基类有相同的签名,例如下面的函数不构成重写:
virtual void foo(int);
virtual void foo(short);
virtual void foo(int) const;
引入override关键字后,这个BUG既可轻松解决,在上面的例子中,在函数最后的签名加上override,也就是告诉编译器,我会重写基类的虚函数,
但编译器发现其并没有重写某个虚函数,就会直接编译错误。
final也只能用于虚函数,用以提醒编译器,我的子类不能够重写这个虚函数,可以用于基类和子类。比如在一个继承树中,某一层之后的虚函数不允许重写(此时就会同时使用overide与final了)。
5. 强类型枚举
下面的代码无法编译, Spades重定义
enum Suit { Diamonds, Hearts, Clubs, Spades };
enum Tools { Picks, Shovels, Spades, Hammers };
好吧,在enum后加上 class既可编译通过。
再看几个例子,来自MSDN:
Suit hand;
hand = Clubs; // error C2065: 'Clubs' : undeclared identifier
hand = Suit::Clubs;
int account_num = 12345678;
hand = account_num; // error C2440: '=' : cannot convert from 'int' to 'Suit'
account_num = Suit::Hearts; // error C2440: '=' : cannot convert from 'Suit' to 'int'
6. 智能指针,不多说了,boost中早就有了
7. lambda表达式
8. std::begin, std::end
9. 静态断言
10. 移动语义