"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
}
使这难以理解的最大问题是,在函数的定义中,它返回*this
。*this
是const
对象吗?我不认为是这样,当返回类型应该const
时,为什么允许我们返回非const
对象?
在非静态成员函数的主体中,表达式this
可用于获取指向调用该函数的对象的指针 [expr.prim.this]。由于您的operator =
不是 const 成员函数,因此this
将指向一个非 const 对象(这是有意义的,因为我们正在为某些东西分配一个新值(。因此,*this
将导致类型为cAssignmentOprOverload
的非常量左值。但是,对 const 的引用可以绑定到非 const lvalue [dcl.init.ref]/5.1.1。通常,不太常量限定的类型始终可以隐式转换为更常量限定的类型。这是有道理的:你应该能够在不可修改的对象足够的地方使用可修改的对象。通过将可修改的对象视为不可修改对象,实际上不会出错。发生的所有情况是,您丢失了该对象实际上是可修改的信息。恰恰相反,将不可修改的对象视为可修改的对象是有问题的......
请注意,这种编写重载operator =
的方式不是通常完成的方式。规范形式将是
cAssignmentOprOverload& operator=(const cAssignmentOprOverload& otherList)
即,返回对非恒量...
来自 implicit_conversion
指向- 符合 cv 条件的类型 T 的指针类型的 prvalue 可以转换为指向更符合 cv 条件的相同类型 T 的 prvalue 指针(换句话说,可以添加恒定性和波动性(。
相关文章:
- 被解释为低级别const的const对象的地址
- 使用共享指针的函数调用,其对象应为 const
- 如何从构造函数副本 T(const T&)调用对象 T?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 无法使用类型 'const char *' 的左值初始化类型 'char *' 的成员子对象
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- "this"指向的对象是否与 const 对象相同?
- const auto & 和 auto & if reference 对象之间的区别是 const
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- C++ - 确定 const char* 是指向字符串文本对象还是动态对象
- 为什么 const YAML::Node 对象的行为不像 yaml-cpp 中的类似值的对象?
- 从 const 对象访问非 const 方法
- 将非 const 对象用于 const 参数
- 如何键入用于const对象的自定义io操纵器
- 对临时对象的Const引用不会延长其生存期
- 正在通过const-ref未定义的行为捕获新构造的对象
- 具有成员变量的对象 Const 数组 = 先前索引成员变量的总和
- 为什么我构建的临时对象const不可变
- 强制用户声明对象const