C89:论静态(static)
一.简介
Const修饰的类型跟它本身的内存值有关,而Static修饰的类型跟它内存生命周期有关
只用于本文件的函数要全部使用static关键字声明,这是一个良好的编码风格
(1)对其他源文件隐藏
(2)保持变量内存的持久,保持唯一性,只占一份内存
(3)默认初始化为0注意:形参不能被static修饰
- 规则:
规则1:普通局部变量用完就释放,所以当我们需要多次用到同一份变量数据的时候,就可以用static来留住这个变量的数据
二.用于C代码
(1)修饰局部变量
保持内存的持久(保持唯一性,只占一份内存)
规则1:普通局部变量用完就释放,所以当我们需要多次用到同一份变量数据的时候,就可以用static来留住这个变量的数据
void A(){ //普通局部变量存储于进程栈空间,使用完毕后会立即释放 //静态局部变量编译器会默认初始化为0,存储于进程的全局数据区,程序结束时释放 static int a=1; }
(2)修饰全局变量
对其他源文件隐藏
规则2:全局变量可能会导致多线程竞争同一份数据,用static可以把变量留住在单一源文件里面使用
//全局变量本身就有内存的持久性,所以静态全局变量用于在其他源文件屏蔽该变量 //全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化 //普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用,也就是说其他文件不能定义一个同名的变量 //静态全局变量仅对其当前文件可见,其他文件不可访问,其他文件可以拥有同名的变量 //file1.cpp int varA; static int varB; //file2.cpp extern int varA; //使用其他源文件的全局变量 extern int varB; //错误,静态全局变量被屏蔽
(3)修饰全局函数
对其他源文件隐藏
规则3:
//非静态函数可以在另一个文件中直接引用不必加extern声明 //静态函数只能在声明它的文件中可见,其他文件不能引用该函数 //不同的文件可以使用相同名字的静态函数 //file1.cpp extern void funA(){} static void funB(){} //file2.cpp extern void funA(); //使用其他源文件的全局变量 extern void funB(); //错误,静态全局函数屏蔽了该函数
三.用于C++代码
非静态成员能够访问静态成员,因为生命周期还在.
静态成员不能访问非静态成员
(1)修饰类的静态成员变量
默认初始化为0,保持内存的持久(保持唯一性,只占一份内存),不存在this指针
//静态成员可以独立访问,无须创建任何对象实例就可以访问 //静态成员变量每个class只有一份变量内存(全局数据区/静态区),而普通成员函数每个对象都有不同的变量内存 //test.h class A{ private: static const int a; } //test.cpp const int A::a=1; //不受private和protected访问限制
(2)修饰类的静态成员函数
保持内存的持久(保持唯一性,只占一份内存)
//类的静态成员函数无法调用类的非静态成员函数和变量,因为静态成员函数没有this指针 //类的非静态成员函数可以调用类的静态成员函数和变量 //静态成员函数不可以同时声明为virtual const volatile函数 class A{ public: virtual static void fun1(); //错误 static void fun2() const; //错误 static void fun2() volatile; //错误 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)