C++中为什么要保证拷贝赋值对自我赋值安全

本篇内容介绍了“C++中为什么要保证拷贝赋值对自我赋值安全”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在齐河等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站制作、成都网站建设、外贸营销网站建设 网站设计制作定制设计,公司网站建设,企业网站建设,成都品牌网站建设,全网营销推广,成都外贸网站制作,齐河网站建设费用合理。

C.62:保证拷贝赋值对自我赋值安全
Reason(原因)

如果x=x改变了x的值,人们会觉得很奇怪,同时也会发生很不好的错误。(通常会包含泄露)

Example(示例)

标准库容器处理自我赋值的方式优雅且高效:

std::vector v = {3, 1, 4, 1, 5, 9};
v = v;
// the value of v is still {3, 1, 4, 1, 5, 9}
Note(注意)

产生于正确处理了自我赋值的成员的默认的赋值操作会处理自我赋值问题。

struct Bar {
   vector> v;
   map m;
   string s;
};

Bar b;
// ...
b = b;   // correct and efficient
Note(注意)

你可以通过明确地对自我赋值进行检查的方式防止自我赋值,但是通常不使用上述检查的处理方式(例如使用swap)的方式更快,更优雅。

class Foo {
   string s;
   int i;
public:
   Foo& operator=(const Foo& a);
   // ...
};

Foo& Foo::operator=(const Foo& a)   // OK, but there is a cost
{
   if (this == &a) return *this;
   s = a.s;
   i = a.i;
   return *this;
}

这种做法看起来安全并且高效。但是如果在一百万次赋值中只发生一次自我赋值的情况下会怎么样呢?大概有一百万次多余的检查(但是由于本质上结果总是一样的,计算机的分支预测会每次都猜对)。考虑下面的代码:

Foo& Foo::operator=(const Foo& a)   // simpler, and probably much better
{
   s = a.s;
   i = a.i;
   return *this;
}

std::string对自我赋值安全,int也是。所有的代价都来自(极少)发生的自我赋值。

Enforcement(实施建议)

(简单)赋值运算符不应该包含以下的检查:if (this == &a) return *this;

“C++中为什么要保证拷贝赋值对自我赋值安全”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


本文名称:C++中为什么要保证拷贝赋值对自我赋值安全
网页URL:http://cdiso.cn/article/pipegi.html

其他资讯