簡體   English   中英

為什么我可以通過靜態指針調用非靜態函數?

[英]Why can I call a non-static function by a static pointer?

我以為我不能使用靜態指針來調用非靜態函數,因為我認為靜態指針屬於整個類,但非靜態函數屬於特定對象。 但不知何故,我成功了,不知道為什么會這樣。

這是我的代碼:

#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();
}

代碼運行,並打印“這是所需的值”。 但我有點困惑,因為我認為代碼無法運行。 這是因為我將特定對象的地址分配給指針,以便它可以工作嗎? 或者無論在哪種情況下,靜態指針只能調用非靜態函數?

任何想法都將超過贊賞。

(假設B繼承自A (參見你問題的評論)。)

static成員函數意味着您不能使用類/對象的this指針。 A::function1()您不使用this -pointer。 相反,你調用一個實際實例( B )的函數,它可能是靜態的,也可能不是靜態的。 是否通過靜態/非靜態指針/引用訪問該實例無關緊要。 因此您的使用是有效的。

但是,您的代碼非常混亂。 你的show()函數無論如何都不使用該類的任何變量,所以它也可能是靜態的。 另外,使用指向另一個B類對象的指針從A的靜態成員函數調用非靜態成員函數似乎也難以置信。 你可能會在其中的一些實例的數據的情況下結束了B當你期待的一些實例的數據被用於A使用。

我以為我不能使用靜態指針來調用非靜態函數,因為我認為靜態指針屬於整個類,但非靜態函數屬於特定對象。

靜態成員指針屬於“整個”類,因此所有實例(或其他靜態成員函數)都可以訪問它。 但是一旦他們訪問它,他們只能訪問一個指針。

具體而言,如果指針指向同一個類的實例,那么這些函數也可以訪問該指針所指向的對象的私有成員。

如果我正確理解了這個問題,你就會問

static B* mUpdater;

具體來說,你很驚訝

mUpdater->show(final);

是合法的C ++。

重要的是要理解上面的static關鍵字是指mUpdater ,而不是它所指向的。 也就是說,有一個指針,由所有A共享,指向B類的單個對象

當編寫mUpdater->show()即取消引用A::mUpdater訪問單B對象,並調用show()該方法B

您可以進一步簡化您的示例,這樣可以更輕松地從周圍的干擾中挑選您的問題:

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM