使用"this"取消引用指针

dereferencing pointers using "this"

本文关键字:指针 引用 this 使用 取消      更新时间:2023-10-16

我试图以两种方式使用此关键字在我的类中调用变量,但我对第二种方式感到困惑。正确的解引用方式是"(*this)"。然而,想知道为什么"*"(这个)。"Num"也不对。我用*(this)得到的错误。num是

在'this'中请求成员'num',该成员是指针类型为 lass const'*

class::class(int n): num(n)
{
cout << "num= " << num << endl;
cout << "this->num" << this->num << endl;
cout << "(*this).num" << (*this).num << endl;
}
因为如果你定义了

int i = 9;
int *ptr = &i;
cout<<*(ptr)<<endl;

和调用*(ptr)它工作。但为什么在我的课上不起作用呢?

这只是操作符优先级的问题。二进制点运算符比一元星号运算符具有更高的优先级,因此*(this).num(括号在那里没有作用)被解释为*(this.num),而不是(*this).num。编译器告诉你,因为this是一个指针,this.num没有意义:你不能直接对指针应用点运算符。

您使用了两个操作符:间接/解引用操作符*和成员访问操作符.

如果你看一下这些操作符的优先级,你会发现.的优先级高于*(即.将在*之前应用),因此*(this).num基本上与写*(this.num)相同。

因为this是一个指针,你不能在它上面使用.操作符,这也是错误信息告诉你的(尝试使用->代替)。

第二个示例之所以有效,是因为您没有使用.操作符,因此没有混淆优先级。

.优先于*

所以写*(this).num相当于(*((this).num)))。或*(this.num) .

你的第二个例子与第一个完全不同,因为没有访问成员.->

如果你不知道所有的优先级,或者即使你知道,添加适当的括号通常更容易读。

一个可以工作,另一个不能,因为它们不是同一件事!

*(ptr)*(this)是相同的,但*(this).num(*this).num不相同,这就是添加括号的全部意义!它们改变子表达式的分组方式,就像在数学中一样。

(ptr)(this)中的括号是完全多余的,您正在分组单个子表达式,它什么也不做。在(*this)中,它不是多余的,它确保你解引用指针,所以在(*this).num中,它首先解引用指针,然后,然后成员访问.num应用于解引用的结果。

与数学比较:

(1) = 1,同样(ptr) = ptr

-(1) = -1,同样*(ptr) = *ptr

但是-(1 + 3)和-(1)+ 3是完全不同的,因为你改变了运算符的顺序

同样,*(this.num)(*this).num也完全不同。

简单来说就是语法。

(ptr)看起来像这样:首先计算expr inside(),然后对结果解引用,在这种情况下是int。这很好,和*ptr一样。

*(这)。Num等于*this。也就是取这个的第Num个元素。这是不正确的,因为"this"是指向当前对象的指针。

(*)。Num表示解引用this,然后获得Num成员