- 论坛徽章:
- 19
|
本帖最后由 shenlanyouyu 于 2015-07-19 01:17 编辑
最近认真学习了C++11带来的变化,分享给大家。
关于C++标准的更新需要很长的时间,并且也没有达到完美的程度。从03到11,几乎是10年才更新。在这本书中,作者也做出了解释,标准的制订,是许多人和公司的工作才能完成的,需要他们提供建议,互相讨论,并等待他们的实现和测试。没有一个人是full-time为C++标准工作,标准不是一个公司投入大量人员来完成的结果,而是许多人和公司的共同努力达成的结果。
C++ 11 STL带来的变化:
1.取消Template表达式中的空格:
vector<list<int> >; // OK in each C++ version
vector<list<int>>; // OK since C++11
2. nullptr 和std::nullptr_t
C++ 11中使用nullptr来代替0或者NULL,nullptr能够被转换到任何指针类型,但是不能转换到int。以前使用0来表示空指针的,但由于0可以被隐式类型转换为整形,这就会存在一些问题。
3. auto动态类型
在C++ 11中,使用auto可以在声明一个变量或对象时可以不指定数据类型,通知编译器去根据初始化代码推断所声明变量的真实类型例如:
auto i = 42; // i has type int
double f();
auto d = f(); // d has type double
auto i; // ERROR: can’t dedulce the type of i
4.更强大的for循环
C++ 11提供了功能更强大的for循环,指定循环的范围,数组等,功能更加灵活强大。
for ( decl : coll ) {
statement
}
for ( int i : { 2, 3, 5, 7, 9, 13, 17, 19 } ) {
std::cout << i << std::endl;
}
5. Rvalue右值引用
我个人认为Rvalue是C++ 11中引入最重要的功能,避免不必要的拷贝和缓存,解决部分以前STL中存在的内存使用率较低的问题。
6. noexcept
C++ 11提供的keyword noexcept主要用于表明函数不能抛出异常或者准备抛出异常。
7. constexpr
constexpr确保表达式在编译的时候进行计算,例如
constexpr int square (int x)
{
return x * x;
}
float a[square(9)]; // OK since C++11: a has 81 elements
8. 可变参数的Templates
9. Lambdas
匿名函数从函数式编程中借来的强大特性,使很多其他特性以及类库得以实现。可以在任何使用函数对象或者函子(functor)或std::function的地方使用lambda。
10. decltype
decltype 可以让编译器确定表达式的类型,例如:
std::map<std::string,float> coll;
decltype(coll)::value_type elem;
11. Smart Pointers 智能指针
unique_ptr: 如果内存资源的所有权不需要共享,就应当使用unique_ptr,它没有拷贝构造函数,但是它可以转让给另一个unique_ptr(存在move构造函数)。
shared_ptr: 如果内存资源需要共享,那么使用shared_ptr。
weak_ptr: 持有被shared_ptr所管理对象的引用,但是不会改变引用计数值。它被用来打破依赖循环。
auto_ptr:已经被废弃,不会再使用了。
|
|