现代C++风格的新元素

发表于:2011-11-16 09:42

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:唐尤华    来源:51Testing软件测试网采编

分享:

  使用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) );

42/4<1234>
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海漕溪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号