通過UE4原始碼學C++語法(一):類靜態成員函式和類靜態成員變數
阿新 • • 發佈:2022-05-30
在為專案配置好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的 ;
③必須在類外區域進行賦值,即進行分配記憶體,其儲存區域在全域性區。