1. 程式人生 > 其它 >通過UE4原始碼學C++語法(一):類靜態成員函式和類靜態成員變數

通過UE4原始碼學C++語法(一):類靜態成員函式和類靜態成員變數

  在為專案配置好Steam為OnlineSubsystem後,需要獲取OnlineSubsystem使用的語句如下:

IOnlineSubsystem* OnLineSubsystem = IOnlineSubsystem::Get();
  IOnlineSubsystem以I開頭,因此是一個抽象類,所以無法例項化物件。這裡之所以能通過類直接呼叫函式Get(),就是因為將其設定為Static類靜態成員函式;

 同時在Get()函式中,又有一個變數為:
static const FName OnlineSubsystemModuleName = TEXT("OnlineSubsystem");
  此為類靜態變數。要與靜態成員變數區別開來,不過它們倆的共同點就是都儲存在全域性區。


在OnlineSubsystem.h中Get()的定義如下:
public:

virtual ~IOnlineSubsystem() {}

/**
* Get the online subsystem for a given service //獲取給定服務的聯機子系統
* @param SubsystemName - Name of the requested online service
* @return pointer to the appropriate online subsystem
*/
static IOnlineSubsystem* Get(const FName& SubsystemName = NAME_None)
{
static const FName OnlineSubsystemModuleName = TEXT("OnlineSubsystem");
FOnlineSubsystemModule& OSSModule = FModuleManager::GetModuleChecked<FOnlineSubsystemModule>(OnlineSubsystemModuleName);
return OSSModule.GetOnlineSubsystem(SubsystemName);
}

  類靜態成員函式和類成員函式的區別在於:
    ①類靜態成員函式在編譯器編譯時不會新增this指標,因為類靜態成員函式是屬於整個類,而不是某個特定的物件,所以不需要傳入this指標。
    ②正是因為類靜態成員沒有this指標,所以無法確定具體的物件,因此也只能訪問同樣是整個類所屬的靜態成員變數或靜態成員函式。
    ③正如上面舉的例子,類靜態成員函式可以通過類名直接訪問,但要注意前提是該類靜態成員函式是public的;
    ④類靜態成員函式也是可以通過物件名直接訪問,前提也同樣是類靜態成員函式必須是public的。

  類靜態成員變數和類成員變數的區別在於:
    ①類靜態成員變數屬於整個類,其生命週期不依賴於某一個物件;
    ②能通過類名和物件名直接訪問類靜態成員變數,前提是類靜態成員變數必須是public的 ;
    ③必須在類外區域進行賦值,即進行分配記憶體,其儲存區域在全域性區。