首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++:赋值操作符:按值传递(复制和交换)与按引用传递

C++:赋值操作符:按值传递(复制和交换)与按引用传递
EN

Stack Overflow用户
提问于 2020-05-03 12:35:10
回答 3查看 762关注 0票数 4

考虑到抄袭互换成语的优势。

为什么我们仍然需要复制赋值操作员接受引用作为主流?

代码语言:javascript
复制
class T {
public:

    // 1: Why still commonly this?
    T& operator=(const T& rhs);

    // 2: Why not mostly that?
    T& operator=(T rhs);
}

有一些答案建议使用后者(这里这里)。

然而,大多数这样的例子仍然围绕着按引用传递operator=

甚至合并了C++ FAQ 指出 (是的,是关于const的,但是.):

class Fred的复制构造函数和赋值操作符应该在参数中包含const:分别是Fred::Fred(const Fred&)Fred& Fred::operator=(const Fred&)

显然,复制和交换是可以通过按引用传递的-如果复制无论如何都是不必要的。人们还可能希望避免立即进行复制(在体内有条件地执行)--这不是较少的情况(可能是过早的优化)吗?

不应该使用按值传递的方法来复制和交换??

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-04 15:30:08

我被指到了有价值的提示

例如,有没有想过为什么高性能/经常使用std::类型如std::vectorstd::string不使用复制/交换?

我发现的关于交换副本的一切都是关于优化(避免复制,重新使用lhs):

  • 很明显,自我分配是不可行的。
  • lhsrhs的空间时,另一种常见的可能性发生在(STL)容器中: 类容器{ public: //如果通过值传递,创建的副本将无条件地增加容量: T& operator=(const容器& rhs) { // .如果(此->容量() >= rhs.size()) { //重用能力.}其他{ //增加容量.}} 注意,提示还提到(STL)容器。

operator=的折中之处是:

  • 按值+复制和交换:通过强大的异常保证简化了(节省人力时间)
  • 参考允许优化(节省机器时间)可能削弱保证

有关答复:

票数 0
EN

Stack Overflow用户

发布于 2020-05-03 12:41:17

当您需要更快的执行时,传递引用是为了避免不必要的复制,而传递const引用是当您想要快速传递它并且只读的时候。而传递复制是当您希望复制对象以便能够在函数的执行/实现过程中对其进行操作时。

票数 0
EN

Stack Overflow用户

发布于 2020-05-03 13:09:39

由于复制可能被删除,第二个选项可能不会在每个类上工作,因为它会创建虚假的、无用的副本。

第一种选择有很多(如果不是全部的话)的优点:没有拷贝,只读语义,总是可用的.

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

https://stackoverflow.com/questions/61574514

复制
相关文章

相似问题

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