C++面向对象编程:从封装到实战
一、面向过程 VS 面向对象
1. 面向过程(之前全部所学)
核心:步骤化、流程驱动先做什么、再做什么,函数独立零散。适合:简单小程序、逻辑简单场景。
2. 面向对象(C++ 核心)
核心:万物皆对象,封装整体将「数据 + 操作数据的行为」打包成一个整体 ——类。三大特性:封装、继承、多态(本篇吃透封装)
二、类与对象 核心概念
类(class)抽象模板,描述一类事物的共性;包含:成员变量(属性)+ 成员函数(行为)。
对象类的具体实例,通过类创建出来的实体;一个类可以实例化无数个对象。
通俗类比:
- 类 = 房子图纸
- 对象 = 实际盖出来的每一套房子
三、类的语法结构
class 类名 { // 访问权限 访问修饰符: // 成员变量 变量定义; // 成员函数 函数声明/定义; };访问权限(三大权限)
private私有:仅本类内部访问,默认权限public公有:类内、类外、全局都能访问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; }六、对象的两种创建方式
- 栈对象(常用、自动释放)
Person p;- 堆对象 / 动态对象(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; }八、高频易错点
- class 默认权限为
private,struct 默认public - 私有成员直接在类外访问,编译报错
- 对象指针误用
.、普通对象误用-> - 堆对象忘记 delete,造成内存泄漏
- 未封装直接暴露所有成员,不符合工程规范
九、今日核心总结
- 类是模板,对象是实例,C++ 面向对象基础
- 三大访问权限:
public / private / protected - 封装核心:变量私有,函数公有,数据安全可控
- 对象访问:普通对象
.、对象指针-> - 类外实现成员函数必须加
类名::作用域限定符
