C++之static关键字的作用

xiaoxiao2025-09-27  171

@著作权归作者所有:来自博客作者大胡子的艾娃的原创作品,如需转载,请注明出处https://blog.csdn.net/qq_43148810,否则将追究法律责任。 如有错误的地方欢迎指正,谢谢!

一、 static声明全局静态变量和局部静态变量 1、static声明全局静态变量 该全局变量作用域被改变,只能供本模块使用。不能被其他模块再声明extern变量,多个模块可以同时定义同名static全局变量。

2、static声明局部静态变量 静态局部变量可以理解为是一个供函数局部存取的全局变量 a、生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该局部静态变量的函数中存取。 b、函数多次进入,变量的值只能在第一次进入初始化,也是唯一的一次初始化。

注意:static声明的变量(整形或浮点型)的默认初始化都为0(储存在全局区)。

二、static声明的普通函数 普通函数不能嵌套定义,所以没有局部函数和全局函数一说。

全局变量默认是非extern的,而普通的函数,默认是extern的,也就是说它用不用extern声明都可以被其他模块调用(前提其他模块中也有该函数的声明)。用static修饰的函数,限定在本模块中,不能被本身以外的模块调用。所以不会导致不同模块中声明、定义的同名函数发生冲突。

三、C++中的静态数据成员和静态函数成员 不管这个类创建了多少个对象,其静态成员在内存中只保留一份拷贝,这个拷贝为该类的所有对象所共享。

1、静态成员数据 a、静态数据成员的访问属性同普通数据成员一样,可以为public、private和protected。 b、静态数据成员脱离具体对象而独立存在,其存储空间是独立分配的,不是任何对象存储空间的一部分,但逻辑上所有的对象都共享这一存储单元,所以对静态数据成员的任何操作都将影响共享这一存储单元的所有对象。 c、静态数据成员是一种特殊的数据成员,它为类属性,而不是某个对象单独的属性,它在程序开始产生,在程序结束时消失。静态数据成员具有静态生存期。 d、由于在类的定义中仅仅是对静态数据成员进行了引用性声明,因此必须在文件作用域的某个地方对静态数据成员进行定义并初始化,即应在类体外对静态数据成员进行初始化(静态数据成员的初始化与它的访问控制权限无关),对象的初始化应不需要再对静态数据初始化。 e、静态数据成员初始化时前面不加static关键字,以免与一般静态变量或对象混淆。 f、由于静态数据成员是类的成员,因此在初始化时必须使用类作用域运算 符::限定它所属的类。

#include<iostream> using namespace std; class Student { public: char *Name; int No; static int sc; }; //在类外对静态成员初始化如下: int Student::sc;//默认初始化的值为0,一般初始化为:int Student::sc=数值 int main() { Student a = { "dahuzideaiwa",2 };//Student a = { "dahuzideaiwa",2,90 };错误 cout << a.sc << endl; a.sc = 90;cout << a.sc << endl; return 0; } /*运行结果: 0 90 */

2、静态成员函数 a、静态成员函数的访问权限同普通成员函数一样。 b、静态成员函数也可以省略参数、使用默认形参值、以及进行重载。 c、不能将静态成员函数定义为虚函数。 d、static并没有增加程序的时空间开销,相反在子类对父类静态成员的访问时缩短了时间开销,节省了子类的内存空间。 e、静态成员函数与普通成员函数在使用还有如下区别: 由于静态成员函数在类中只有一个拷贝(副本),因此它访问对象的成员时要受到一些限制:静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中的非静态成员;若要访问非静态成员,必须通过参数传递的方式得到相应的对象,再通过对象来访问。 由于静态成员是独立于类对象而存在的,因此静态成员没有this指针。 f、不需要生成对象就可以访问静态成员函数。

更多内容请关注个人博客:https://blog.csdn.net/qq_43148810

转载请注明原文地址: https://www.6miu.com/read-5036966.html

最新回复(0)