C++面向对象编程:从封装到实战

一、面向过程 VS 面向对象

1. 面向过程(之前全部所学)

核心:步骤化、流程驱动先做什么、再做什么,函数独立零散。适合:简单小程序、逻辑简单场景。

2. 面向对象(C++ 核心)

核心:万物皆对象,封装整体 将「数据 + 操作数据的行为」打包成一个整体 ------ 。三大特性:封装、继承、多态(本篇吃透封装)


二、类与对象 核心概念

  1. 类(class) 抽象模板,描述一类事物的共性;包含:成员变量(属性)+ 成员函数(行为)

  2. 对象 类的具体实例,通过类创建出来的实体;一个类可以实例化无数个对象。

通俗类比:

  • 类 = 房子图纸
  • 对象 = 实际盖出来的每一套房子

三、类的语法结构

复制代码
class 类名
{
// 访问权限
访问修饰符:
    // 成员变量
    变量定义;

    // 成员函数
    函数声明/定义;
};

访问权限(三大权限)

  1. private 私有:仅本类内部访问,默认权限
  2. public 公有:类内、类外、全局都能访问
  3. protected 保护:继承专用,后续讲解

四、最简类定义 + 对象实例化

1. 定义一个 Person 类

复制代码
#include <iostream>
#include <string>
using namespace std;

// 定义类
class Person
{
// 公有权限
public:
    // 成员变量:属性
    string name;
    int age;

    // 成员函数:行为
    void showInfo()
    {
        cout << "姓名:" << name 
             << " 年龄:" << age << endl;
    }
};

2. 创建对象 & 调用成员

复制代码
int main()
{
    // 方式1:栈上实例化对象
    Person p1;
    p1.name = "张三";
    p1.age = 18;
    p1.showInfo();

    // 方式2:多个对象互相独立
    Person p2;
    p2.name = "李四";
    p2.age = 20;
    p2.showInfo();

    return 0;
}

输出:

复制代码
姓名:张三 年龄:18
姓名:李四 年龄:20

五、封装的核心思想

1. 为什么需要封装?

  • 保护核心数据,防止外部随意篡改
  • 统一接口访问,代码更安全、易维护
  • 隐藏内部实现,只暴露必要功能

2. 标准封装写法

成员变量私有化(private) 提供公有 get/set 函数 读写数据

封装标准模板:

复制代码
class Student
{
private:
    // 私有成员:外部无法直接访问
    int id;
    double score;

public:
    // set:设置私有变量
    void setId(int _id)
    {
        id = _id;
    }
    void setScore(double _s)
    {
        // 可加数据校验,防止非法值
        if(_s >= 0 && _s <= 100)
        {
            score = _s;
        }
    }

    // get:读取私有变量
    int getId()
    {
        return id;
    }
    double getScore()
    {
        return score;
    }
};

3. 封装调用演示

复制代码
int main()
{
    Student s;
    // s.id = 1001;  // 报错!私有无法直接访问

    s.setId(1001);
    s.setScore(92.5);

    cout << "学号:" << s.getId() << endl;
    cout << "成绩:" << s.getScore() << endl;

    return 0;
}

六、对象的两种创建方式

  1. 栈对象(常用、自动释放)

    Person p;

  2. 堆对象 / 动态对象(new 创建,手动释放)

    Person* p = new Person;
    p->name = "王五";
    p->showInfo();

    // 手动释放
    delete p;
    p = nullptr;

对象指针访问成员使用 ->,普通对象使用 .


七、类内函数 与 类外函数分离写法

大型项目常用:类内声明,类外实现,结构更清晰

复制代码
class Person
{
public:
    string name;
    int age;
    void work(); // 类内声明
};

// 类外实现,加 类名:: 作用域
void Person::work()
{
    cout << name << " 正在工作" << endl;
}

八、高频易错点

  1. class 默认权限为 private,struct 默认 public
  2. 私有成员直接在类外访问,编译报错
  3. 对象指针误用 .、普通对象误用 ->
  4. 堆对象忘记 delete,造成内存泄漏
  5. 未封装直接暴露所有成员,不符合工程规范

九、今日核心总结

  1. 类是模板,对象是实例,C++ 面向对象基础
  2. 三大访问权限:public / private / protected
  3. 封装核心:变量私有,函数公有,数据安全可控
  4. 对象访问:普通对象 . 、对象指针 ->
  5. 类外实现成员函数必须加 类名:: 作用域限定符
相关推荐
无敌昊哥战神1 小时前
【LeetCode 491】递增子序列:不能排序怎么去重?一文讲透“树层去重”魔法!
c语言·c++·python·算法·leetcode
巨量HTTP1 小时前
Python 获取动态 iframe 内容(完整解决方案)
开发语言·python
Queenie_Charlie1 小时前
关于二叉树
数据结构·c++·二叉树
王江奎2 小时前
Windows 跨平台 C/C++ 项目中的 UTF-8 路径陷阱
c++·windows·跨平台
minji...2 小时前
Linux 网络套接字编程(三)UDP服务器与客户端实现:Windows与Linux通信,新增字典翻译功能的 UDP 通信
linux·服务器·开发语言·网络·windows·算法·udp
人道领域2 小时前
【Redis实战篇】秒杀系统:一人一单高并发实战(synchronized锁实战与事务失效问题)
java·开发语言·数据库·redis·spring
艾莉丝努力练剑2 小时前
【Linux网络】计算机网络入门:网络通信——跨主机的进程间通信(IPC)与Socket编程入门
linux·运维·服务器·网络·c++·学习·计算机网络
0xDevNull2 小时前
Spring中统一异常处理详细教程
java·开发语言·后端