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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++学习10 static静态成员变量和静态成员函数

發布時間:2023/12/20 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++学习10 static静态成员变量和静态成员函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一般情況下,如果有N個同類的對象,那么每一個對象都分別有自己的成員變量,不同對象的成員變量各自有值,互不相干。但是有時我們希望有某一個或幾個成員變量為所有對象共有,這樣可以實現數據共享。

可以使用全局變量來達到共享數據的目的。例如在一個程序文件中有多個函數,每一個函數都可以改變全局變量的值,全局變量的值為各函數共享。但是用全局變量的安全性得不到保證,由于在各處都可以自由地修改全局變量的值,很有可能偶然失誤,全局變量的值就被修改,導致程序的失敗。因此在實際開發中很少使用全局變量。

如果想在同類的多個對象之間實現數據共享,也不要用全局變量,那么可以使用靜態成員變量。

static靜態成員變量

class Student{ private:char *name;int age;float score;static int num; //將num定義為靜態成員變量 public:Student(char *, int, float);void say(); };

這段代碼聲明了一個靜態成員變量 num,用來統計學生的人數。

static 成員變量屬于類,不屬于某個具體的對象,這就意味著,即使創建多個對象,也只為 num 分配一份內存,所有對象使用的都是這份內存中的數據。當某個對象修改了 num,也會影響到其他對象。

static 成員變量必須先初始化才能使用,否則鏈接錯誤。例如:

int Student::num; //初始化

也可以在初始化時賦初值:

int Student::num = 10; //初始化同時賦值

初始化時可以不加 static,但必須要有數據類型。被 private、protected、public 修飾的 static 成員變量都可以用這種方式初始化。

注意:static 成員變量的內存空間既不是在聲明類時分配,也不是在創建對象時分配,而是在初始化時分配。

static 成員變量既可以通過對象來訪問,也可以通過類來訪問。通過類來訪問的形式為:

類名::成員變量;

例如:

//通過類來訪問 Student::num = 10; //通過對象來訪問 Student stu; stu.num = 10;

這兩種方式是等效的。

注意:static 成員變量與對象無關,不占用對象的內存,而是在所有對象之外開辟內存,即使不創建對象也可以訪問。

#include <iostream> using namespace std; class Student{ private:char *name;int age;float score;static int num; //將num定義為靜態成員變量 public:Student(char *, int, float);void say(); }; int Student::num = 0; //初始化靜態成員變量 Student::Student(char *name, int age, float score){this->name = name;this->age = age;this->score = score;num++; } void Student::say(){//在普通成員函數中可以訪問靜態成員變量cout<<name<<"的年齡是 "<<age<<",成績是 "<<score<<"(當前共"<<num<<"名學生)"<<endl; } int main(){//使用匿名對象(new Student("小明", 15, 90))->say();(new Student("李磊", 16, 80))->say();(new Student("張華", 16, 99))->say();(new Student("王康", 14, 60))->say();return 0; }

本例中將 num 聲明為靜態成員變量,每次創建對象時,會調用構造函數,將 num 的值加 1。之所以使用匿名對象,是因為每次創建對象后只會使用它的 say 函數,不再進行其他操作。不過請注意,使用匿名對象有內存泄露的風險。

關于靜態數據成員的幾點說明:?

1)?一個類中可以有一個或多個靜態成員變量,所有的對象都共享這些靜態成員變量,都可以引用它。

2) static 成員變量和普通 static 變量一樣,編譯時在靜態數據區分配內存,到程序結束時才釋放。這就意味著,static 成員變量不隨對象的創建而分配內存,也不隨對象的銷毀而釋放內存。而普通成員變量在對象創建時分配內存,在對象銷毀時釋放內存。

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

int Student::num = 10;

初始化時可以賦初值,也可以不賦值。如果不賦值,那么會被默認初始化,一般是 0。靜態數據區的變量都有默認的初始值,而動態數據區(堆區、棧區)的變量默認是垃圾值。

4) 靜態成員變量既可以通過對象名訪問,也可以通過類名訪問,但要遵循 private、protected 和 public 關鍵字的訪問權限限制。當通過對象名訪問時,對于不同的對象,訪問的是同一份內存。

static靜態成員函數

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

我們知道,當調用一個對象的成員函數(非靜態成員函數)時,系統會把當前對象的起始地址賦給 this 指針。而靜態成員函數并不屬于某一對象,它與任何對象都無關,因此靜態成員函數沒有 this 指針。既然它沒有指向某一對象,就無法對該對象中的非靜態成員進行訪問。

可以說,靜態成員函數與非靜態成員函數的根本區別是:非靜態成員函數有 this 指針,而靜態成員函數沒有 this 指針。由此決定了靜態成員函數不能訪問本類中的非靜態成員。

靜態成員函數可以直接引用本類中的靜態數據成員,因為靜態成員同樣是屬于類的,可以直接引用。在C++程序中,靜態成員函數主要用來訪問靜態數據成員,而不訪問非靜態成員。

如果要在類外調用 public 屬性的靜態成員函數,要用類名和域解析符“::”。如:

Student::getNum();

當然也可以通過對象名調用靜態成員函數,如:

stu.getNum();

下面是一個完整的例子,通過靜態成員函數獲得學生的平均成績:

#include <iostream> using namespace std; class Student{ private:char *name;int age;float score;static int num; //學生人數static float total; //總分 public:Student(char *, int, float);void say();static float getAverage(); //靜態成員函數,用來獲得平均成績 }; int Student::num = 0; float Student::total = 0; Student::Student(char *name, int age, float score){this->name = name;this->age = age;this->score = score;num++;total += score; } void Student::say(){cout<<name<<"的年齡是 "<<age<<",成績是 "<<score<<"(當前共"<<num<<"名學生)"<<endl; } float Student::getAverage(){return total / num; } int main(){(new Student("小明", 15, 90))->say();(new Student("李磊", 16, 80))->say();(new Student("張華", 16, 99))->say();(new Student("王康", 14, 60))->say();cout<<"平均成績為 "<<Student::getAverage()<<endl;return 0; }

上面的代碼中,將 num、total 聲明為靜態成員變量,將 getAverage 聲明為靜態成員函數。在 getAverage 函數中,只使用了 total、num 兩個靜態成員變量。

轉載于:https://www.cnblogs.com/Caden-liu8888/p/5793921.html

總結

以上是生活随笔為你收集整理的C++学习10 static静态成员变量和静态成员函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。