【问题标题】:c++ operator= method for const referencesc++ operator= const 引用的方法
【发布时间】:2010-08-04 18:52:11
【问题描述】:

我正在用这样的 const 引用编写类:

class B;

class foo {
  const B& b;

  foo(const B& newb): b(newb) { }

  void operator=(const foo & foo2) {
      // This does not work
      foo.b = foo2.b;
  }   
};

我正在尝试定义一个工作运算符 = 显然 = 不起作用,因为我不允许更改 const 引用。这有办法让引用指向另一个对象吗?

如果 b 不是 const,c++ 将为我提供一个有效的 operator=。如果我将一个成员定义为 const cl 会吐出:

警告 C4512:“foo”:无法生成赋值运算符

【问题讨论】:

  • 你的意思是写b = foo2.b;之类的东西吗?
  • operator= 不是复制构造函数,它是 operator=。复制构造函数采用Class(const Class&) 的形式。
  • 我认为这种构造形式非常危险:这提供了一种产生“悬空引用”的简单方法。如果newb 来自一个临时对象,那么该临时对象在构造函数完成时被销毁,b 将引用垃圾。
  • 是的,我的意思是 b=foo2.b;我知道这很危险。
  • 你可能正在寻找交换,cplusplus.com/reference/stl/vector/swap

标签: c++


【解决方案1】:

您要查找的术语是“重新绑定”。如“是否可以重新绑定参考?”答案是“不,引用被定义为不可重新绑定”。但是您可以使用指针并更改它所指向的内容:

class B;

class foo {
    B* b;

    foo(const B& newb)
    {
        b = &newb;
    }

    void operator=(const foo& foo2)
    {
        b = &foo2.b;
    }   
};

但是,如果被分配的对象比用于分配的对象的寿命长(顺便说一句,构造函数也存在同样的问题),这可能会导致指针悬空。很有可能您根本不需要引用或指针:

class B;

class foo {
    B b;

    foo(const B& newb): b(newb) { }

    void operator=(const foo& foo2)
    {
        b = foo2.b;
    }   
};

如果您确实需要指针/引用(可能B 是一个基类),那么您需要研究智能指针来处理对象生命周期问题。

【讨论】:

  • B 在这种情况下是一个 huge 相当大的对象。并且该类应该真正将其作为参考,因此如果对象发生更改,更改也是可见的。
  • 在这个例子中,指针和引用本质上是一样的,只是引用不能为空;无论哪种情况,对象的大小都无关紧要。
  • @plaisthos:另外,如果您分配一个指向 B 的指针,您可能会覆盖指向该 B 的最后一个指针,并且会发生内存泄漏。听起来可能不需要太多丢失的 B 就成为严重的泄漏。认真考虑智能指针。
  • @plaisthos:许多来自 Java 的程序员认为指针或引用是唯一的选择。它们不是:普通对象(“值语义”)通常就足够了。从您所说的来看,您有充分的理由使用指针/引用。由于您需要重新绑定,因此您需要指针。由于您可能必须管理各种对象的生命周期,因此您应该查看智能指针,例如 boost::share_ptr(又名 std::tr1::share_ptr)。
【解决方案2】:

我认为您的代码没有任何意义。没有名为foo 的对象,所以foo = foo2 没有意义。

【讨论】:

    【解决方案3】:

    不,一旦一个引用被初始化,它所引用的对象就不能被改变。如果你需要这样做,指针更合适。

    【讨论】:

    • 我编辑了我的问题,希望现在可以理解我正在尝试做的事情
    【解决方案4】:

    您无法更改引用所指的对象。在你的类中使用指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-13
      • 2011-06-24
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 2021-04-13
      相关资源
      最近更新 更多