C++的靜態(tài)成員變量和靜態(tài)成員函數(shù)詳解
static int a = 10;//在靜態(tài)區(qū)分配空間,不在堆棧
在靜態(tài)區(qū)分配空間,不在堆棧分配空間。因此,只有等到所以函數(shù)全部執(zhí)行完成后,才會(huì)釋放空間。
一.static修飾變量
void text() {
static int a = 10;
a++;
cout <<"a=" << a << endl;
}
int main(int arg, char** args) {
text();
text();
}
結(jié)果:

二.static修飾函數(shù)
此函數(shù)的作用域只在本文件,其他文件無法調(diào)用。
static void text() {
int a = 10;
a++;
cout <<"a=" << a << endl;
}
三.static在類中使用
1.static成員變量實(shí)現(xiàn)了同類對象間信息共享。
2.static成員類外存儲(chǔ),球類大小,并不包含在內(nèi)。
3.static成員是命名空間屬于類的全局變量,存儲(chǔ)在data區(qū)(靜態(tài)區(qū))。
4.static成員只能在類外初始化。
5.可以通過類名訪問(無對象生成時(shí)亦可),也可以通過對象訪問。
1.創(chuàng)建與初始化
先看錯(cuò)誤:對于靜態(tài)變量的構(gòu)造函數(shù)的錯(cuò)誤。
class AA {
public:
AA(int a, int b,int c,int d) {//錯(cuò)誤的構(gòu)造函數(shù)
m_a = a;
m_b = b;
m_c = c;
m_d = d;
}
static int m_c;
private:
int m_a;
int m_b;
static int m_d;
};
正確寫法:靜態(tài)成員變量初始化,一定在類外。
class AA {
public:
static int m_c;
AA(int a, int b) {
m_a = a;
m_b = b;
}
~AA() {
cout << "m_a=" << m_a << " m_b=" << m_b << " m_c=" << m_c << " m_d=" << m_d << endl;
}
private:
int m_a;
int m_b;
static int m_d;
};
int AA::m_c = 0;//public下靜態(tài)變量初始化
int AA::m_d = 1;//private下靜態(tài)變量初始化
int main(int arg, char** args) {
AA a1(1, 2);
}
結(jié)果:

2.使用問題
例子1:
class AA {
public:
AA(int a, int b) {
m_a = a;
m_b = b;
}
static int m_c;
int get_c() {
m_c++;
return m_c;
}
private:
int m_a;
int m_b;
};
int AA::m_c = 0;
int main(int arg, char** args) {
AA a1(1, 2);
AA a2(10, 20);
cout <<"a1(1, 2)下的c:" << a1.get_c() << endl;
cout << "a2(10, 20)下的c:" << a2.get_c() << endl;
}
結(jié)果:

原因:因?yàn)閟tatic分配變量在靜態(tài)區(qū),因此類AA下所有變量(a1、a2)共用一個(gè)m_c。
因此,類中public下的static變量可以使用下面。訪問。但是private不可用。
cout<<AA::m_c << endl;
3.在public、private下static變量使用
在public下:可以通過AA::m_c = 100直接訪問和修改static變量值。
class AA {
public:
AA(int a, int b) {
m_a = a;
m_b = b;
}
static int m_c;
private:
int m_a;
int m_b;
};
int AA::m_c = 0;
int main(int arg, char** args) {
AA::m_c = 100;
cout << AA::m_c << endl;
}
在private下:必須提供函數(shù),才能訪問和修改static變量值。
class AA {
public:
AA(int a, int b) {
m_a = a;
m_b = b;
}
static void set_md(int d) {
m_d = d;
}
static int get_md() {
return m_d;
}
private:
int m_a;
int m_b;
static int m_d;
};
int AA::m_d = 1;
int main(int arg, char** args) {
AA::set_md(100);
cout << AA::get_md() << endl;
}
結(jié)果:

四.class含有static變量所占空間
class A {
private:
int a;
int b;
static int c;
};
int main() {
cout << sizeof(A) << endl;
}
結(jié)果:

結(jié)果:居然是8,不是12。因?yàn)閟tatic成員是命名空間屬于類的全局變量,存儲(chǔ)在data區(qū)(靜態(tài)區(qū))。
五.練習(xí)題:求學(xué)生總?cè)藬?shù)、總分、平均分系統(tǒng)。
#include <iostream>
using namespace std;
class Student {
private:
int m_id;
double m_score;
static int count;
static double total_score;
public:
Student(int id,double score) {
m_id = id;
m_score = score;
count++;
total_score += m_score;
}
static double get_total_score() {
return total_score;
}
static double get_count() {
return count;
}
};
int Student::count = 0;
double Student::total_score = 0.0;
int main(int arg, char** args) {
Student S1(1, 50.1), S2(2, 10.1), S3(3, 0.1);
//double mean_score = 0.0;
cout << "學(xué)生人數(shù):" << Student::get_count() << endl;
cout << "學(xué)生總分:" << Student::get_total_score() << endl;
cout << "學(xué)生平均分" << Student::get_total_score() / Student::get_count() << endl;
}
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
vscode使用官方C/C++插件無法進(jìn)行代碼格式化問題
這篇文章主要介紹了vscode使用官方C/C++插件無法進(jìn)行代碼格式化問題,本文通過截圖實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
基于Qt實(shí)現(xiàn)自定義時(shí)間選擇控件
這篇文章主要為大家詳細(xì)介紹了如何基于Qt實(shí)現(xiàn)自定義時(shí)間選擇控件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
VS2010/MFC編程(常用控件:樹形控件Tree Control控件創(chuàng)建h和實(shí)例)
本篇文章介紹了VS2010/MFC編程:常用控件:樹形控件Tree Control,包括樹形控件的創(chuàng)建、CTreeCtrl類的主要成員函數(shù)和應(yīng)用實(shí)例有興趣的可以了解一下。2016-12-12

