日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++ static静态成员变量

發(fā)布時(shí)間:2025/3/12 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ static静态成员变量 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在C++中,我們可以使用靜態(tài)成員變量來(lái)實(shí)現(xiàn)多個(gè)對(duì)象共享數(shù)據(jù)的目標(biāo)。靜態(tài)成員變量是一種特殊的成員變量,它被關(guān)鍵字static修飾,例如:

class Student{ public:Student(char *name, int age, float score);void show(); public:static int m_total; //靜態(tài)成員變量 private:char *m_name;int m_age;float m_score; };

這段代碼聲明了一個(gè)靜態(tài)成員變量 m_total,用來(lái)統(tǒng)計(jì)學(xué)生的人數(shù)。

static 成員變量屬于類,不屬于某個(gè)具體的對(duì)象,即使創(chuàng)建多個(gè)對(duì)象,也只為 m_total 分配一份內(nèi)存,所有對(duì)象使用的都是這份內(nèi)存中的數(shù)據(jù)。當(dāng)某個(gè)對(duì)象修改了 m_total,也會(huì)影響到其他對(duì)象。

static 成員變量必須在類聲明的外部初始化,具體形式為:

type class::name = value;

type 是變量的類型,class 是類名,name 是變量名,value 是初始值。將上面的 m_total 初始化:

int Student::m_total = 0;

靜態(tài)成員變量在初始化時(shí)不能再加 static,但必須要有數(shù)據(jù)類型。被 private、protected、public 修飾的靜態(tài)成員變量都可以用這種方式初始化。

注意:static 成員變量的內(nèi)存既不是在聲明類時(shí)分配,也不是在創(chuàng)建對(duì)象時(shí)分配,而是在(類外)初始化時(shí)分配。反過(guò)來(lái)說(shuō),沒(méi)有在類外初始化的 static 成員變量不能使用。

static 成員變量既可以通過(guò)對(duì)象來(lái)訪問(wèn),也可以通過(guò)類來(lái)訪問(wèn)。請(qǐng)看下面的例子:

//通過(guò)類類訪問(wèn) static 成員變量 Student::m_total = 10;//通過(guò)對(duì)象來(lái)訪問(wèn) static 成員變量 Student stu("小明", 15, 92.5f); stu.m_total = 20;//通過(guò)對(duì)象指針來(lái)訪問(wèn) static 成員變量 Student *pstu = new Student("李華", 16, 96); pstu -> m_total = 20;

這三種方式是等效的。

注意:static 成員變量不占用對(duì)象的內(nèi)存,而是在所有對(duì)象之外開(kāi)辟內(nèi)存,即使不創(chuàng)建對(duì)象也可以訪問(wèn)。

下面來(lái)看一個(gè)完整的例子:

#include <iostream> using namespace std;class Student{ public:Student(char *name, int age, float score);void show(); private:static int m_total; //靜態(tài)成員變量 private:char *m_name;int m_age;float m_score; };//初始化靜態(tài)成員變量 int Student::m_total = 0;Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){m_total++; //操作靜態(tài)成員變量 } void Student::show(){cout<<m_name<<"的年齡是"<<m_age<<",成績(jī)是"<<m_score<<"(當(dāng)前共有"<<m_total<<"名學(xué)生)"<<endl; }int main(){//創(chuàng)建匿名對(duì)象(new Student("小明", 15, 90)) -> show();(new Student("李磊", 16, 80)) -> show();(new Student("張華", 16, 99)) -> show();(new Student("王康", 14, 60)) -> show();return 0; }

運(yùn)行結(jié)果:

小明的年齡是15,成績(jī)是90(當(dāng)前共有1名學(xué)生) 李磊的年齡是16,成績(jī)是80(當(dāng)前共有2名學(xué)生) 張華的年齡是16,成績(jī)是99(當(dāng)前共有3名學(xué)生) 王康的年齡是14,成績(jī)是60(當(dāng)前共有4名學(xué)生)

上例中將 m_total 聲明為靜態(tài)成員變量,每次創(chuàng)建對(duì)象時(shí),會(huì)調(diào)用構(gòu)造函數(shù)使 m_total 的值加 1。

之所以使用匿名對(duì)象,是因?yàn)槊看蝿?chuàng)建對(duì)象后只會(huì)使用它的 show() 函數(shù),不再進(jìn)行其他操作。不過(guò)使用匿名對(duì)象無(wú)法回收內(nèi)存,會(huì)導(dǎo)致內(nèi)存泄露,在中大型程序中不建議使用。

解析說(shuō)明

1 一個(gè)類中可以有一個(gè)或多個(gè)靜態(tài)成員變量,所有的對(duì)象都共享這些靜態(tài)成員變量,都可以引用它。

2 static 成員變量和普通 static 變量一樣,都在內(nèi)存分區(qū)中的全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存,到程序結(jié)束時(shí)才釋放。這就意味著,static 成員變量不隨對(duì)象的創(chuàng)建而分配內(nèi)存,也不隨對(duì)象的銷毀而釋放內(nèi)存。而普通成員變量在對(duì)象創(chuàng)建時(shí)分配內(nèi)存,在對(duì)象銷毀時(shí)釋放內(nèi)存。

3 靜態(tài)成員變量必須初始化,而且只能在類體外進(jìn)行。例如:

int Student::m_total = 10;

初始化時(shí)可以賦初值,也可以不賦值。如果不賦值,那么會(huì)被默認(rèn)初始化為 0。

4 靜態(tài)成員變量既可以通過(guò)對(duì)象名訪問(wèn),也可以通過(guò)類名訪問(wèn),但要遵循 private、protected 和 public 關(guān)鍵字的訪問(wèn)權(quán)限限制。當(dāng)通過(guò)對(duì)象名訪問(wèn)時(shí),對(duì)于不同的對(duì)象,訪問(wèn)的是同一份內(nèi)存。

總結(jié)

以上是生活随笔為你收集整理的C++ static静态成员变量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。