使用 "this" 取消引用指针

dereferencing pointers using "this"

我试图以两种方式使用 this 关键字在我的 class 中调用一个变量,但我对第二种方式感到困惑。正确的解引用方式恰好是“(*this).num”,然而,I 想知道为什么“*(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) 它有效。但为什么它在我的 class 中不起作用?

.precedence 高于 *

所以写*(this).num等价于(*((this).num)))。或者 *(this.num).

您的第二个示例与第一个示例完全不同,因为无法访问成员 .->

如果您不知道所有的优先顺序,或者即使您知道,添加适当的括号通常可读性更好。

您正在使用两个运算符:indirection/dereferincing 运算符 * 和成员访问运算符 .

如果您查看 the precedence of these operators,您会发现 . 的优先级高于 *(也就是说,. 将在 *), 因此 *(this).num*(this.num).

基本相同

由于 this 是一个指针,您不能在其上使用 . 运算符,这也是错误消息告诉您的内容(尝试使用 -> 代替) .

你的第二个例子之所以有效,是因为你没有使用 . 运算符,因此没有优先级被搞乱。

一个有效,另一个无效,因为它们不是一回事!

*(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,然后解引用结果,在本例中是 int。很好,和*ptr一样。

*(this).num 等于。使用 *this.num 表示获取其中的 num 个成员。在取消引用数字之后。如您所见,这是不正确的,因为 "this" 是指向当前对象的指针。

(*this).num 表示解引用this,然后获取num成员。

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