【问题标题】:about copy constructor and overloaded assignment operator关于复制构造函数和重载赋值运算符
【发布时间】:2013-10-23 18:51:05
【问题描述】:

我想知道在什么情况下应该定义复制构造函数或赋值运算符。从我的研究中我看到,每当值是按值传递或按值返回时,都需要定义复制构造函数和重载赋值运算符。但是,当指针或引用通过指针或引用(&)传递/返回时,我们是否需要复制构造函数/重载赋值运算符

class Sample
{
 public :
  // Assume a constructor that sets the node member
  SampleNode * getNode()
  {
    return _node;
  }
 private: 
  SampleNode * node;
}

class SampleNode
{
  public:
   void getValue()
   {
      return _value;
   }
  private: 
   unsigned int value;
}

main()
{
  Sample * ptr = new Sample(15);

  SampleNode *node = getNode(); // Do we need a copy constructor here?
}

【问题讨论】:

  • 该代码毫无意义。你会得到大量的编译器错误。给出几个问题: 1. new Sample(15) 不能工作。没有合适的构造函数。 2.返回_node。未识别的标识符_node。 3.getNode();未识别的函数 getNode。等等等等。
  • 您的示例在技术上具有未定义的行为(除非您将其与编译器错误一起修复),但请记住,如果您做对了,编译器通常会为您提供这些行为。
  • 你应该了解rule of three
  • 当您通过值而不是通过引用传递时使用复制构造函数/赋值。在这种情况下,您正在使用指针做所有事情。一款危险的游戏,但它确实可以让您避免担心复制构造函数。
  • 对不起代码。我只是想出了一个示例代码,只是为了说明我的问题。这肯定会产生很多编译器错误。 @MadScienceDreams:你为什么说这是一个危险的游戏?请让我知道在编码时是否需要记住隐藏的角落案例

标签: c++


【解决方案1】:

定义一个对象的指针或引用不需要使用任何构造函数。

【讨论】:

    猜你喜欢
    • 2014-10-12
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    相关资源
    最近更新 更多