为啥我能够为 QObject 子类创建复制构造函数并重载赋值运算符?

Posted

技术标签:

【中文标题】为啥我能够为 QObject 子类创建复制构造函数并重载赋值运算符?【英文标题】:Why am I able to create a copy constructor and overload the assignment operator for a QObject subclass?为什么我能够为 QObject 子类创建复制构造函数并重载赋值运算符? 【发布时间】:2010-06-19 05:54:20 【问题描述】:

我的印象是 QObject 禁用了复制构造函数和赋值运算符...为什么我能够编译包含这两者的 QObject 派生?

#ifndef QVERSION_H
#define QVERSION_H

#include "silverlocklib_global.h"
#include <QtCore>

struct SILVERLOCKLIBSHARED_EXPORT QVersion : public QObject

    Q_OBJECT
    Q_PROPERTY(bool valid READ isValid)
    Q_PROPERTY(long major READ major)
    Q_PROPERTY(long minor READ minor)
    Q_PROPERTY(long build READ build)
    Q_PROPERTY(long revision READ revision)

public:
    QVersion(long major = 0, long minor = 0, long build = -1, long revision = -1, QObject *parent = NULL);
    QVersion(const QString &version, QObject *parent = NULL);
    QVersion(const QVersion &version);
    static QVersion parse(const QString& version, bool *ok = NULL);
    bool isValid() const;
    long compareTo(const QVersion &other) const;
    bool equals(const QVersion &other) const;
    QString toString() const;
    QString toString(int fieldCount) const;
    long major() const;
    inline int majorRevision() const  return (qint16)(this->m_revision >> 16); 
    long minor() const;
    inline int minorRevision() const  return (qint16)(this->m_revision & 65535); 
    long build() const;
    long revision() const;
    QVersion& operator=(const QVersion &version);
    friend bool operator==(const QVersion &v1, const QVersion &v2);
    friend bool operator!=(const QVersion &v1, const QVersion &v2);
    friend bool operator<(const QVersion &v1, const QVersion &v2);
    friend bool operator<=(const QVersion &v1, const QVersion &v2);
    friend bool operator>(const QVersion &v1, const QVersion &v2);
    friend bool operator>=(const QVersion &v1, const QVersion &v2);

private:
    inline static void copy(QVersion *const destination, const QVersion &source);
    static bool tryParseComponent(const QString &component, long *parsedComponent);

    long m_major;
    long m_minor;
    long m_build;
    long m_revision;
;

#endif // QVERSION_H

【问题讨论】:

“禁用”? C++ 中没有“禁用”复制构造函数、赋值运算符或其他任何功能。你这是什么意思? AndreyT:可以将它们设为私有。当然,任何子类都可以再次公开它们。无论如何,它们对 QObjects 毫无意义。 QObjects 有一个“身份”,当复制或分配它们时,这些假设会被打破。 【参考方案1】:

派生类总是可以声明它自己的复制构造函数和赋值运算符。如果基类通过将其设为私有并未定义来禁用它,派生类当然不能在其自己的实现中调用基类的版本,但它仍然可以实现它们。

【讨论】:

【参考方案2】:

就像对 Omnifarious 答案的补充一样。正如他所说,您可以实现派生类的复制构造函数,但您将无法使用基类的复制构造函数来初始化基类中的数据成员。

如果你不指定初始化基类数据成员的构造函数,编译器将使用基类的默认构造函数。

【讨论】:

以上是关于为啥我能够为 QObject 子类创建复制构造函数并重载赋值运算符?的主要内容,如果未能解决你的问题,请参考以下文章

即使在声明了复制构造函数之后,QObject 也会返回异常

Java 中的继承——创建子类的对象也会调用超类的构造函数。为啥?

子类为啥要调用父类的构造函数

[QT入门篇]3 QObject的拷贝构造函数与赋值运算符

java中,当实例化子类时会递归调用父类中的构造方法。这个说法对么?为啥

为啥不应该使用 Number 作为构造函数? [复制]