假设我有一个名为Component的简单c ++组件,如下所示:
class Component {
public:
explicit Component(int i)
: _integer(i) {
}
~Component() {
}
private:
int _integer;
Component(const Component&);
Component& operator=(const Component&);
};
我通常在代码中发现我读了最后两条指令,但我真的不明白。是否必须正确使用该组件?
答案 0 :(得分:10)
这声明了operator=
的重载。重载操作符通常允许您控制赋值表达式(a = b
)的执行方式。
然而,在这种情况下,感兴趣的不是运营商最后的事实,而是它在私有访问说明符下。这意味着外部代码可能不会对Component
个对象执行赋值(或复制构造,因为复制c'tor也存在)。
类中的代码(在成员函数中)可以赋值和复制构造。但我会说它不太可能。将这两个特殊成员函数标记为私有,而不是定义它们是C ++ 03禁用类复制的方法。必须声明它们以防止编译器合成默认的复制构造函数和赋值运算符。
在现代C ++中,可以通过显式删除这些函数将“未定义符号”错误转换为编译时错误:
Component(const Component&) = delete;
Component& operator=(const Component&) = delete;
答案 1 :(得分:0)
将复制构造函数和复制赋值运算符的声明放在类的私有部分中,使该类的对象不可复制。