C ++将操作符放在类的末尾的目的是什么?

时间:2017-11-22 09:35:53

标签: c++ operator-keyword

假设我有一个名为Component的简单c ++组件,如下所示:

class Component {
 public:
  explicit Component(int i)
  : _integer(i) {
  }

  ~Component() {
  }

  private:
   int _integer;

  Component(const Component&);
  Component& operator=(const Component&);
};

我通常在代码中发现我读了最后两条指令,但我真的不明白。是否必须正确使用该组件?

2 个答案:

答案 0 :(得分:10)

这声明了operator=的重载。重载操作符通常允许您控制赋值表达式(a = b)的执行方式。

然而,在这种情况下,感兴趣的不是运营商最后的事实,而是它在私有访问说明符下。这意味着外部代码可能不会对Component个对象执行赋值(或复制构造,因为复制c'tor也存在)。

类中的代码(在成员函数中)可以赋值和复制构造。但我会说它不太可能。将这两个特殊成员函数标记为私有,而不是定义它们是C ++ 03禁用类复制的方法。必须声明它们以防止编译器合成默认的复制构造函数和赋值运算符。

在现代C ++中,可以通过显式删除这些函数将“未定义符号”错误转换为编译时错误:

Component(const Component&) = delete;
Component& operator=(const Component&) = delete;

答案 1 :(得分:0)

将复制构造函数和复制赋值运算符的声明放在类的私有部分中,使该类的对象不可复制。