【问题标题】:dereferencing pointers using "this"使用“this”取消引用指针
【发布时间】:2015-12-31 14:29:52
【问题描述】:

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

【问题讨论】:

  • 您的代码与问题 I. Ed. 不同。括号的位置
  • 我的问题是为什么 astrick 需要在类的括号内,而另一方面,在另一个完全不同的情况下,括号外的 astrick 并不重要。我知道这与在我的班级中调用“num”变量有关,但不知道 excat 原因@EdHeal

标签: c++ class pointers this dereference


【解决方案1】:

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

【讨论】:

  • 太棒了!非常感谢。我明白了,首先取消引用然后添加 .num。
【解决方案2】:

您正在使用两个运算符:间接/解引用运算符* 和成员访问运算符.

如果您查看the precedence of these operators,您会发现. 的优先级高于*(也就是说,. 将在* 之前应用),因此*(this).num 是和写*(this.num)基本一样。

由于this 是一个指针,因此您不能在其上使用. 运算符,这也是错误消息告诉您的内容(请尝试使用-&gt;)。

您的第二个示例有效的原因是您没有使用 . 运算符,因此没有优先级被搞砸。

【讨论】:

    【解决方案3】:

    .precedence 高于 *

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

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

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

    【讨论】:

      【解决方案4】:

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

      *(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 完全不同。

      【讨论】:

        【解决方案5】:

        简短的回答是语法。

        (ptr) 看起来像这样:首先在 () 中计算 expr,然后取消引用在这种情况下为 int 的结果。没关系,和*ptr一样。

        *(this).num 是 eq。使用 *this.num 表示获取 this 的 num 成员。在那之后取消引用编号。如您所见,这是不正确的,因为“this”是指向当前对象的指针。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-20
          • 2019-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多