1. 程式人生 > >【C++】類中靜態成員的宣告、初始化

【C++】類中靜態成員的宣告、初始化

【C++】類中靜態成員的宣告、初始化


有參考大佬 零點零一 的文章: https://blog.csdn.net/thanklife/article/details/78476737

類中靜態成員的宣告

類中的靜態資料成員是區域性靜態變數,類中的資料成員被宣告為靜態的之後,其儲存位置從原來的棧中存放改為靜態儲存區。但是區域性靜態變數在離開作用域之後,並沒有被銷燬,而是仍然駐留在記憶體當中,直到程式結束,只不過我們不能再對他進行訪問。

class Staff
{
private:
	static int count;
}

初始化

類的靜態資料成員只能在類外進行初始化,因為靜態變數是公共的,不依賴於某個物件,是獨立的。

初始化方式如下:

int Staff::count = 0;

靜態資料成員值的改變

如上的例子中,count記錄的為員工數,可以在建構函式中讓count自增1:

class Staff
{
private:
	static int count;
public:
	Staff()
	{ count++; }
}

這樣,在每宣告一個物件,count的值就+1,就達到了統計員工數的功能。

完整例子

編譯環境:Visual Studio 2017.

原始碼:

#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
int t = 1;
class Staff
{
protected:
	int code;
	string name;
	static int count;
public:
	Staff(string n)         //有問題 
	{
		name = n;
		code = t++;
		count++;
	}
	void SetName(string n)
	{
		name = n;
	}
	string GetName()
	{
		return name;
	}
	int GetCode()
	{
		return code;
	}
	int static GetStaffCount()
	{
		return count;
	}
};
int Staff::count = 0;
class Teacher :virtual public Staff
{
protected:
	string subject;
public:
	Teacher(string n, string s) :Staff(n), subject(s) {}
	void SetSubject(string s)
	{
		subject = s;
	}
	string GetSubject()
	{
		return subject;
	}
};
class Officer :virtual public Staff
{
protected:
	string work;
public:
	Officer(string n, string w) :Staff(n), work(w) {}
	void SetWork(string w)
	{
		work = w;
	}
	string GetWork()
	{
		return work;
	}
};
class Teacher_Officer :public Teacher, public Officer
{
public:
	Teacher_Officer(string n, string s, string w) :Staff(n), Teacher(n, s), Officer(n, w) {}
};
int main()
{
	Teacher t1("孔子", "儒家文學"); //建立教學類員工t1 
	Teacher t2("公輸班", "建築學");
	Officer o1("端木賜", "財務科長"); //建立教輔類員工o1 
	Teacher_Officer to3("顏回", "儒家文學", "副院長");//建立教師教輔類員工to3 

	cout << "共有教職工" << Staff::GetStaffCount() << "人" << endl;
	cout << t1.GetCode() << ", " << t1.GetName() << ", " << t1.GetSubject() << endl;
	cout << t2.GetCode() << ", " << t2.GetName() << ", " << t2.GetSubject() << endl;
	cout << o1.GetCode() << ", " << o1.GetName() << ", " << o1.GetWork() << endl;
	cout << to3.GetCode() << ", " << to3.GetName() << ", " << to3.GetSubject() << ", " << to3.GetWork() << endl;
	system("pause");
	return 0;
}

輸出結果:

共有教職工4人
1, 孔子, 儒家文學
2, 公輸班, 建築學
3, 端木賜, 財務科長
4, 顏回, 儒家文學, 副院長
請按任意鍵繼續. . .