一、靜態數據成員
class Test{
private:
//靜態數據成員
static int a;
靜態成員變量在類中只能聲明而不能定義賦值。
要對靜態數據成員定義和初始化必須在類的外面也就是在全局作用域中定義,如果定義不給出初值,則默認初值爲0
class Test{
public:
int GetA() const{return a;}
private:
//靜態數據成員
static int a;
};
//int Test::a;如果這樣定義不賦予初值則初值爲零
int Test::a = 1;
#include <iostream>
int main()
{
Test T;
std::cout << T.GetA() << std::endl;
}
#include <iostream>
#include <vector>
using namespace std;
class Account
{
public:
static double m_rate; // 聲明:獨立於類的對象之外
static vector<int> m_V;
static void set_rate(const double &x)
{
m_rate = x;
}
};
//靜態類型變量必須在類外定義,而且必須定義,不定義就報錯。
double Account::m_rate = 4; // 類型 + 類名 + 靜態變量。
vector<int> Account::m_V; //vector可初始化爲空,但必須初始化
int main()
{
Account::set_rate(5.0); //類名調用
cout << Account::m_rate << endl;
Account a;
a.set_rate(7.0); // 對象調用靜態成員函數,編譯器將不再會在參數裏添加this指針,這個隱含的操作
cout << Account::m_rate << endl;
return 0;
}
summary
也就是說我們在使用的時候,在頭文件類中聲明靜態變量,在源文件中初始化該靜態變量。
靜態數據成員被類的所有對象共享,包括該類的派生類對象,基類對象和派生類對象共享基類的靜態數據成員。也就是整個程序中他只有一份。調用該類就調這一份該成員變量。不管你創建多少個對象,都共享使用這一個成員變量。
二、靜態成員函數
靜態成員函數的聲明也很簡單,就是在類的成員函數前加上static關鍵字即可,和靜態成員一樣,靜態成員函數也是屬於類的,它並不屬於任何對象。
靜態成員函數中是不能訪問本類中的非靜態數據成員的。
靜態的數據成員和靜態的成員函數是已經在內存中開闢了內存空間了,所以靜態數據成員可以獨立的訪問在任何類對象沒有建立起來都可以訪問
class Student
{
public:
//定義構造函數
Student(int n, int a, float s) : num(n), age(a), score(s) {}
//普通成員函數
void total();
//聲明靜態成員函數
static float average();
private:
int num; //編號
int age; //年齡
float score; //分數
static float sum; //靜態成員變量,累計學生的總分
static int count; //靜態成員變量,累計學生的人數
};
//在全局作用域對靜態數據成員初始化,如果不賦予初值,則使用其默認值零
float Student::sum;
int Student::count;
//定義非靜態成員函數,非靜態可以調用靜態成員變量
void Student::total()
{
sum += score; //累加總分
count++; //累計已統計的人數
}
//定義靜態成員函數
float Student::average()
{
return (sum / count);
}
int main()
{
//創建三個學生對象
Student stud[3] = {
Student(1001, 18, 70),
Student(1002, 19, 78),
Student(1005, 20, 98)};
//調用3次total函數
for (int i = 0; i < 3; i++)
{
stud[i].total();
}
//調用靜態成員函數
std::cout << "the average score of students is " << Student::average() << std::endl;
}
通過以上例子說明:我們把所有對象的共性或者公共值放到靜態變量或者靜態函數中。要使用所有對象的屬性,就使用靜態。