cpp的static的实现

本文详细探讨了C++中的static关键字,包括static成员变量、成员函数、全局变量和局部变量的用法及特点。强调了static成员变量的访问限制和内存分配区域,static成员函数无法访问非静态成员,以及static全局变量的作用域限制。同时讨论了static为什么不能在类内初始化,但static const成员变量却可以,并解释了其背后的编译原理。最后提出了待解决的问题,如Java中static的处理方式与C++的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

学习自用,有错麻烦提一下

正文

static成员变量

static修饰的值会在静态区分配空间,是在编译时期就分配了空间,(那么在没运行时就占用了可执行文件的大小吧),

可以把static与全局变量作比较,实际上的实现也是像全局变量一样额外放一个地方,全局变量放在全局区,静态变量放在静态区局区,不同之处就在于static的类成员是指定只能类来访问的,相当于static成员变量做了访问限制的全局变量

static成员函数

不同于static的成员变量,static修饰的成员函数在代码区分配内存(函数都是在代码区分配的吗?),另外静态成员函数是不能访问类的非静态成员的,这个和全局变量一个意思,可能是因为生命周期不同的考虑,而编译器故意做的限制,

static全局变量

static如果修饰全局变量,会把作用域限制到单个文件中,且此声明会放在静态区中(好像有全局区的情况?),(它是怎么限制到只有单个文件的啊,阻止ld的链接吗?)

对于static全局函数,也是同一个道理,只给当前文件使用

static局部变量

在局部变量定义static,也相当于是一个全局变量,但是只有这局部作用域可以访问,这个static局部变量是分配在全局区的(为什么不是静态区呢)

static为什么不能类内初始化

类内初始化static变量就算编译能通过,链接不能通过??任何include了这个类的定义的文件里都会包含这个全局变量,linker会出错的,换句话说,类的static变量像全局变量可以看成全局变量,如果被多个文件包含了这个定义了这个类的头文件会导致重复定义的链接保存,,看参考资料2,不过C++17好像就不需要这样了

static const成员变量

作用是类的内部常数,const不可修改,enum也能达成此效果,即像static一样在编译时期分配,或者说叫编译器常量,,用#define虽然不是编译时期常量,也能达到类似效果且;;至于说为什么可以在类内定义

### C++ 中 `static` 关键字的用法 #### 静态局部变量 静态局部变量仅初始化一次,并且其生命周期持续到程序结束。这使得即使函数返回后,该变量仍然保持上次调用的状态。 ```cpp void func() { static int counter = 0; ++counter; std::cout << "Counter: " << counter << '\n'; } ``` 每次调用 `func()` 函数时,`counter` 的值会累加而不是重新初始化[^1]。 #### 类中的静态成员变量 类内的静态数据成员属于整个类而非某个特定的对象实例;因此所有对象共享同一个静态成员副本。定义时需在外部分配内存空间并初始化。 ```cpp class MyClass { public: static int count; // 声明 }; int MyClass::count = 0; // 定义与初始化 ``` 此类静态成员可以通过类名访问而无需创建任何对象实例[^2]。 #### 成员函数前加上 static 当方法被声明为静态时,则意味着它不依赖于具体的对象状态,可以独立工作。这类方法通常用于实现工具性质的功能或是管理静态资源。 ```cpp class UtilityClass { public: static void utilityFunction(); }; ``` 注意这里的方法不需要 this 指针来操作对象的数据成员[^3]。 #### 文件作用域下的外部链接符 如果希望全局变量只在一个源文件内部可见而不暴露给其他编译单元的话,可以在定义之前加上 `static` 来限定其可见范围。 ```cpp // file.cpp static int secretNumber = 42; // 此处secretNumber不会与其他翻译单位冲突 ``` 这种情况下,即便两个不同的 .cpp 文件都含有相同名称的静态变量也不会发生命名冲突问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值