C++ 的靜態成員變數為什麼一定要在類外定義
C++ 的靜態成員變數為什麼一定要在類外定義
函式如下,在C++中宣告靜態成員變數的時候,在類中只是進行了宣告,並沒有實際的申請出指標的記憶體,真正的記憶體是定義初始化的時候才會進行記憶體的申請,因此,又因為static型別的變數都是隨著類的,因此不能隨著物件的建立而申請記憶體,所以需要單獨的進行類外定義,在定義的時候C++編譯器會申請記憶體給靜態指標。
#include <iostream>
using namespace std;
class Singleton
{
private:
Singleton()
{
cout << "sluggard singleton construct start." << endl;
}
public:
static Singleton *getInstance(void)
{
if(NULL == m_psl) // 懶漢式,每次獲取例項都要判斷,在多執行緒中會存在問題
{
m_psl = new Singleton;
}
return m_psl;
}
static void FreeInstance()
{
if(NULL != m_psl)
{
delete m_psl;
m_psl = NULL;
}
}
private:
static Singleton *m_psl;
};
Singleton *Singleton::m_psl = NULL;
// 懶漢式,只有在使用的時候才會去建立
// 存在的問題,多個執行緒同時首次呼叫時,可能會出現建立多次的問題(導致記憶體洩漏)
int main(int argc, char const *argv[])
{
// 使用功能去全域性獲取介面獲取資源
Singleton *p1 = Singleton::getInstance();
Singleton *p2 = Singleton::getInstance();
if(p1 == p2)
{
cout << "p1 equal p2" << endl;
}
else
{
cout << "p1 not equal p2" << endl;
}
// 手動釋放單例模式建立的唯一一個物件
Singleton::FreeInstance();
cout << "singleton." << endl;
return 0;
}
相關文章
- 類的靜態成員變數和普通成員變數該怎樣去區別定義變數
- C++類的靜態成員變數初始化C++變數
- c++類的靜態成員C++
- C++:類的靜態成員C++
- C++ 類的靜態成員C++
- C++類靜態成員C++
- C++類中的常成員和靜態成員C++
- C++學習筆記(三):類與物件--靜態成員變數與常成員函式C++筆記物件變數函式
- Java的靜態成員類Java
- c++中的靜態成員C++
- 【C++】為什麼不能定義陣列的引用,卻可定義變數的引用C++陣列變數
- C++ 定義靜態成員 static 關鍵字不能在定義出重複出現C++
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- C++ 類方法解析:內外定義、引數、訪問控制與靜態方法詳解C++
- C++類內成員變數可以定義引用型別嗎C++變數型別
- 獨一無二----靜態成員變數 (轉)變數
- C++ 靜態資料成員C++
- 類內的靜態成員函式函式
- 為什麼要在JAVA工廠模式中使用靜態方法Java模式
- C++ 靜態變數什麼時候完成初始化C++變數
- C++智慧指標作為成員變數C++指標變數
- 【C++】靜態持續變數?如何建立靜態持續變數?C++變數
- 模板類成員函式的定義和宣告為什麼要放在一個檔案中函式
- 靜態資料成員和靜態成員函式函式
- Java中變數之區域性變數、本類成員變數、父類成員變數的訪問方法Java變數
- Python的靜態方法和類成員方法Python
- PHP類的靜態(static)方法和靜態(static)變數PHP變數
- oop類的繼承與類靜態成員學習OOP繼承
- C/C++ 靜態變數解析C++變數
- C/C++—— 除了用類成員函式訪問類私有成員變數外,還可以通過類物件地址來直接訪問和修改類的私有成員變數C++函式變數物件
- 類成員變數的初始化變數
- 為什麼為 const 變數重新賦值不是個靜態錯誤變數賦值
- C/C++返回內部靜態成員的陷阱薦C++
- 靜態變數和非靜態變數變數
- javascript:私有變數 (靜態私有變數為什麼會被所以例項共享?-答疑解惑)JavaScript變數
- C++教程-----C++變數型別和變數的定義C++變數型別
- 子父類中成員變數變數
- c# 用反射獲得靜態類成員C#反射