一、 定义
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一样。