【C/C++ 关键字 存储类说明符】 深入理解C/C++中的static关键字:它的作用、限制和使用技巧


更多精彩内容可阅读: C/C++ 关键字专栏


static关键字

📌static作用“改变生命周期” 或者 “改变作用域

static关键字特性

  • 变量默认初始化为0

  • 保持变量内容的持久

  • 全局隐藏


static关键字使用场景

当用static声明函数内的局部变量时

表示这个局部变量是在静态存储区分配的空间,在函数调用结束后其占用的存储单元并不释放,仍然保留原值

此外,静态局部变量是在编译时赋一次初值,程序运行时每次调用函数都不再重新赋初值,而是使用前次函数调用结束时的值。

若程序不赋初值,则编译时自动赋值0(普通局部变量不赋初值的话,其值不确定)。

当用static声明在函数体外的全局变量时

表示这个全局变量只能用于本文件,而不能被别的文件引用(即使使用了extern来扩展使用域),这样就能在不同文件中使用相同的全局变量名,提高了程序的通用性和可移植性。

📌ps:全局变量和静态全局变量都存放在静态存储区中,都是在编译时分配内存,只是作用域不同(全局变量可以在其他文件中用extern扩展使用域)。

当用static声明函数时

表示此函数只能被本文件中的其他函数调用(称为内部函数),这样在不同文件中就可以使用相同函数名,只要用static声明即可。

当用static声明类的成员变量时

  • static 成员变量的特点

    1. 这个类的所有对象共享一个静态成员,所以先于类的对象而存在的.

    2. 如果静态成员是公有的,那么可以直接通过类名调用.

    3. 静态成员数据在声明时候必须在类外初始化, 因为静态成员变量是先于类的对象而存在的.

  • static 成员变量的优点

    用static修饰的成员变量在对象中是不占内存的,因为他不是跟对象一起在堆或者栈中生成,

    用static修饰的变量在静态存储区生成的,所以用static修饰一方面的好处是可以节省对象的内存空间

  • static 成员变量的示例

    //通过静态成员函数来获得学生的总人数和总成绩
    #include <iostream>
    using namespace std;
    
    class Student{
    public:
        Student(char *name, int age, float score);
        void show();
    public:  //声明静态成员函数
        static int getTotal();
        static float getPoints();
    private:
        static int m_total;  //总人数
        static float m_points;  //总成绩
    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<<",成绩是"<<m_score<<endl;
    }
    //定义静态成员函数
    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<<"名学生,总成绩是"<<points<<",平均分是"<<points/total<<endl;
    
        return 0;
    }
    

📌PS:C++中不存在静态类

结语

在我们的编程学习之旅中,理解是我们迈向更高层次的重要一步。然而,掌握新技能、新理念,始终需要时间和坚持。从心理学的角度看,学习往往伴随着不断的试错和调整,这就像是我们的大脑在逐渐优化其解决问题的“算法”。

这就是为什么当我们遇到错误,我们应该将其视为学习和进步的机会,而不仅仅是困扰。通过理解和解决这些问题,我们不仅可以修复当前的代码,更可以提升我们的编程能力,防止在未来的项目中犯相同的错误。

我鼓励大家积极参与进来,不断提升自己的编程技术。无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力。


阅读我的CSDN主页,解锁更多精彩内容:泡沫的CSDN主页
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泡沫o0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值