博客專欄

        EEPW首頁 > 博客 > C++ static靜態成員函數詳解

        C++ static靜態成員函數詳解

        發布人:電子禪石 時間:2022-04-07 來源:工程師 發布文章

        在類中,static 除了可以聲明靜態成員變量,還可以聲明靜態成員函數。普通成員函數可以訪問所有成員(包括成員變量和成員函數),靜態成員函數只能訪問靜態成員。

        編譯器在編譯一個普通成員函數時,會隱式地增加一個形參 this,并把當前對象的地址賦值給 this,所以普通成員函數只能在創建對象后通過對象來調用,因為它需要當前對象的地址。而靜態成員函數可以通過類來直接調用,編譯器不會為它增加形參 this,它不需要當前對象的地址,所以不管有沒有創建對象,都可以調用靜態成員函數。

        普通成員變量占用對象的內存,靜態成員函數沒有 this 指針,不知道指向哪個對象,無法訪問對象的成員變量,也就是說靜態成員函數不能訪問普通成員變量,只能訪問靜態成員變量。

        普通成員函數必須通過對象才能調用,而靜態成員函數沒有 this 指針,無法在函數體內部訪問某個對象,所以不能調用普通成員函數,只能調用靜態成員函數。

        靜態成員函數與普通成員函數的根本區別在于:普通成員函數有 this 指針,可以訪問類中的任意成員;而靜態成員函數沒有 this 指針,只能訪問靜態成員(包括靜態成員變量和靜態成員函數)。

        下面是一個完整的例子,該例通過靜態成員函數來獲得學生的總人數和總成績:


        #include <iostream>
        using namespace std;
        
        class Student{
        public:
            Student(char *name, int age, float score);
            void show();
        public:  //聲明靜態成員函數
            static int getTotal();
            static float getPoints();
        private:
            static int m_total;  //總人數
            static float m_points;  //總成績
        private:
            char *m_name;
            int m_age;
            float m_score;
        };
        
        int Student::m_total = 0;
        float Student::m_points = 0.0;
        
        Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){
            m_total++;
            m_points += score;
        }
        void Student::show(){
            cout<<m_name<<"的年齡是"<<m_age<<",成績是"<<m_score<<endl;
        }
        //定義靜態成員函數
        int Student::getTotal(){
            return m_total;
        }
        float Student::getPoints(){
            return m_points;
        }
        
        int main(){
            (new Student("小明", 15, 90.6)) -> show();
            (new Student("李磊", 16, 80.5)) -> show();
            (new Student("張華", 16, 99.0)) -> show();
            (new Student("王康", 14, 60.8)) -> show();
        
            int total = Student::getTotal();
            float points = Student::getPoints();
            cout<<"當前共有"<<total<<"名學生,總成績是"<<points<<",平均分是"<<points/total<<endl;
        
            return 0;
        }

        運行結果:
        小明的年齡是15,成績是90.6
        李磊的年齡是16,成績是80.5
        張華的年齡是16,成績是99
        王康的年齡是14,成績是60.8
        當前共有4名學生,總成績是330.9,平均分是82.725

        總人數 m_total 和總成績 m_points 由各個對象累加得到,必須聲明為 static 才能共享;getTotal()、getPoints() 分別用來獲取總人數和總成績,為了訪問 static 成員變量,我們將這兩個函數也聲明為 static。

        C++中,靜態成員函數的主要目的是訪問靜態成員。getTotal()、getPoints() 當然也可以聲明為普通成員函數,但是它們都只對靜態成員進行操作,加上 static 語義更加明確。

        和靜態成員變量類似,靜態成員函數在聲明時要加 static,在定義時不能加 static。靜態成員函數可以通過類來調用(一般都是這樣做),也可以通過對象來調用,上例僅僅演示了如何通過類來調用。

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: C++

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 浦北县| 石城县| 盐池县| 贵溪市| 阳山县| 阿克苏市| 天水市| 赤水市| 嘉义市| 密山市| 南城县| 大冶市| 达州市| 汉中市| 稻城县| 岑溪市| 肥东县| 灌南县| 郴州市| 辽阳县| 宣化县| 隆子县| 柳江县| 呼和浩特市| 醴陵市| 安吉县| 唐山市| 潞西市| 宜都市| 伊宁市| 牙克石市| 府谷县| 大宁县| 大足县| 平定县| 云阳县| 蓝田县| 新龙县| 阿合奇县| 马边| 吉木乃县|