不带复制构造函数的c++赋值操作符
C++ Assignment Operator without Copy Constructor
问题:可以定义赋值操作符而不定义复制构造函数吗?对于内部类(未在API中公开),这仍然是一个糟糕的设计实践吗?
我需要它的原因:正如这个问题所提到的,QObject
将其复制构造函数和赋值操作符设置为私有,因此如果子类试图使用其中任何一个,则在编译时发出错误。
我需要定义一个赋值运算符,但是为了复制"值"(而不是Qobject
文档所描述的"标识")。我没有在任何地方使用这个类的复制构造函数。
我不想写复制构造函数的原因是它会复制我不会使用的代码。
没有什么能阻止你。然而,这是一个相当愚蠢的想法。
T t = GetSomeT();
和
T t;
t = GetSomeT();
将第一个转换为第二个非常简单,但是你让我这样做只是在浪费我的时间,无论是开发人员还是处理器。如果它不是默认可构造的,我想它会更难……但我还是不明白这有什么意义。如果复制构造函数不重要,可以由编译器定义,如果需要DRY,甚至可以根据赋值操作符定义。
class T {
T(const T& ref) {
*this = ref;
}
};
没有复制构造函数还会限制复制-交换的能力,这是实现赋值操作符的常用方式。
虽然这是可能的,但正如DeadMG所说,这是相当愚蠢的。
不必从自己的构造函数中调用基类的复制构造函数,因此,如果必须具有值语义,则仍然可以这样做。但在QObject
的背景下,这仍然是相当不正统的。即使对于您自己的内部类,也需要牢记最少意外原则。
如果绝对必要,我会避免使用传统的复制构造函数/赋值操作符,而使用成员函数。QObject
衍生物的预期语义将得到维护,但是您有一种方法可以显式地执行您想要完成的操作。
struct SomeType : QObject {
QSharedPointer<SomeType> Clone() const;
//or
SomeType& CopyValue(const SomeType&);
//rest of implementation
};
相关文章:
- c++中的重载赋值操作符
- c++类继承和赋值操作符
- 带引用类成员的赋值操作符
- 复制构造函数,赋值操作符重载
- c++派生类赋值操作符
- 通过调用Move赋值操作符实现Move构造函数
- 带有映射的赋值操作符
- 单参数构造函数和赋值操作符
- 如何从复制赋值操作符调用复制构造函数
- c++复制构造函数,重载赋值操作符,方法get()
- 用于具有const数据成员的类的move和右值赋值操作符
- 类赋值操作符和复制构造函数
- 赋值操作符重载
- 影响正确性的move构造函数/赋值操作符示例
- 当类是子类时重载赋值操作符
- 如果没有定义Move语义(Move构造函数和Move赋值操作符),编译器是否默认优化
- 在类赋值操作符函数中,为什么必须返回*this ?
- 模板类的重载赋值操作符
- 使用重载赋值操作符
- 类和向量的重载赋值操作符