1. 程式人生 > >C++ 作用域與生命週期 靜態static

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);)//不是成員函式,是普通函式

友元類:若lA是類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;

}