不带复制构造函数的c++赋值操作符

C++ Assignment Operator without Copy Constructor

本文关键字:c++ 赋值操作符 构造函数 复制      更新时间:2023-10-16

问题:可以定义赋值操作符而不定义复制构造函数吗?对于内部类(未在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
};