当前位置: 首页 > news >正文

C++核心:封装与static静态成员实战指南

一、上期回顾

掌握核心:类与对象、构造 / 析构、拷贝构造、this 指针、初始化列表。今天主攻:封装完整落地 + static 静态成员 + 生命周期


二、封装核心原理

1. 封装定义

  • 成员变量私有化
  • 对外只暴露公有成员函数作为访问接口
  • 屏蔽内部实现细节,防止外部非法修改

2. 三大访问权限汇总

表格

权限访问范围
private仅本类内部(默认)
public任意位置访问
protected本类 + 子类(继承用)

3. 标准封装写法

  • 成员变量全部private
  • 提供set / get函数读写
  • 数据校验写在 set 中,保证数据合法
#include <iostream> using namespace std; class Student { private: int id; int score; public: // 写入+数据校验 void setScore(int s) { if(s >= 0 && s <= 100) score = s; else score = 0; } int getScore() { return score; } void setId(int i) { id = i; } int getId() { return id; } };

三、static 静态成员(重点)

1. 静态成员变量

  • 不属于单个对象,属于整个类
  • 全局只开辟一份内存,所有对象共享
  • 必须类外初始化
class Person { public: static int count; // 静态成员声明 Person() { count++; } }; // 类外初始化 int Person::count = 0;

2. 静态成员函数

  • 只能访问静态成员
  • 没有 this 指针
  • 可通过类名::直接调用
class Person { public: static int cnt; static void showCnt() { cout << cnt << endl; } }; // 调用方式 Person::showCnt();

四、static 完整演示代码

#include <iostream> using namespace std; class Person { private: int age; public: static int num; Person() { age = 0; num++; } ~Person() { num--; } static void printNum() { cout << "当前对象数量:" << num << endl; } }; // 静态变量全局初始化 int Person::num = 0; int main() { Person p1; Person::printNum(); Person p2; Person::printNum(); return 0; }

运行结果:

当前对象数量:1 当前对象数量:2

五、对象生命周期详解

1. 栈对象(普通定义)

Person p;
  • 生命周期:所在代码块内
  • 出作用域自动调用析构、自动释放
  • 开销小,常用

2. 堆对象(new 创建)

Person* p = new Person; delete p;
  • 生命周期:手动控制
  • 不 delete 不会自动析构,造成内存泄漏
  • 适合大型对象、跨函数使用

3. 全局对象

Person g_p; int main(){}
  • 生命周期:整个程序运行期间
  • 程序启动先构造,程序结束后析构

六、const 修饰成员(拓展必背)

  1. const 成员函数不修改任何成员变量,只读函数
void show() const { cout << age << endl; }
  1. const 对象只能调用 const 成员函数

七、今日核心总结

  1. 封装:变量私有、接口公有、数据校验,工程规范必备
  2. static 成员:类共享、单份内存、统计对象数量常用
  3. 静态函数:无 this、只能访问静态变量
  4. 三种对象:栈 / 堆 / 全局,生命周期完全不同

八、今日练习

  1. 写一个 Student 类,全部成员私有化
  2. 用 static 统计一共实例化多少学生对象
  3. 分别创建栈对象、堆对象,观察构造与析构调用次数
http://www.jsqmd.com/news/717925/

相关文章:

  • Keil5开发环境下的嵌入式项目展示:用Kandinsky为产品原型制作动态介绍
  • 个人医疗保险赔付流程的生命周期的庖丁解牛
  • IEC 62820 国际标准技术解读:奥敏参与的5项核心标准清单
  • 仅2个月,用上价格战的外资油车又暴跌,国产电车再度主导市场
  • ​一分钟了解UART协议
  • 手把手教你如何在服务器部署超火的Hermes Agent(爱马仕龙虾)的详细图文教程
  • 基于 ESP32-S3 + VB6824 的四博 AI 双目交互终端设计:从双目动画到多模态事件系统
  • 养老护理经验分享|老年痴呆老人照料心得,以真心换安心
  • 中国保险的前世今生的庖丁解牛
  • 09.YOLOv5/v8 实战全指南:核心原理+代码实现+ONNX/TensorRT部署
  • 数组·学习笔记
  • GTE文本向量在客服场景的应用:快速分析用户反馈与情感倾向
  • M2FP从部署到应用:完整流程解析,快速实现多人图像语义分割
  • 【车载Java中间件选型红黑榜】:对比12家OEM实测数据,Spring Boot vs OSGi vs AUTOSAR Java Binding谁主沉浮?
  • 从注册到订阅再到防封号,国内用 Claude 的完整避坑手册(2026 最新)
  • Yesorno.ai公测启动:去中心化信息聚合市场进入全新发展阶段
  • 拆解brpc的RDMA内存池:告别malloc,高效管理注册内存的奥秘
  • 春联生成模型-中文-base实战教程:与Notion API联动实现春联知识库
  • 被头条爬虫单日5600万次抓取,JT808车载服务器平稳扛压复盘(附可复用配置)
  • 翻译模型HY-MT1.5-1.8B优化升级:GGUF量化版本性能提升指南
  • VS Code 远程容器开发环境性能断崖式下跌?紧急修复指南:从Dockerfile到devcontainer.json的6层诊断法
  • C语言模拟实现C++的继承与多态示例
  • 基于Cosmos-Reason1-7B的智能客服场景实战:意图识别与多轮对话
  • 【HTML教程】跟着菜鸟学语言—HTML5个人笔记经验(一)
  • Docker守护进程拒绝WASM容器启动?Root Cause锁定systemd cgroup v2 + seccomp策略冲突(附一键disable验证命令)
  • GLM-OCR文档解析工具5分钟极速部署:单卡4090也能跑的智能OCR
  • 为什么头部自动驾驶公司已禁用`std::tuple`手工展开?C++27静态反射在实时系统中的4个硬核落地场景
  • c++代码各种注释示例详解
  • 如何解析HTTP请求中的完整URL
  • 容器云 Docker 部署实战