c ++ 减少operator =和复制构造函数之间的代码重复

更新时间:2024-05-09 下载TXT文档 下载Word文档

我有一个类需要一个非默认的复制构造函数和赋值运算符(它包含指针列表)。有没有一般的方法来减少复制构造函数和赋值运算符之间的代码重复?

  • 型我认为您应该能够在运算符内部调用复制构造函数=
  • 型以下是一些答案:stackoverflow.com/questions/1457842/…

对于编写在所有情况下都有效的自定义复制构造函数和分配运算符,没有"常规方法"。但有一个成语叫做"复制-交换":

 class myclass
 {
    ...
 public:
    myclass(myclass const&);

    void swap(myclass & with);

    myclass& operator=(myclass copy) {
        this->swap(copy);
        return *this;
    }

    ...
};

它在许多情况下(但不是所有情况下)都很有用。有时候你可以做得更好。一个向量或一个字符串可以有一个更好的分配,如果它足够大,就可以重用分配的存储。

  • +1-我认为副本交换的总结很好,也很简洁。还有一个关于重用存储的好主意。
  • 您可能需要指出运算符=和更标准的const myclass&operator=(const myclass&other)之间的微妙之处;
  • swap()可能应标记为nothrow。比尔评论同上。再解释一下就好了。
  • 还要注意:>swap应该是一个自由函数"void swap(myclass&;,myclass&;)">您仍然需要枚举swap中的所有属性,而不是在赋值运算符中枚举它们。
  • 由于swap必须是专门化的,这如何防止代码重复?
  • 它不完全是"代码复制",因为初始化与赋值不同。但马修是对的。显然,您必须"枚举"交换函数中的成员。我看不到解决这个问题的方法,除非您按照默认的构造成员+分配实现您的复制ctor。但在我看来,这不是一个好的解决办法。理想情况下,您不必自己编写copy-ctor和赋值,理想情况下,您没有包含99个成员的类。
  • 运算符=()的参数应始终为常量。
  • 这里的this->swap(copy)有什么特别的地方吗,或者swap(copy)也可以工作吗?
  • @凯维纳普:没什么特别的。swap(copy)也起作用。有时,我编写this->使其更明确地表示它是数据成员或成员函数。

将公共代码分解为私有成员函数。一个简单(相当做作)的例子:

#include <iostream>

class Test
{
public:
  Test(const char* n)
  {
    name = new char[20];
    strcpy(name, n);
  }

  ~Test()
  {
    delete[] name;
  }

  // Copy constructor
  Test(const Test& t)
  {
    std::cout <<"In copy constructor.
";
    MakeDeepCopy(t);
  }

  // Assignment operator
  const Test& operator=(const Test& t)
  {
    std::cout <<"In assignment operator.
";
    MakeDeepCopy(t);
  }

  const char* get_name() const { return name; }

private:
  // Common function where the actual copying happens.
  void MakeDeepCopy(const Test& t)
  {        
    strcpy(name, t.name);
  }

private:
  char* name;
};

int
main()
{
  Test t("vijay");
  Test t2(t); // Calls copy constructor.
  Test t3(""); 
  t3 = t2; // Calls the assignment operator.

  std::cout << t.get_name() <<"," << t2.get_name() <<"," << t3.get_name() << '
';

  return 0;
}
  • +1-这几乎总是处理类中代码重复的最佳方法。
  • 内存泄漏!makedeepcopy忽略名称已经指向已分配内存的可能性。
  • 但遗憾的是,复制构造函数不能使用成员初始值设定项,这样…
  • 请注意,t2 = t2不会与书面的赋值运算符一起使用。(例如,如果要对它们的数组进行排序,则需要注意这一点。)
  • 再加一点:我认为重用不适用。创建一个新对象和分配给它有区别。在简单的成员分配足够的情况下,不需要自定义的复制构造函数和分配运算符。如果您必须做一些更高级的事情(即管理分配的内存),那么复制和分配之间的相似性接近于零。
  • @赛利比策,谢谢!固定泄漏。
  • @Selliitze示例的唯一一点是显示复制构造函数和赋值运算符所共有的任何行为都应移动到公共函数。忽略代码的所有其他缺点。
  • @维杰:但是现在你忘了为复制构造初始化"名称",这可以证明我的观点。当涉及到明确的资源管理时,复制构造和复制分配会做不同的事情。重用的可能性很小。
  • 先生,我不太明白,但是你的接线员没有退货,是吗?

My &My::operator = (My temp)  // thanks, sellibitze
{
    swap (*this, temp);
    return *this;
}

并实施专门的std::swap<> (My &, My &)。 短码网=DuanMa.NET

  • 这就是copy-swap的外观。您正在显式创建一个副本,否则可能会被删除。这里有一篇很棒的文章:cpp-next.com/archive/2009/08/want-speed-pass-by-value
  • 正如戴夫所注意到的,Alexandrescu在6年前已经发现了这一点:ddj.com/cpp/184403855。有趣的阅读!
  • 嗯,顺便说一下,海报也叫戴夫。我很抱歉弄混了-我的意思是CPP的戴夫·亚伯拉罕斯接下来:)
  • 那篇亚历山大的文章真的很有帮助。

正如许多海报所指出的,having operator=创建一个新的使用复制构造函数然后使用swap的对象是一种常用的技术,用于不必在operator=中复制代码。

也就是说,我想指出这项技术的一些优点和缺点,以帮助您决定它是否合适。

例外安全

如果您的对象有可能导致抛出的资源需求,并且假设交换不会抛出,则此技术提供了异常安全性的有力保证(被分配给的对象已经具有另一个对象的值,或者它是不变的)。

Con-资源足迹

这种技术的一个问题是,它需要在释放旧对象之前创建一个完整的新对象。如果对象需要大量资源,这可能是一个问题。

以上就是短码网小编为大家整理的《c ++ 减少operator =和复制构造函数之间的代码重复》相关内容,希望大家喜欢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若内容造成侵权/违法违规/事实不符,请将联系本站反馈,一经查实,立即处理!

c ++ 减少operator =和复制构造函数之间的代码重复》文档下载仅供参考学习,下载后请在24小时内删除。

转载注明出处:https://www.duanma.net/article/b39557e0366.html

回到顶部