首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们在使用赋值运算符时使用复制和交换?

为什么我们在使用赋值运算符时使用复制和交换?
EN

Stack Overflow用户
提问于 2016-10-01 13:08:21
回答 3查看 107关注 0票数 0

在使用复制和交换方法时,我有一个关于赋值操作符的问题.

代码语言:javascript
复制
String & operator = (String s) // the pass-by-value parameter serves as a temporary
{
   s.swap (*this); // Non-throwing swap
   return *this;
}// Old resources released when destructor of s is called.

假设我们有一个很好的复制构造函数,它深入复制所有指针和动态分配的变量。

那么,上面的代码和下面的代码有什么区别?

代码语言:javascript
复制
String & operator = (String s) // the pass-by-value parameter serves as a temporary
{
   return s;
}

因为,我们有一个很好的复制构造函数,我认为另一个对象s是在operator=函数中创建的。那么,使用非抛出交换函数有什么意义呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-01 13:35:32

主要的区别是第二个operator=根本不改变当前对象(即*this)。

代码语言:javascript
复制
String a, b;
b = a; // b is not changed at all

注意,第二个operator=是通过引用返回s (当退出函数时它将被销毁),所以它只是一个悬空的引用。

更普遍的是,我们使用copy & swap idiom提供强大的异常安全保证,这类似于提交或回滚语义;如果操作因异常而终止,程序状态将保持不变。

代码语言:javascript
复制
String & operator = (String s) // Copy construct s. If exception happens here, 
                               // s won't be constructed, 
                               // and the state of the current object (*this) won't be changed
{
   s.swap (*this);             // Use non-throwing swap to commit the change
   return *this;               // Non-throwing operation
}
票数 3
EN

Stack Overflow用户

发布于 2016-10-01 13:28:49

不同之处在于,在第二个代码块中,您创建了String对象的复制String,返回对它的引用,然后在作用域退出时销毁副本,这将导致程序具有未定义的行为。

票数 0
EN

Stack Overflow用户

发布于 2016-10-01 13:44:12

有几个主要区别:

赋值运算符应该返回*this (而且几乎总是这样)。这使得链接作业成为可能。

代码语言:javascript
复制
String s1, s2, s3;
s1 = s2 = s3; // Now all strings ave the same value.

相反,可以返回对局部变量的引用。然后它就变成了一个悬空的引用,因为它没有指向有效的内存位置。

此外,赋值运算符必须更改指定的对象,这在代码中不会发生。

最后,为什么我们需要不扔的交换呢?假设您的赋值运算符抛出一个异常。分配失败后分配的对象的状态是什么?

某些实现可能导致对象处于无效状态,因为异常是在更改异常的过程中抛出的。

这就是交换的目的。因为,交换从未抛出,所以我们可以确保分配的对象处于有效状态。如果在交换之前抛出异常,则该对象仍然具有它的旧值,如果是在交换之后,则该对象具有它的新值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39806987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档