1_static关键字的使用
1. static和auto的相似之处
// 只不过这里auto默认省略不写
auto int a=10;
auto string str="this is a string";
static int a=10;
static string str="this is a string";
区别是:
- auto是由程序自动控制变量的生命周期;
- static变量的生命周期不是自动控制,而是跟随程序本身。在初始化程序时分配,程序退出时释放。
如下:
- 每次调用func时都会重新分配a变量,多个线程调用时a变量互相独立;但是b变量在程序初始化时就分配了,不管有没有调用func都会分配,多线程调用func时共用同一个b变量。
void func(){
int a;
static int b;
}
2. static在类中的用法:修饰成员变量和成员函数
class Girl{
private:
static string name; // static是声明性的关键字
static void SayHi();
};
string Girl::name="Chow"; // 类外全局初始化
void Girl::SayHi(){cout<<"Hi~"<<endl;}
注意点:
可以理解string Girl::name="Chow"为全局变量,只不过带有类安全属性的;static成员函数,可以理解为,增加了类的访问权限的全局函数;因此,访问类的static成员不用创建实例对象。
-
static成员,在类中声明,.cpp中全局初始化。且必须要初始化。因为程序一开始就会给它分配内存,必须初始化。
-
static成员,该类的所有实例对象共用。是在该类的范畴内的全局变量。
-
static成员不属于对象,访问类的static成员不用创建实例对象,Girl::name和Girl::func()就可以直接访问。
-
static成员函数,只能访问类的static变量。static成员函数中也没有this指针
-
static成员函数,不可设为虚函数,因为虚函数是运行时绑定,static是程序一开始就分配初始化了,不能参与多态和动态绑定。static成员与类相关,与对象实例不相关,没有this指针无法访问非静态成员。
3. static在.cpp全局区域的用法:只在.cpp内有效的全局变量和全局函数
// 在全局区域声明变量和函数
static int a=10; // static作用是,指定a只在本.cpp文件内有效。不共享。不同cpp内的同名变量a,互相独立
int a=0; // 错误写法,用意不明,只在本.cpp用?还是共享?
/*
* 如何在不同.cpp中共享变量?
*
* 在.h头文件中用extern关键字声明,extern int a;
* 然后再任意一个对应的.cpp中初始化一次就可以了。
*/
static void SayHi(){cout<<"Hi"<<endl;} // static作用是,指定该函数只在本.cpp文件内有效。不共享。不同cpp内的同名函数,互相独立
void SayHi(){cout<<"Hi"<<endl;} // 错误写法,用意不明
/*
* 如何让多个.cpp复用一个函数?
* 多个.cpp中复用该函数,就把它的声明提到头文件里去
*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现