在Qt的对象模型中,我们需要将一部分QT对C++新增的对象作为标识(identity)而不是值(value)。这里说一下标识和值的区别:值是拷贝的或者分配来的;标识则是克隆来的。克隆意味着建立新的标识,而不仅仅是旧标识的一份拷贝。举个例子,双胞胎是不同的标识(identity),他们看起来是一样的,但是他们有不同的名字,不同的地点,和许多完全不同的社会关系网。
克隆一个标识是比拷贝和分配值更复杂的操作。我们在QT对象模型中看到这样的情形。
一个QT对象:
1 也许有一个独特的QObject::objectName()。如果我们拷贝一个Qt对象,我们将给这份拷贝什么名字?
2 在对象层次中有位置。如果我们拷贝QT对象,这份拷贝将放在何处?
3 可以关联到其他QT对象,来发送或者接受信号,如果们拷贝一个QT对象,我们如何将这些链接转移到拷贝对象上?
4 可以在运行时增加新的属性,这些属相在声明时则没有。如果我们拷贝QT对象,是否拷贝对象包含了原始对象的新增属性?
克隆一个标识是比拷贝和分配值更复杂的操作。我们在QT对象模型中看到这样的情形。
一个QT对象:
1 也许有一个独特的QObject::objectName()。如果我们拷贝一个Qt对象,我们将给这份拷贝什么名字?
2 在对象层次中有位置。如果我们拷贝QT对象,这份拷贝将放在何处?
3 可以关联到其他QT对象,来发送或者接受信号,如果们拷贝一个QT对象,我们如何将这些链接转移到拷贝对象上?
4 可以在运行时增加新的属性,这些属相在声明时则没有。如果我们拷贝QT对象,是否拷贝对象包含了原始对象的新增属性?
出于这样的原因,QT对象被作为标识(identity)对待而不是值(value)。标识是被克隆的,不是拷贝或者分配来的,同时克隆一个标识是比复制或者分配值更加复杂的操作。因此,QObject及其所有子类(直接子类或者间接子类)的拷贝构造函数和赋值运算符都是无效的。