千家信息网

怎么理解C++的静态成员变量和静态成员函数

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,怎么理解C++的静态成员变量和静态成员函数,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一.static修饰变量void text()
千家信息网最后更新 2025年11月07日怎么理解C++的静态成员变量和静态成员函数

怎么理解C++的静态成员变量和静态成员函数,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一.static修饰变量

void text() {        static int a = 10;        a++;        cout <<"a=" << a << endl;}int main(int arg, char** args) {        text();        text();}

结果:

二.static修饰函数

此函数的作用域只在本文件,其他文件无法调用。

static void text() {        int a = 10;        a++;        cout <<"a=" << a << endl;}

三.static在类中使用

1.static成员变量实现了同类对象间信息共享。

2.static成员类外存储,球类大小,并不包含在内。

3.static成员是命名空间属于类的全局变量,存储在data区(静态区)。

4.static成员只能在类外初始化。

5.可以通过类名访问(无对象生成时亦可),也可以通过对象访问。

1.创建与初始化

先看错误:对于静态变量的构造函数的错误。

class AA {public:        AA(int a, int b,int c,int d) {//错误的构造函数                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;};

正确写法:静态成员变量初始化,一定在类外。

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下静态变量初始化int AA::m_d = 1;//private下静态变量初始化int main(int arg, char** args) {        AA a1(1, 2);}

结果:


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;}

结果:


原因:因为static分配变量在静态区,因此类AA下所有变量(a1、a2)共用一个m_c。

因此,类中public下的static变量可以使用下面。访问。但是private不可用。

cout<

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下:必须提供函数,才能访问和修改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;   }

结果:

四.class含有static变量所占空间

class A {private:        int a;        int b;        static int c;};int main() {        cout << sizeof(A) << endl;}

结果:


结果:居然是8,不是12。因为static成员是命名空间属于类的全局变量,存储在data区(静态区)。

五.练习题:求学生总人数、总分、平均分系统。

#include 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 << "学生人数:" << Student::get_count() << endl;        cout << "学生总分:" << Student::get_total_score() << endl;        cout << "学生平均分" << Student::get_total_score() / Student::get_count() << endl;}

看完上述内容,你们掌握怎么理解C++的静态成员变量和静态成员函数的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

0