靜態成員

靜態成員是指被static修飾的成員變量或成員函數,在程序運行過程中只占一份內存,類?似于全局變量,且也存儲在全局區。
靜態成員變量邏輯上屬于類,可以通過類的權限控制靜態成員的訪問權限。
靜態成員函數內部只能訪問靜態成員變量或函數,因為靜態成員不依賴于對象的創建,所以也不可以通過this指針訪問。如果未創建對象,調用靜態成員函數里面訪問了非靜態函數或變量,邏輯上是行不通的。構造函數和析構函數也不可能是靜態的。
對象計數器
靜態成員變量的一個重要應用是統計一個類創建了多少對象。
計數器可以定義為靜態成員變量,每創建一個對象,在構造函數中計算器+1,銷毀一個對象,將計數器-1。
#include <iostream>
using namespace std;
class Student {
private:
int m_id;
static int ms_count;
public:
static int get_count() {
return ms_count;
}
Student(int id = 0) : m_id(id) {
ms_count++;
}
~Student() {
ms_count--;
}
};
int Student::ms_count = 0;
int main() {
Student* stu1 = new Student(101);
cout << Student::get_count() << " " << stu1->get_count() << endl;
Student* stu2 = new Student(102);
cout << Student::get_count() << " " << stu1->get_count() << endl;
delete stu2;
cout << Student::get_count() << " " << stu1->get_count() << endl;
return 0;
}
單例設計模式
?在程序設計過程中,經常會有只能創建一個實例的需求。比如,一個系統中可以存在多個打印任務,但是只能有一個正在工作的任務。
單例設計模式可以借助static靜態成員實現。為了防止隨意創建或刪除對象,私有化構造和析構函數,并使用類的私有靜態指針變量指向類的唯一實例,使用一個共有的靜態方法獲取該實例。?
#include <iostream>
using namespace std;
class Student {
private:
static int ms_id;
static Student* ms_stu;
Student(){}
~Student(){}
public:
static Student* createStudent(int id) {
if (ms_stu == NULL) {
ms_stu = new Student();
ms_id = id;
}
return ms_stu;
}
static void deleteStudent() {
if (ms_stu != NULL) {
delete ms_stu;
ms_id = -1;
}
}
static int getStudentId() {
return ms_id;
}
};
int Student::ms_id = -1;
Student* Student::ms_stu = NULL;
int main() {
Student* stu = Student::createStudent(101);
cout << stu->getStudentId() << endl;
stu->deleteStudent();
cout << stu->getStudentId() << endl;
return 0;
}