【问题标题】:How to deal with reference data-members in the assignment operator, and copy constructor?如何处理赋值运算符中的引用数据成员和复制构造函数?
【发布时间】:2014-03-24 08:33:42
【问题描述】:

我有以下课程

class TVData
{
  private:
  int ID;
  Monitor& monitor;
  string pName;

}

我需要实现赋值运算符,以及一个可用于此类的copy-constructor

  • 在这种情况下如何处理引用成员,在这种情况下为TVData::monitor

【问题讨论】:

  • 您希望复制构造函数和赋值运算符具有什么语义?

标签: c++ reference


【解决方案1】:

您不能重新分配引用,因此如果您需要在赋值运算符中更改它,那么您应该将其设为指针 - 然后可以像往常一样使用 = 完成赋值,尽管仍然鼓励使用初始化器复制构造函数中的列表...

TVData(const TVData& rhs)
  : ID(rhs.ID), p_monitor(rhs.p_monitor), pNmae(rhs.pName)
{ }

【讨论】:

    【解决方案2】:

    简介

    要正确地将数据成员变量声明为引用,您需要在构造函数中使用member initialization list(在您的default- 和您的copy-构造函数)。

    重载赋值运算符的问题在于,由于引用在初始化后无法绑定到新实体(并且必须初始化),因此您无法在创建 @987654322 后更改此引用所指的内容@。

    如果您希望能够更改引用所指的内容,请考虑使用指针而不是引用。


    示例实现

    #include <iostream>
    

    struct Obj {
      Obj (int& r)
        : ref (r)
      { }
    
      Obj (Obj const& src)
        : ref (src.ref) 
      { }
    
      Obj& operator= (Obj const& src) {
        // we cannot reassign what `ref` is refering to,
        // but we can at least assign the value of `src.ref`
        // to `this->ref`
    
        ref = src.ref; // note: does not make `ref` refer to `src.ref`
      }
    
      int& ref;
    };
    

    int
    main (int argc, char *argv[])
    {
      int some_val = 0, some_other_val = 100;
    
      Obj a (some_val);
      Obj b (a); // copy `a`
      Obj c (some_other_val);
    
      b = c;
    
      b.ref += 23;
    
      std::cout << "some_val: " << some_val << std::endl;
    }
    

    some_val: 123
    

    【讨论】:

      【解决方案3】:

      引用不可复制或移动,您必须回退到指针或reference_wrapper

      【讨论】:

        【解决方案4】:

        首先,使用(非常量)引用作为类成员是相当危险的,因为在这种情况下,您必须以某种方式保证所引用的对象将比引用它的类的实例寿命更长。

        其次,您可以为此类实现复制构造函数,但您不能进行赋值,因为 C++ 引用不可重新绑定。

        为了管理这一点,您可能更喜欢使用 shared_ptr/unique_ptr,具体取决于您的类的分配语义(它是否应该共享拥有的 Monitor 或传递所有权)。如果你不拥有它,那么 weak_ptr (std:: or boost::) 是你最好的选择。

        【讨论】:

          猜你喜欢
          • 2018-03-09
          • 2011-07-19
          • 1970-01-01
          • 1970-01-01
          • 2013-04-13
          • 1970-01-01
          • 2020-06-13
          • 2011-09-01
          相关资源
          最近更新 更多