使用shared_ptr来表示共享所有权。推荐使用make_shared来有效地创建共享对象。
// C++98 widget* pw = new widget (); ::: delete pw; // C++11 auto pw = make_shared<widget>(); |
使用 weak_ptr 来退出循环并且表示可选性(例如,实现一个对象缓存)
// C++11 class gadget; class widget { private: shared_ptr<gadget> g; // if shared ownership }; class gadget { private: weak_ptr<widget> w; }; |
如果你知道另一个对象存在时间会更长久并且希望跟踪它,使用一个(非占有non-owning)原始指针。
// C++11 class node { vector< unique_ptr<node> > children; node* parent; public: ::: }; |
nullptr
始终使用nullptr表示一个null指针值,绝不要使用数字0或者NULL宏,因为它们也可以代表一个整数或者指针从而产生歧义。
Range for
基于范围的循环使得按顺序访问其中的每个元素变得非常方便。
// C++98 for( vector<double>::iterator i = v.begin (); i != v.end (); ++i ) { total += *i; } // C++11 for( auto d : v ) { total += d; } |
非成员(nonmember) begin 和 end
始终使用非成员begin和end,因为它是可扩展的并且可以应用在所有的容器类型(container type),不仅仅是遵循了STL风格提供了 .begin ()和 .end ()成员函数的容器,甚至数组都可以使用。
如果你使用了一个非STL风格的collection类型,虽然提供了迭代但没有提供STL的 .begin ()和 .end (),通常可以为这个类型编写自己的非成员begin和end来进行重载。这样你就可以使用STL容器的编程风格来遍历该类型。C++11标准提供了示例:C数组就是这样一个类型,标准同时为数组提供了begin和end。
vector<int> v; int a[100]; // C++98 sort ( v.begin (), v.end () ); sort ( &a[0], &a[0] + sizeof(a)/sizeof(a[0]) ); // C++11 sort ( begin (v), end (v) ); sort ( begin (a), end (a) ); |