此指针作为常量指针

this pointer as a const pointer

本文关键字:指针 常量      更新时间:2023-10-16

我读到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;

很简单,它没有。

您正在取消引用objAthis指针的副本并分配给该副本。 换句话说,以上所做的只是调用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。您的原始代码大致等同于此代码,这就是它编译的原因。