C/C++ 中 static 的定义和用法

一、 定义

    static是关键字,中文直译过来是“静态的”,static关键字主要是用来修饰变量和函数。

        

        static的用法主要体现在两个方面:面向过程中的static和面向对象中的static。

        面向过程的static主要包括静态全局变量静态局部变量静态函数

        面向对象的static主要包括静态成员变量静态成员函数

二、 用法

        

1、 修饰局部变量

        

        在函数内使用static修饰局部变量时,会改变局部变量的存储位置,从而使得局部变量的生命周期变长(不改变作用域)。

        变量生命周期变长其意为非静态局部变量存放在栈区,在函数执行完后将被释放,在下次调用时将重新初始化。而静态局部变量存放于静态数据区,只有在程序执行完毕后才会被释放。他通过改变变量的存储位置来延长变量的生命周期。

2、 修饰全局变量

        static修饰全局变量时,会改变全局变量的链接属性,从而使得全局变量的作用域变小。

        非静态全局变量本身是具有外部链接属性的,全局变量可通过链接在其他文件中调用, 静态全局变量该变了其链接属性,外部链接属性就会被修改成内部链接属性,使其不可被其他文件链接,只在本文件内可用。

3、 修饰函数

        static对函数的修饰与修饰全局变量十分相似,修饰函数时会改变函数的链接属性,从而使得函数的作用域变小。

        用static修饰函数:对函数的连接方式产生影响,使得函数只在本文件内部有效,对其他文件是不可见的(这一点在大工程中很重要很重要,避免很多麻烦,很常见)。这样的函数又叫作静态函数。使用静态函数的好处是,不用担心与其他文件的同名函数产生干扰,另外也是对函数本身的一种保护机制。

4、 静态成员变量

        静态数据成员的服务对象并非是单个类实例化的对象,而是所有类实例化的对象(这点可以用于设计模式中的单例模式实现);

        静态数据成员必须显式的初始化分配内存,在其包含类没有任何实例化之前已经有内存分配;

        静态数据成员与其他成员一样,遵从public,protected,private的访问规则;

        静态数据成员内存存储在全局数据区,只随着进程的消亡而消亡;

优势:

        静态数据成员不进入程序全局命名空间,不会与其他全局名称的同名同类型变量冲突;

        静态数据成员可以实现C++的封装特性,由于其遵守类的访问权限规则,所以相比全局变量更加灵活;

    

5、  静态成员函数

        

        静态成员函数比普通成员函数多了一种调用方式;

        在没有实例化的类对象的条件下可以调用类的静态成员函数;

        静态成员函数中没有隐含的this指针,所以静态成员函数不可以操作类中的非静态成员(由于第二条可知,类的非静态成员是在类实例化后存在的,而类的成员函数可以在类没有实例化的时候调用,故不能操作类的非静态成员);

总的来说:静态成员函数不能访问非静态(包括成员函数和数据成员),但是非静态可以访问静态,有点晕吗?没关系,我给你个解释,
因为静态是属于类的,它是不知道你创建了10个还是100个对象,所以它对你对象的函数或者数据是一无所知的,所以它没办法调用,而反过来,你创建的对象是对类一清二楚的(不然你怎么从它那里实例化呢),所以你是可以调用类函数和类成员的,就像不管GetSum是不是static,都可以调用static的s_sum一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值