您的位置:首页 > 编程语言 > C语言/C++

cpp11新特性快速预览

2013-08-15 20:07 197 查看
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. 移动语义
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: