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

一、上期回顾

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


二、封装核心原理

1. 封装定义

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

2. 三大访问权限汇总

表格

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

3. 标准封装写法

  • 成员变量全部 private

  • 提供 set / get 函数读写

  • 数据校验写在 set 中,保证数据合法

    #include
    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;
    }

  2. const 对象只能调用 const 成员函数


七、今日核心总结

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

八、今日练习

  1. 写一个 Student 类,全部成员私有化
  2. 用 static 统计一共实例化多少学生对象
  3. 分别创建栈对象、堆对象,观察构造与析构调用次数
相关推荐
新知图书14 小时前
第 14 章 后训练算法GRPO详解与实战
人工智能·算法
小白学大数据14 小时前
Codex 里的 GPT 6 Astra、GPT 5.6 Sol、Terra、Luna 怎么选
开发语言·gpt·microsoft
l1t15 小时前
DeepSeek 4.1总结的Tom Lane 谈塑造 Postgres 三十年历程的架构决策
开发语言·数据库·postgresql·架构
shirsl16 小时前
算法 Day1-数组 / 哈希 + 双指针
python·算法·哈希算法
djarmy21 小时前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
HEJOO91 天前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧1 天前
Java:no content to map due to end of input
java·开发语言
梦梦代码精1 天前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
隔窗听雨眠1 天前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
David猪大卫1 天前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试