【C++入门】Cyber高维的蜂巢意识 —— 【类与对象】static 成员

⚡ CYBER_PROFILE ⚡
/// SYSTEM READY ///


WARNING \]: DETECTING HIGH ENERGY **🌊 🌉 🌊 心手合一 · 水到渠成** ![分隔符](https://i-blog.csdnimg.cn/direct/60a3de2294e9439abad47378e657b337.gif) |------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------| | **\>\>\> ACCESS TERMINAL \<\<\<** || | [**\[ 🦾 作者主页 \]**](https://blog.csdn.net/fengtinghuqu520?spm=1000.2115.3001.5343) | [**\[ 🔥 C语言核心 \]**](https://blog.csdn.net/fengtinghuqu520/category_12955956.html) | | [**\[ 💾 编程百度 \]**](https://blog.csdn.net/fengtinghuqu520/category_13083835.html) | [**\[ 📡 代码仓库 \]**](https://blog.csdn.net/fengtinghuqu520/article/details/147275999?spm=1001.2014.3001.5502) | --------------------------------------- Running Process: 100% \| Latency: 0ms *** ** * ** *** #### 索引与导读 * [数据存储段名](#数据存储段名) * [一、局部静态变量(面向过程编程)](#一、局部静态变量(面向过程编程)) * [二、静态成员变量(面向对象编程)](#二、静态成员变量(面向对象编程)) * [三、全局静态变量](#三、全局静态变量) * [四、总结表](#四、总结表) * [五、静态变量的初始化逻辑](#五、静态变量的初始化逻辑) * [六、静态成员函数](#六、静态成员函数) * * [核心特性一:① 无 this 指针](#核心特性一:① 无 this 指针) * [核心特性二:② 访问权限限制](#核心特性二:② 访问权限限制) * [核心特性三:③ 灵活的调用方式](#核心特性三:③ 灵活的调用方式) * [核心特性四:④ 内存模型](#核心特性四:④ 内存模型) * [图表总结](#图表总结) * [💻结尾--- 核心连接协议](#💻结尾— 核心连接协议) ## 数据存储段名 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c5afff78ac9c46559258e5e7eb56cfdf.png) ## 一、局部静态变量(面向过程编程) * **生命周期:** 它不再存储在线上,而是存储在**全局/静态存储区**。它在程序第一次执行到声明处时初始化,直到程序结束才销毁 * **可见性:** 尽管它寿命很长,但它仍是**局部**的,只能在定义它的函数内部访问 * **典型用途:** 记录函数被调用的次数,或者实现单例模式 ```cpp void countCalls { static int count = 0; count++; cout << "被调用次数" << count << endl; } ``` *** ** * ** *** ## 二、静态成员变量(面向对象编程) 在类`(class)`中,静态成员属于**类本身**,而不是属于类的某个具体对象 * **共享性:** 所有该类的对象共享同一个静态变量副本。 * **初始化:** 通常在类内声明,在类外定义并初始化(除非是 `const` 整数类型或 `C++17` 的 `inline static`)。 * **访问方式:** 可以使用 **类名加作用域解析符** `ClassName::variable` 访问,也可以通过对象访问。 ```cpp class Player { public: static int totalPlayers; // 声明 Player() { totalPlayers++; } }; int Player::totalPlayers = 0; // 必须在类外定义 ``` *** ** * ** *** ## 三、全局静态变量 在文件作用域(所有函数之外)使用 `static`,其主要目的是**限制链接属性** * 内部链接性(`Internal` `Linkage`):该变量仅在定义它的当前源文件(`.cpp`)中可见。 * 防止冲突:如果另一个文件中也定义了同名的全局变量,编译器不会报错,因为 `static` 将其限制在了当前文件的"私人空间"内。 * 注意:在现代 `C++` 中,更推荐使用匿名命名空间(`Anonymous` `Namespaces`)来替代全局静态变量,以实现相同的功能 **加上 `static` 后,每个变量都被锁在了自己的文件里** **utils.cpp** ```cpp #include #using namespace std; static int secretValue = 100; // 仅在 utils.cpp 可见 void printUtilsSecret() { cout << "Utils 中的 secretValue: " << secretValue << endl; } ``` **main.cpp** ```cpp #include #using namespace std; // 声明外部函数 void printUtilsSecret(); static int secretValue = 200; // 仅在 main.cpp 可见,与 utils.cpp 的互不干扰 int main() { cout << "Main 中的 secretValue: " << secretValue << endl; printUtilsSecret(); // 调用另一个文件里的函数 return 0; } ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/816605544ee2476ca18c44a868c6ef6b.png) * **分析:** 即使名字一模一样,它们在内存中也是两个独立的变量。`main.cpp` 无法通过任何手段访问到 `utils.cpp` 里的那个 `secretValue`。 *** ** * ** *** ## 四、总结表 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/90d144cf02dc470a92a89ca58a02b327.png) *** ** * ** *** ## 五、静态变量的初始化逻辑 **静态初始化** 在程序加载时完成 * **零初始化**:所有静态变量在程序启动时首先被清零 * **常量初始化** :如果初始值是编译时常量(如 `static int x = 10;`),则直接硬编码在二进制文件的` .data` 段 **动态初始化** 如果初始值需要调用函数或涉及运行时计算(如 `static int y = get_value();`),则属于动态初始化 * **全局/成员静态变量:** 在`main`函数执行前的**启动序列**中执行 * **局部静态变量:** 在代码第一个执行到该执行时执行 *** ** * ** *** ## 六、静态成员函数 在类定义中,使用 static 关键字修饰的成员函数即为静态成员函数。它属于类本身,而不是类的某个具体对象 ```cpp class Player { public: static int getCount() { // 静态成员函数 return totalPlayers; } private: static int totalPlayers; // 静态成员变量 }; ``` ### 核心特性一:① 无 this 指针 这是静态成员函数最根本的特征。普通成员函数在调用时会隐式传递 this 指针指向当前对象,而静态成员函数没有这个指针 * **后果:** 它无法直接访问类的非静态数据成员和非静态成员函数 ```cpp #include using namespace std; class Test { private: int val = 100; public: static void staticFunc(){ cout << "静态成员函数,无this指针" << endl; } }; ``` * **❌ 错误:无法访问非静态成员** `cout << val << endl;` * **❌ 错误:没有 this 指针** `cout << this->val < class Demo { private: static int count; // 静态成员 int id; // 非静态成员 public: static void staticOnly() { count = 10; // ✅ 可直接访问静态成员 helperStatic(); // ✅ 可调用其他静态成员函数 // id = 5; // ❌ 无法访问非静态成员 // normalFunc(); // ❌ 无法调用非静态成员函数 } static void helperStatic() { std::cout << "静态辅助函数" << std::endl; } void normalFunc() { std::cout << "普通成员函数" << std::endl; } }; int Demo::count = 0; ``` *** ** * ** *** ### 核心特性三:③ 灵活的调用方式 ```cpp #include class Player { private: static int totalPlayers; public: Player() { totalPlayers++; } ~Player() { totalPlayers--; } static int getCount() { return totalPlayers; } }; int Player::totalPlayers = 0; int main() { // ✅ 类名直接调用(推荐) std::cout << "当前玩家数: " << Player::getCount() << std::endl; Player p1; Player p2; // ⚠️ 对象名调用(可行,但易混淆) std::cout << "p1 视角: " << p1.getCount() << std::endl; std::cout << "p2 视角: " << p2.getCount() << std::endl; return 0; } ``` *** ** * ** *** ### 核心特性四:④ 内存模型 ```cpp #include class Empty { public: static void func() { std::cout << "静态成员函数" << std::endl; } }; int main() { Empty e; std::cout << "空类(含静态成员函数)大小: " << sizeof(e) << " 字节" << std::endl; // 输出:1 字节(占位,不包含静态函数大小) // 静态成员函数位于代码段,不占用对象内存 return 0; } ``` *** ** * ** *** ### 图表总结 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7555289226214716bf486f6997899b33.png) *** ** * ** *** ## 💻结尾--- 核心连接协议 **警告:** 🌠🌠正在接入底层技术矩阵。如果你已成功破解学习中的逻辑断层,请执行以下指令序列以同步数据:🌠🌠 *** ** * ** *** **【📡】 建立深度链接:** **关注**本终端。在赛博丛林中深耕底层架构,从原始代码到进阶协议,同步见证每一次系统升级。 **【⚡】 能量过载分发:** 执行**点赞**操作。通过高带宽分发,让优质模组在信息流中高亮显示,赋予知识跨维度的传播力。 **【💾】 离线缓存核心:** 将本页加入**收藏**。把这些高频实战逻辑存入你的离线存储器,在遭遇系统崩溃或需要离线检索时,实现瞬时读取。 **【💬】 协议加密解密:** 在**评论区**留下你的散列码。分享你曾遭遇的代码冲突或系统漏洞(那些年踩过的坑),通过交互式编译共同绕过技术陷阱。 **【🛰️】 信号频率投票:** 通过**投票**发射你的选择。你的每一次点击都在重新定义矩阵的进化方向,决定下一个被全量拆解的技术节点。 *** ** * ** *** ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/57b03915c54b43a7a03fa92dbbfe57c3.gif) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0905dc972de8414bb602715de3f866ee.gif)

相关推荐
开开心心就好1 小时前
实用PDF批量加马赛克,抹除敏感信息绿色版
java·linux·开发语言·网络·人工智能·pdf·word2vec
不想看见4041 小时前
Word Ladder Ⅱ -- 广度优先搜索--力扣101算法题解笔记
开发语言·c#
xyq20241 小时前
HTML 速查列表
开发语言
ShineWinsu1 小时前
对于stack和queue经典算法题目:155. 最小栈、JZ31 栈的压入、弹出序列和102. 二叉树的层序遍历的解析
数据结构·c++·算法·面试·力扣·笔试·牛客网
全栈小51 小时前
【C#】.net 6.0和8.0有什么区别,以及8.0增加了那些功能,这些功能有那些作用
开发语言·c#·.net
SWAGGY..1 小时前
【c++初阶】:(1)c++入门基础知识
开发语言·c++
froginwe112 小时前
Bootstrap 输入框组
开发语言
lly2024062 小时前
HTML 脚本:构建交互式网页的基石
开发语言
0 0 02 小时前
CCF-CSP 40-3 图片解码(decode)【C++】考点:矩阵翻转/旋转
开发语言·c++·矩阵