<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > C++ static靜態(tài)成員函數詳解

C++ static靜態(tài)成員函數詳解

發(fā)布人:電子禪石 時(shí)間:2022-04-07 來(lái)源:工程師 發(fā)布文章

在類(lèi)中,static 除了可以聲明靜態(tài)成員變量,還可以聲明靜態(tài)成員函數。普通成員函數可以訪(fǎng)問(wèn)所有成員(包括成員變量和成員函數),靜態(tài)成員函數只能訪(fǎng)問(wèn)靜態(tài)成員。

編譯器在編譯一個(gè)普通成員函數時(shí),會(huì )隱式地增加一個(gè)形參 this,并把當前對象的地址賦值給 this,所以普通成員函數只能在創(chuàng )建對象后通過(guò)對象來(lái)調用,因為它需要當前對象的地址。而靜態(tài)成員函數可以通過(guò)類(lèi)來(lái)直接調用,編譯器不會(huì )為它增加形參 this,它不需要當前對象的地址,所以不管有沒(méi)有創(chuàng )建對象,都可以調用靜態(tài)成員函數。

普通成員變量占用對象的內存,靜態(tài)成員函數沒(méi)有 this 指針,不知道指向哪個(gè)對象,無(wú)法訪(fǎng)問(wèn)對象的成員變量,也就是說(shuō)靜態(tài)成員函數不能訪(fǎng)問(wèn)普通成員變量,只能訪(fǎng)問(wèn)靜態(tài)成員變量。

普通成員函數必須通過(guò)對象才能調用,而靜態(tài)成員函數沒(méi)有 this 指針,無(wú)法在函數體內部訪(fǎng)問(wèn)某個(gè)對象,所以不能調用普通成員函數,只能調用靜態(tài)成員函數。

靜態(tài)成員函數與普通成員函數的根本區別在于:普通成員函數有 this 指針,可以訪(fǎng)問(wèn)類(lèi)中的任意成員;而靜態(tài)成員函數沒(méi)有 this 指針,只能訪(fǎng)問(wèn)靜態(tài)成員(包括靜態(tài)成員變量和靜態(tài)成員函數)。

下面是一個(gè)完整的例子,該例通過(guò)靜態(tài)成員函數來(lái)獲得學(xué)生的總人數和總成績(jì):


#include <iostream>
using namespace std;

class Student{
public:
    Student(char *name, int age, float score);
    void show();
public:  //聲明靜態(tài)成員函數
    static int getTotal();
    static float getPoints();
private:
    static int m_total;  //總人數
    static float m_points;  //總成績(jì)
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<<",成績(jì)是"<<m_score<<endl;
}
//定義靜態(tài)成員函數
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<<"名學(xué)生,總成績(jì)是"<<points<<",平均分是"<<points/total<<endl;

    return 0;
}

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

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

C++中,靜態(tài)成員函數的主要目的是訪(fǎng)問(wèn)靜態(tài)成員。getTotal()、getPoints() 當然也可以聲明為普通成員函數,但是它們都只對靜態(tài)成員進(jìn)行操作,加上 static 語(yǔ)義更加明確。

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

*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: C++

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>