这个问题与在c ++中重载赋值运算符有关。看一下下面的代码。它显示了我的书给出的使赋值运算符重载的函数定义。
const cAssignmentOprOverload& cAssignmentOprOverload::operator=(
const cAssignmentOprOverload& otherList) {
if (this != &otherList) // avoid self-assignment; Line 1
{
delete[] list; // Line 2
maxSize = otherList.maxSize; // Line 3
length = otherList.length; // Line 4
list = new int[maxSize]; // Line 5
for (int i = 0; i < length; i++) // Line 6
list[i] = otherList.list[i]; // Line 7
}
return *this; // Line 8
}
使这个问题难以理解的最大问题是,在函数定义中,它返回*this
。 *this
是const
对象吗?我不认为是这样,为什么当返回类型应该为const
时为什么允许我们返回非const
对象呢?
答案 0 :(得分:2)
在非静态成员函数的主体内,表达式this
可用于获取指向已在[expr.prim.this]上调用该函数的对象的指针。由于您的operator =
不是const成员函数,因此this
将指向一个非const对象(这很有意义,因为我们正在为某个对象分配新的值)。因此,*this
将导致类型为cAssignmentOprOverload
的非常量左值。但是,对const的引用可以绑定到非const左值[dcl.init.ref]/5.1.1。通常,const限定较少的类型始终可以隐式转换为const限定较多的类型。这是有道理的:您应该能够在不可修改的对象就足够的地方使用可修改的对象。通过将可修改的对象视为不可修改的对象,没有任何错误。所有发生的事情就是您丢失了该对象实际上是可修改的信息。相反,将不可修改的对象视为可修改的对象是有问题的……
请注意,这种写重载operator =
的方法不是how this is typically done。规范形式为
cAssignmentOprOverload& operator=(const cAssignmentOprOverload& otherList)
即返回对非常量的引用…
答案 1 :(得分:0)