此指针作为常量指针
this pointer as a const pointer
我读到this
指针是一个const pointer
(听起来完全合乎逻辑),它可以让我们更改它指向的对象,但不能更改它所持有的地址。但是当我这样做时:
#include<iostream>
using namespace std;
class A
{
int val;
public:
class A* fun()
{
return this;
}
};
int main()
{
class A objA;
class A objB;
*(objA.fun())=objB;
return 0;
}
即使返回的指针保存objA
的地址,它也很容易保存objB
的地址。简单变量的类似代码失败了,怎么可能:
int main()
{
int i;
int *const p=&i;
p=&i;
return 0;
}
objA.fun()
计算到objA
的地址(换句话说,它是&objA
)。所以你正在做的是:
*(&objA) = objB;
相当于:
objA = objB;
所以你只是把objB
复制到objA
.
您的问题意味着以下内容会更改A
的地址:
*(objA.fun())=objB;
很简单,它没有。
您正在取消引用objA
的this
指针的副本并分配给该副本。 换句话说,以上所做的只是调用objA.operator=(objB)
。
你在这里根本没有分配给this
。相反,您将在包含赋值的表达式中使用this
的值。
嗯,这里有两件事在起作用。首先,fun()
不会通过引用返回this
。它按值传递它。
这意味着类似于以下代码片段的内容:
objA.fun()=&objB;
不会更改this
的值。objA.fun()
返回存储在this
中的地址的副本,而不是对this
本身的引用。这意味着我们不能用这段代码改变this
本身,即使我们想这样做。
为了能够更改this
本身,您需要通过引用传递this
,如下所示:
A* const& fun()
{
return this;
}
现在,这个片段:
objA.fun()=&objB;
将无法像您期望的那样编译,因为它大致相当于您发布的其他代码。
其次,这里还有其他一些东西在起作用,使你的第一个代码与第二个代码不同。也就是说,您正在取消引用指针。你正在做的是这个:
*(objA.fun())=objB;
这与您的其他代码不同,原因之一是:*
.*
运算符取消引用指针,这意味着您现在引用的是指针的内容,而不是指针本身。这意味着您正在执行此操作:
int main()
{
int i;
int i2 = 42;
int *const p=&i;
*p=i2;
return 0;
}
这不是一回事。在此示例中,您正在更改存储在p
中的值,但不会更改p
。您的原始代码大致等同于此代码,这就是它编译的原因。
- 将常量指针引用绑定到非常量指针
- 如何使用数据对象上的常量指针初始化类
- C++中的指针和常量问题不大
- 为什么我收到"从常量指针到指针的转换无效?
- 当成员值从指针更改为非指针时,C++常量问题
- 使用双指针传递 2D 常量数组
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- 初始化指针的常量向量
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 什么是常量指针常量引用类型的参数?(const X* const & p)
- 无法将"常量指针常量"传递给常量引用
- C++:如何创建一个临时对象,包含一个指针 - 常量或非常量,具体取决于上下文
- 具有函数指针常量数组的 C++ 模板化静态类
- 这个constexpr整数不是空指针常量吗
- 使指针常量C++
- C++11在stl容器中共享指针常量
- 空指针常量转换为右值
- 在参考 (T&) 和常量指针 (T* 常量) 之间进行选择