一、面向过程 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 - 封装核心:变量私有,函数公有,数据安全可控
- 对象访问:普通对象
.、对象指针-> - 类外实现成员函数必须加
类名::作用域限定符