簡體   English   中英

static function 如何訪問 class 的私有成員函數(構造函數)

[英]How static function is accessing private member function(constructor) of a class

我遇到了如下代碼,它基本上是 singleton class 的示例,其中我們將 class 構造函數設為私有,並提供一個 static 公共 function 以在需要時創建 class 的實例。

我的問題是,當我們調用new運算符在static function內部創建一個singleton class的object時,那么class的構造函數肯定會被調用。 我很困惑它是如何發生的,因為據我所知,static function 只能訪問 static 成員和 class 的 static 函數那么它如何訪問私有 function(即本例中的 818 構造函數 39)?

static function 可以在不創建任何實例的情況下調用 class 的任何私人或公共成員 function 嗎?

#include <iostream>

using namespace std;

class Singleton
{
public:
    static Singleton *getInstance(); 

private:
    Singleton(){}
    static Singleton* instance;
};

Singleton* Singleton::instance = 0;
Singleton* Singleton::getInstance() 
{
    if(!instance) {
        instance = new Singleton(); //private ctor will be called
        cout << "getInstance(): First instance\n";
        return instance;
    }
    else {
        cout << "getInstance(): previous instance\n";
        return instance;
    }
}

int main()
{
    Singleton *s1 = Singleton::getInstance();
    Singleton *s2 = Singleton::getInstance();
    return 0;
}

但是當我編寫如下示例代碼時:

class Sample
{
    private:
        void testFunc()
        {
            std::cout << "Inside private function" <<std::endl;
        }
    public:
        static void statFunc()
        {
            std::cout << "Inside static function" <<std::endl;
            testFunc();
        }
};

int main()
{
    Sample::statFunc();

    return 0;
}

我收到 g++ 的編譯錯誤:

file.cpp: In static member function ‘static void Sample::statFunc()’:
file.cpp:61: error: cannot call member function ‘void Sample::testFunc()’ without object. 

如果我們可以訪問 class 的私有 function 和 static 公共 function 那么為什么我會收到此錯誤?

static function 可以在不創建任何實例的情況下調用 class 的任何私人或公共成員 function 嗎?

正在創建一個實例。

instance = new Singleton();

new關鍵字創建Singleton object。

而且,是的,因為Singleton::getInstance是 class 的成員 function,所以它能夠調用構造函數(盡管請注意,您只是間接地這樣做),無論它是否為static

上述代碼之所以有效,是因為getInstance()的實現調用了不需要 object 實例的構造函數。

Static 成員函數屬於 class 而不是 object。因此,當調用 static 成員 function 時,沒有 object 的實例,您無法訪問this指針,因為沒有。 如果要從 static function 訪問非靜態私有成員函數,則需要將 object 的引用傳遞給 function。例如

例如

class foo {
    public:
          foo(int i) : myInt(i) {}
          static int myStaticMethod(foo & obj);
    private:
          int myInt;
    };

    int foo::myStaticMethod(foo & obj) {
          return obj.myInt;
    }

#include <iostream>


int main() {
foo f(1);
std::cout << foo::myStaticMethod(f);
return 0;
};

回答您稍后添加的問題的第二部分:

class Sample
{
private:
  void testFunc()
  {
    std::cout << "Inside private function" << std::endl;
  }
public:
  static void statFunc()
  {
    std::cout << "Inside static function" << std::endl;

    Sample s;
    s.testFunc();          // this is OK, there is an object (s) and we call 
                           // testFunc upon s

    // testFunc();         // this is not OK, there is no object
  }
  void InstanceFunction()
  {
    std::cout << "Inside public instance function" << std::endl;
    testFunc();
  }
};


int main()
{
  Sample s;
  s.InstanceFunction();

  Sample::statFunc();
  return 0;
}

調用testFunc(); statFunc內部無法完成,因為testFunc (私有或非私有)是一個實例function,你需要一個testFunc可以操作的Sample object,但statFunc是一個static function,因此沒有Sample object。

錯誤消息對此非常清楚。

僅當您提供 object 時,才能從statFunc調用testFunc ,請參見上面的代碼。

暫無
暫無

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

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