C++ 作用域與生命週期 靜態static
1⃣️靜態區域性變數作用域不變,生命週期延長至程式執行結束
2⃣️靜態全域性變數作用域變小,不能extern引用,生命週期不變
類中的靜態成員:成員函式,成員變數都是使用物件來進行呼叫,
也有些資料成員和成員函式屬於整個類,稱這些成員為類的靜態成員(這些成員不屬於物件,建立物件時不會為靜態成員開闢空間)
靜態成員整個類只有一份空間(靜態空間)
Emploee::pay(50);//靜態成員函式的呼叫=>類名::靜態成員函式名稱
1⃣️類的靜態成員變數初始化在類外 型別名 類名:: 變數初始化 (int Student:: allStudent=0;)
2⃣️靜態成員(函式、變數)屬於類,非靜態成員則屬於某一個物件
3⃣️靜態成員函式的呼叫 Emploee::pay(50);//靜態成員函式的呼叫=>類名::靜態成員函式名稱
類佔用空間大小計算方式:成員變數的累加(自動補齊),靜態成員變數不計算在內
靜態成員函式不能訪問非靜態成員變數與非靜態成員函式,而普通成員函式技能訪問靜態成員變數,又能訪問到靜態成員函式
友元函式:函式中可以直接訪問其私有成員(friend point middle(point &p1,point &p2);)//不是成員函式,是普通函式
友元類:若l類A是類B的友元類,則A的成員函式均為類B的友元函式(1⃣️單向2⃣️不傳遞)
#include <iostream>
#include <string>
using namespace std;
class Emploee{//員工類
// 普通成員變數
char *name;
int ids;
// 類的靜態成員變數
static int allNum;// 員工總人數
static int totalPays;//員工總支出
public:
Emploee(char *_name){//建構函式
name=new char[strlen(_name)+1];
strcpy(name, _name);
allNum++;
ids=allNum;//非靜態成員函式呼叫靜態成員變數
}
~Emploee(){//解構函式
if (name!=NULL) {
delete []name;
name=NULL;
}
}
void display(){
cout<<"name:"<<name<<endl;
cout<<"id:"<<ids<<endl;
cout<<"++++++++++++++\n";
}
// 類的靜態成員函式
static void pay(int onepay){
totalPays+=onepay;//靜態成員函式訪問靜態成員變數
cout<<"all pay:"<<totalPays<<endl;
}
static void allPerson(){
cout<<"all person:"<<allNum<<endl;
}
};
// 類的靜態成員變數初始化在類外
int Emploee:: allNum=0;
int Emploee:: totalPays=0;
int main(int argc, const char * argv[]) {
Emploee e1((char*)"zhanghow");
Emploee e2((char*)"lisi");
Emploee e3((char*)"wangwu");
Emploee e4((char*)"zhaosi");
e1.display();
e2.display();
e3.display();
Emploee::pay(50);//靜態成員函式的呼叫=>類名::靜態成員函式名稱
Emploee::pay(150);
Emploee::allPerson();
return 0;
}