📐 面向对象
以前写程序像写菜谱:一步一步照着做。面向对象换了个思路——先画「图纸」(类),再按图纸造出一个个「实物」(对象)。封装把内部藏起来,继承让孩子学会爸妈的本领,多态让同一个命令在不同对象身上有不同表现。
考纲知识点:面向对象思想
类的创建和初始化
类的特性:继承、封装、多态
类的创建和初始化
类的特性:继承、封装、多态
📖
考纲 · 知识点详述
摘自《CCF编程能力等级认证 C++&Python 认证标准》C++ 六级
- (6)掌握面向对象的思想,了解封装、继承、多态的基本概念,并掌握类的创建和基本的使用方法。
📚
先学一学
花 6 分钟读完下面 5 课,再去闯关就不慌啦
1
🍳 面向对象 vs 面向过程:菜谱 vs 分工合作
以前我们写的 C++ 是面向过程的:像一本菜谱,从上到下一步一步做——洗菜、切菜、下锅、装盘,顺序不能乱。程序一大,菜谱就长得吓人,改一处可能牵动全身。
👨🍳 换个思路:厨房分工合作
面向对象不写一本大菜谱,而是把厨房分成一个个「角色」:厨师负责炒菜、烤箱负责烤、冰箱负责存食材。每个角色自己有材料(属性)和本事(方法)。程序里每个「角色」就是一个对象,大家各管各的、互相配合。
💡 口诀:面向过程=一本菜谱按步骤走;面向对象=分好角色各干各的活。
🌟 行业实际:为什么大软件都用面向对象?
游戏里的每个角色、银行里的每个账户、手机里的每个 App 窗口,都被做成对象。改「猫咪」的叫声不会碰坏「小狗」的代码——各管各的,几十个工程师一起写也不打架。
💡 口诀:对象各管各,互不添乱;大项目越好维护。
2
📐 类=图纸,对象=按图纸造的实物
想造 100 辆同款玩具车,不会一辆一辆重新设计,而是先画一张图纸(类 class),再照着图纸造很多辆车(对象)。图纸上写清楚:车有什么属性(颜色、轮子数)和什么方法/本事(能跑、能停)。
🧪 读代码:定义类 + 创建对象
看得懂就好,不用背:
class Dog { // 画一张「狗」的图纸
public:
string name; // 属性:名字
void bark() { // 方法:会叫
cout << name << " 汪汪!";
}
};
int main() {
Dog d; // 按图纸造一只狗对象 d
d.name = "旺财";
d.bark(); // 让 d 用方法叫一声
}
public:
string name; // 属性:名字
void bark() { // 方法:会叫
cout << name << " 汪汪!";
}
};
int main() {
Dog d; // 按图纸造一只狗对象 d
d.name = "旺财";
d.bark(); // 让 d 用方法叫一声
}
Dog d; 就是在造对象;d.name 用点号拿它的属性,d.bark() 用点号喊它干活。
💡 口诀:先有 class 图纸,再造对象;用点号「.」拿属性、喊方法。
3
🔒 封装:黑盒子,把秘密藏起来
封装就是把对象内部的东西包好:不想给别人动的部分藏起来(private),允许别人用的部分露出来(public)。想改里面的秘密?必须通过我提供的「窗口」方法,不能直接乱碰。
📱 生活类比:遥控器
你按遥控器上的按钮就能开电视,完全不用知道里面电路怎么走。电视把复杂的内部封装在盒子里,只把按钮(公开接口)留给你——这样你不会按错弄坏它,工程师以后换内部零件也不影响你使用。
💡 口诀:private 藏秘密,public 留窗口;封装=黑盒子,外面按按钮就行。
🧪 读代码:藏起来的年龄
把 age 设为 private,外面就不能直接写 d.age = 99,只能通过方法改:
class Dog {
private:
int age; // 秘密:年纪
public:
void setAge(int a) { // 公开窗口
if (a >= 0) age = a; // 还能顺手检查,不许乱填
}
};
private:
int age; // 秘密:年纪
public:
void setAge(int a) { // 公开窗口
if (a >= 0) age = a; // 还能顺手检查,不许乱填
}
};
💡 口诀:私有藏、公有露;想改秘密走窗口,还能顺手把关。
4
👨👩👧 继承:孩子天生会爸妈的本领
继承是让一个新类(子类)自动拥有已有类(父类)的属性和方法,还能再添自己的新本领。就像小狗从「动物」那儿继承了会吃会睡,还多了一招「汪汪叫」。
🧪 读代码:Cat 继承 Animal
看得懂就好,不用背——冒号后面跟父类:
class Animal { // 父类:动物
public:
void eat() { /* 会吃 */ }
};
class Cat : public Animal { // 子类:猫 继承动物
public:
void meow() { /* 会喵 */ } // 自己的新本领
};
int main() {
Cat c;
c.eat(); // 继承来的本领,能用!
c.meow(); // 自己新增的本领,也能用
}
public:
void eat() { /* 会吃 */ }
};
class Cat : public Animal { // 子类:猫 继承动物
public:
void meow() { /* 会喵 */ } // 自己的新本领
};
int main() {
Cat c;
c.eat(); // 继承来的本领,能用!
c.meow(); // 自己新增的本领,也能用
}
子类比父类「更大更特别」:猫是动物,但动物不一定是猫。
💡 口诀:子类继承父类本领,还能加新招;重复的代码写一次就够。
5
🎭 多态:同一个命令,不同表现
多态意思是「一个命令,多种表现」。对猫喊 speak() 它「喵」,对狗喊 speak() 它「汪」——命令一模一样,不同对象给出不同回答。程序不用知道面前是谁,只要喊一句 speak,它自己会按身份来。
🏫 生活类比:老师说「下课」
同样一句「下课」,爱运动的去操场,爱看书的留在教室,赶公交的冲出校门。命令相同,每个人反应不同——这就是多态。
💡 口诀:同一个命令喊出去,谁收到谁按自己的方式来。
🎂 类的初始化:构造函数,一出生就跑
对象刚被造出来时,需要一个「和类同名的函数」把属性初始化好,它叫构造函数。比如造 Dog 时自动把 name 设成「小黄」、age 设成 0。构造函数在 Dog d; 那一刻自动运行,不用你手动喊。
💡 口诀:构造函数同姓名,对象一出生就自动来报到,把属性安顿好。
🎯
闯关小锦囊 · 考点提醒
- 面向对象:把程序看成一个个会干活的对象;类是图纸,对象是按图纸造出的实物。
- 创建对象:Dog d;,用点号 . 拿属性、调方法。
- 封装:private 藏秘密、public 留窗口,像黑盒遥控器。
- 继承:子类拥有父类的属性和方法,还能加新本领(Cat 继承 Animal)。
- 多态:同一个命令在不同对象上有不同表现;构造函数在对象创建时自动初始化。
- 基类里的虚函数让基类指针按对象真实类型调用函数(动态绑定);构造函数不能写成 virtual,析构函数可以。
🎮
学完了?来闯关!
下面 16 个小挑战,点一点就能玩
Demo 原型 · 每个知识点独立页面 · 暂不含真实编译与进度存储。