使用 "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
没有意义:你不能将点运算符直接应用于指针。
我试图以两种方式使用 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
没有意义:你不能将点运算符直接应用于指针。