C++中的Static关键字
c++里的static关键字有哪些用法?
在变量/函数前 + static:
- 静态局部变量
- 局部变量:动态生存期,每次进入函数时都被初始化,在函数结束时被释放。
- 静态局部变量:只初始化一次,延长了局部变量的生命周期,在程序运行结束以后释放。
- 相同点:作用域都是局部作用域
- 作用:对于局部变量而言,加上static后减少了初始化的次数,改变了生命周期
- 静态全局变量
- 全局变量:作用域为全局作用域,可以通过extern在其他文件中使用
- 静态全局变量:作用域为文件作用域,只能在文件中使用
- 相同点:都存放在全局区,生命周期都是整个程序的运行期
- 作用:对于全局变量而言,加上static后只是改变了作用域范围,将全局作用域改为文件作用域。
- 静态函数
- 作用:对于函数而言,加上static后改变了作用域范围,将全局作用域改为文件作用域,只在声明它的文件中可见,不能被其他文件所使用
- 优点:静态函数不能被其他文件所使用,所以其他文件中可以定义相同名字的函数,不会发生冲突
在类中使用static:
静态成员变量
- 成员变量:每一个类对象都有自己的拷贝。需要实例一个对象,才能通过对象调用对应的成员变量
- 静态成员变量:无论有多少个类对象,在程序中都只有一份拷贝,由所有对象共享访问。并且需要在类内定义,类外初始化。除了通过对象调用之外,还可以通过<类名>::直接限定作用域进行调用。
为什么类内定义,类外初始化?
因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。
// 只有静态常量成员(static const <类名> <变量名>)可以在类内定义,类外初始化。静态成员变量是否遵循类的作用域?
他和普通数据成员一样遵从public,protected,private访问规则。
静态成员函数
- 成员函数:在类的内部实现,属于类定义的一部分,默认隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。
- 静态成员函数:静态成员函数由于没有和任何对象进行联系,因此不具备this指针,所以无法访问成员变量,只能访问非静态成员变量。
// 数据成员与函数之间互相调用
非静态成员函数 可以任意地访问 静态成员函数 和 静态数据成员;
静态成员函数 不能访问 非静态成员函数 和 非静态数据成员,只能访问 静态成员函数 和 静态数据成员。
// 类中的静态成员
静态资源属于类,但是是独立于类存在的。从类的加载机制的角度讲,静态资源是类初始化的时候加载的,而非静态资源是类实例化对象的时候加载的。类的初始化早于类实例化对象,所以在为静态成员/函数赋值地时候,不一定调用了构造函数和析构函数。
如果静态资源通过实例化对象来调用,那一定会进行对象的构造与析构;如果静态资源直接通过类调用,那就不会调用构造函数和析构函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)