为什么我可以通过静态指针调用非静态函数?

时间:2016-01-28 15:15:03

标签: c++ pointers static

我以为我不能使用静态指针来调用非静态函数,因为我认为静态指针属于整个类,但非静态函数属于特定对象。但不知怎的,我让它成功了,我不确定为什么会这样。

这是我的代码:

#include <cstdio>

class B
{
public:
    void show(int aValue);
};

//B.cpp
void B::show(int aValue)
{
    if (aValue == 100)
        printf("This is the desired value");
    else
        printf("This is not the desired value");
}

class A
{
private:
    static B* mUpdater;
public:
    static int function1();
};

B* A::mUpdater = new B();
int A::function1()
{
    int final = 100;
    mUpdater->show(final); // mUpdater is a static pointer, show is a non-static function
    return 1;
}


int main()
{
    return !A::function1();
}

代码运行,并打印&#34;这是所需的值&#34;。但我有点困惑,因为我认为代码无法运行。这是因为我将特定对象的地址分配给指针,以便它可以工作吗?或者无论在哪种情况下,静态指针只能调用非静态函数?

任何想法都将得到更多的赞赏。

3 个答案:

答案 0 :(得分:2)

(我们假设B继承自A(请参阅对您问题的评论)。)

static成员函数意味着您不能使用类/对象的this指针。在A::function1()中,您不使用this - 指针。而是调用实际实例(B)的函数,该函数可能是静态的,也可能不是静态的。是否通过静态/非静态指针/引用访问该实例无关紧要。因此您的使用是有效的。

但是,您的代码非常混乱。您的show()函数无论如何都不使用该类的任何变量,因此它也可能是静态的。使用指向B类型的另一个对象的指针从A的静态成员函数调用非静态成员函数似乎也难以置信。当您期望使用某些B实例的数据时,您可能会遇到使用某些A实例的数据的情况。

答案 1 :(得分:1)

  

我以为我不能使用静态指针来调用非静态函数,因为我认为静态指针属于整个类,但非静态函数属于特定对象。

静态成员指针属于&#34;整体&#34; class,所以所有实例(或其他静态成员函数)都可以访问它。但是一旦他们访问它,他们只能访问指针。

具体而言,如果指针指向同一个类的实例,那么这些函数也可以访问该指针所指向的对象的私有成员。

答案 2 :(得分:0)

如果我正确理解了这个问题,那你就是在询问

static B* mUpdater;

具体来说,你很惊讶

mUpdater->show(final);

是合法的C ++。

重要的是要理解上面的static关键字指的是mUpdater,而不是指的是A。也就是说,有一个指针,由所有B共享,指向类mUpdater->show()的单个对象

当您撰写A::mUpdater时,会取消引用B以访问单个show()对象,并调用该B的{​​{1}}方法。

您可以进一步简化您的示例,这样可以更轻松地从周围的干扰中挑选出您的问题:

#include <cstdio>

struct B
{
    void show() {
        printf("This is B::show()\n");
    }
};

struct A
{
    static B *worker;
    static void f() {
        worker->show();
    }
};

B* A::worker = new B();


int main()
{
    A::f();
    return 0;
}