【问题标题】:Pointers to members in C++ [duplicate]指向 C++ 中成员的指针 [重复]
【发布时间】:2015-11-08 09:52:12
【问题描述】:
#include <iostream>
using namespace std;

class Sample
{
    public:
        int *pxx;
        int x;

        void setD(int y)
        {
            x=y;
        }

        void print()
        {
            int Sample::*px = &Sample :: x; 
            cout<<"\nx : "<<x;
            cout<<"\nAddress of x : "<<&x;
            cout<<"\nValue of X indirected through px :"<<this->*px;
            //cout<<"\nValue of X indirected through px :"<<*px; ERROR
            //cout<<"\nAddress of x i.e. px : "<<px; NO ERROR BUT UNDESIRED OUTPUT(The output is most of the time '1')
            //cout<<"\nAddress of x i.e. px : "<<this->px; ERROR
        }
};

我已经读过,当使用语法data type &lt;class_name&gt; :: * &lt;pointer&gt; = &amp;&lt;class_name&gt; :: &lt;variable_name&gt; 声明指针时,它就像类成员一样,那么为什么不允许我执行上述程序的 cmets 中给出的那些语句(除了 1)。 px和pxx有什么区别吗(除了scope)?

【问题讨论】:

  • 类成员指针的使用方法可以参考stackoverflow.com/questions/670734/…
  • 我之前提到过。我只想知道这个指向成员的指针的范围是什么以及它是否归类为类成员

标签: c++ pointers


【解决方案1】:

嗯,不,它不应该“像班级成员一样行事”。那不是真的。我不知道你从哪里弄来的。

它应该作为指向成员类型的值。而这样的指针需要-&gt;*.* 操作符来解引用

cout << "\nValue of X indirected through px :" << this->*px;
cout << "\nValue of X indirected through px :" << (*this).*px;

而且,如您所见,这些运算符需要左侧的特定对象。您不能仅仅取消引用 px 本身。它本身没有任何意义。

pointer-to-data-member 类型的值是“偏移量”(从包含对象的开头测量的数据的偏移量)的低级概念的语言级实现。为了通过给定的偏移量找到实际数据,您必须有一个起点来测量该偏移量。这就是-&gt;.*左侧的对象表达式所代表的。

【讨论】:

  • 我无法掌握“指向类成员的指针”(您是指指向指针/双指针的指针吗?)。请您详细说明一下(举一个简单的例子。)为什么声明cout&lt;&lt;"\nAddress of x i.e. px : "&lt;&lt;px;没有产生错误?
  • @Khan Zaid:“指向成员的指针”是一种特殊的实体,与普通的常规指针有很大不同。因此,有 regular 类型的指针,也有 pointer-to-member 类型的指针。再想一想,也许应该避免使用这种听起来多余的术语。没有它,人们也可以说同样的话。 (我会尝试改写答案)。不,它与双指针无关。
  • 你为什么期望cout &lt;&lt; px; 产生错误?此代码不会尝试 dereference 指针,这意味着我上面所说的关于 dereference 此类指针的内容不适用。这段代码简单地使用了这样一个事实,即此类指针(就像常规指针一样)可以转换为bool 类型。 IE。相当于cout &lt;&lt; (bool) px;
  • 那么这些'指向成员的指针'不是“本身没有意义”,那么为什么cout&lt;&lt;this-&gt;px;会产生错误呢?我错过了什么吗?
  • @Khan Zaid:嗯......有指向成员的有效表达式。并且存在带有指向成员的指针的无效表达式。 pxthis-&gt;*px(*this).*px 是有效的表达式。 this-&gt;px 是无效的。为什么会让你感到惊讶?你为什么期望它编译?你认为它应该怎么做?
猜你喜欢
  • 2018-03-24
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多