C++_06_static关键字用法
1、对于静态全局变量而言,存储在数据段,目的是限制其他源文件(.cpp文件)的访问权限
/** 为什么要使用static——静态: 1、对于静态全局变量而言,存储在数据段,目的是限制其他源文件(.cpp文件)的访问权限 2、对于静态局部变量而言,存储在数据段,经过证实存储在数据段的静态存储区; 生存周期维持在整个源文件内(函数结束不会立即销毁,会保存在数据段的静态存储区,可以改变值) (记住,静态局部变量依旧是局部变量,只不过拥有了部分全局变量不死的特性!) */ #include<iostream> using namespace std; int fun(int x) { static int a = 3; //static 修饰的a --- 静态局部变量 存储在数据段内,其值可以修改,最大的变化就是改变了生存周期 x += a++; //先赋值3,完成x = x +3 ,后面才自加 cout << "a = " << a << endl; cout << "x = " << x << endl; return x; //函数结束临时变量x被释放 x 依旧为 x = 2 } void main() { int x = 2, sum; sum = fun(x); //sum = sum + fun(x); cout << "sum = " << sum << endl; }
static关键字的作用
(1)定义静态变量
1、定义静态变量(全局静态和局部静态):
在变量类型前加上static关键字,变量即被定义为静态变量,静态变量只能在本源文件中使用。 初始化的静态变量会在data段分配内存,未初始化的静态变量会在bss段分配内存。
直到程序结束,静态变量始终会维持前值。只不过全局静态变量和局部静态变量的作用域不一样。
2、在c++中,static关键字可以用于定义类中的静态成员变量:
使用静态数据成员,它既可以被当成全局变量那样去存储,但又被隐藏在类的内部。
类中的static静态数据成员拥有一块单独的存储区,而不管创建了多少个该类的对象。
所有这些对象的静态数据成员都共享这一块静态存储空间。
(2)定义静态函数
1、定义静态函数:在函数返回类型前加上static关键字,函数即被定义为静态函数,静态函数只能在本源文件中使用;
2、在c++中,static关键字可以用于定义类中的静态成员函数:与静态成员变量类似,类里面同样可以定义静态成员函数。只需要在函数前加上关键字static即可。如静态成员函数也是类的一部分,而不是对象的一部分。所有这些对象的静态数据成员都共享这一块静态存储空间。
当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数不属于任何一个对象,因此C++规定静态成员函数没有this指针(划重点,面试题常考)。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行访问。
补充:类中static修饰的静态成员函数没有this指针,不属于任何一个对象,无法后接对象地址
静态成员函数只能访问 ------> 静态成员函数和变量(不属于对象) 类以外的函数和变量
不能访问 ------> 非静态的成员函数(属于对象)
非静态成员函数 静态非静态(函数、变量)都可以访问
理解1:静态成员函数所需内存在程序执行前就分配好了;
非静态成员必须要等到这个类在堆或者栈上分了内存才能用,所以如果静态成员函数访问非静态,可能非静态成员还没有内存。
理解2:静态成员函数(变量)属于类的公有资源,非静态成员函数(变量)一般属于对象的私有资源,私有可以访问公有,但公有一般不可访问私有(主要指私有函数(非静态成员函数),因为没有this指针)(某些条件下可以做到间接访问)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!