对象 "this" 指向与 const 对象相同的对象吗?
Is the object "this" points to the same as a const object?
这个问题与重载 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
}
使这个难以理解的最大问题是在函数的定义中,它 returns *this
。 *this
是 const
对象吗?我不认为这是为什么当 return 类型应该是 const
时我们允许 return 非 const
对象?
- 指向 cv 限定类型 T 的指针纯右值可以转换为指向更多 cv 限定的相同类型 T 的指针纯右值(换句话说,可以添加常量和波动性)。
在非静态成员函数体内,表达式 this
可用于获取指向函数在 [expr.prim.this]. Since your operator =
is not a const member function, this
will point to a non-const object (which makes sense since we're assigning a new value to something). Thus, *this
will result in a non-const lvalue of type cAssignmentOprOverload
. However, a reference to const can be bound to a non-const lvalue [dcl.init.ref]/5.1.1 上调用的对象的指针。通常,较少 const 限定的类型总是可以隐式转换为更多 const 限定的类型。这是有道理的:您应该 能够在不可修改的对象就足够的地方使用可修改的对象。将可修改的对象视为不可修改的对象不会出错。所发生的只是您丢失了该对象实际上是可修改的信息。恰恰相反,将不可修改的对象视为可修改的对象是有问题的……
请注意,这种写重载 operator =
的方式不是 how this is typically done。规范形式为
cAssignmentOprOverload& operator=(const cAssignmentOprOverload& otherList)
即返回对非常量的引用……
这个问题与重载 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
}
使这个难以理解的最大问题是在函数的定义中,它 returns *this
。 *this
是 const
对象吗?我不认为这是为什么当 return 类型应该是 const
时我们允许 return 非 const
对象?
- 指向 cv 限定类型 T 的指针纯右值可以转换为指向更多 cv 限定的相同类型 T 的指针纯右值(换句话说,可以添加常量和波动性)。
在非静态成员函数体内,表达式 this
可用于获取指向函数在 [expr.prim.this]. Since your operator =
is not a const member function, this
will point to a non-const object (which makes sense since we're assigning a new value to something). Thus, *this
will result in a non-const lvalue of type cAssignmentOprOverload
. However, a reference to const can be bound to a non-const lvalue [dcl.init.ref]/5.1.1 上调用的对象的指针。通常,较少 const 限定的类型总是可以隐式转换为更多 const 限定的类型。这是有道理的:您应该 能够在不可修改的对象就足够的地方使用可修改的对象。将可修改的对象视为不可修改的对象不会出错。所发生的只是您丢失了该对象实际上是可修改的信息。恰恰相反,将不可修改的对象视为可修改的对象是有问题的……
请注意,这种写重载 operator =
的方式不是 how this is typically done。规范形式为
cAssignmentOprOverload& operator=(const cAssignmentOprOverload& otherList)
即返回对非常量的引用……