前言
作为C++初学者,类与对象是迈入面向对象编程的第一道门槛,也是核心基础。本文将以生活化比喻+极简代码示例+避坑指南的形式,梳理类与对象相关的核心知识点(类与对象、访问权限、构造/析构函数、函数重载、缺省参数、运算符重载),内容通俗易懂,适合新手复习巩固。
目录
类与对象:从“图纸”到“实物”的抽象
public/private:给类的成员加“权限锁”
构造函数:对象的“出生初始化说明书”
函数重载:同名不同参的“智能函数”
缺省参数:函数参数的“兜底值”
析构函数:对象的“报废收尾员”
运算符重载:给自定义类定制“运算符规则”
核心知识点总结
1. 类与对象:从“图纸”到“实物”的抽象
核心比喻
-
类(Class):汽车厂家的“汽车设计图纸”——规定了汽车的属性(颜色、品牌、速度)和行为(启动、加速),但图纸本身不是能开的车;
-
对象(Object):照着图纸造出来的“具体某一辆车”(比如你的白色特斯拉)——有专属的属性值,能执行图纸规定的行为。
核心要点
类是抽象的模板,对象是类的具体实例;
先有类(图纸),后有对象(实物),一个类可创建多个对象;
C++的类是C语言结构体的“超级升级版”:结构体只有属性,类兼具属性+行为,还能控制访问权限。
极简代码示例
#include <iostream>
#include <string>
using namespace std;
// 类(图纸)
class Car {
private:
// 属性(成员变量)
string brand;
string color;
int speed;
public:
// 行为(成员函数)
Car(string b, string c) : brand(b), color(c), speed(0) {}
void accelerate(int add) {
speed += add;
cout << color << "的" << brand << "加速到" << speed << "km/h" << endl;
}
};
int main() {
// 对象(实物)
Car my_car("特斯拉", "白色"); // 实例化对象
my_car.accelerate(50); // 调用对象的行为
return 0;
}
2. public/private:给类的成员加“权限锁”
核心比喻
-
private(私有成员):冰箱内部的压缩机、电路板——核心部件,外部不能直接操作,只能靠冰箱内部逻辑控制;
-
public(公有成员):冰箱的温度调节按钮、门——对外的操作接口,外部只能通过这些接口和冰箱交互。
核心要点
private:类的核心属性/函数,外部(如main函数)无法直接访问,只能被类内部函数操作,用于保护数据不被随意篡改;
public:类的对外接口,外部可直接访问/调用,是交互的唯一合法通道;
类的成员默认是private,结构体(struct)默认是public。
避坑点
不要为了图方便把所有成员设为public——会导致核心数据(比如汽车速度)被外部随意改成离谱值(如1000km/h),破坏代码逻辑。
3. 构造函数:对象的“出生初始化说明书”
核心比喻
构造函数是提新车时的“初始化操作”(上牌、加第一箱油)——对象创建时自动执行,避免属性变成随机的“垃圾值”。
核心要点
名字和类名完全相同,无返回值(连void都不写);
创建对象时自动调用,无需手动调用;
可自定义:无参构造(默认值)、带参构造(指定初始值);
推荐用初始化列表(Car(string b) : brand(b) {})赋值,效率更高。
极简代码示例
class Car {
private:
string brand;
int speed;
public:
// 带参构造(初始化列表写法)
Car(string b) : brand(b), speed(0) {}
// 无参构造
Car() : brand("未知"), speed(0) {}
};
4. 函数重载:同名不同参的“智能函数”
核心比喻
函数重载像多功能遥控器的“音量+”按钮——同一个按钮(函数名),按一下(无参)加1,长按(传参)加5,按的同时按模式键(多参数)加10。
核心规则
函数名必须相同,参数列表必须不同(个数/类型/顺序不同);
返回值不同不算重载(编译器无法区分);
调用优先级:精确匹配 > 唯一隐式转换匹配 > 报错(无匹配/模糊匹配)。
避坑点
缺省参数和重载结合易导致模糊匹配(比如func()和func(int a=10)),编译器无法确定调用哪个,直接报错。
极简代码示例
class Car {
private:
int speed = 0;
public:
// 重载1:无参加速
void accelerate() { speed += 10; }
// 重载2:指定加速值
void accelerate(int add) { speed += add; }
// 重载3:加速值+是否急加速
void accelerate(int add, bool fast) { speed += fast ? add*2 : add; }
};
5. 缺省参数:函数参数的“兜底值”
核心比喻
缺省参数像点外卖默认配1套餐具——不传参数用默认值,传参数覆盖默认值。
核心规则
缺省参数必须从右往左指定(不能跳过右边给左边设);
同一参数不能多次指定缺省值(比如声明和定义中只能设一次)。
极简代码示例
// 正确:从右往左设缺省参数
void accelerate(int add=10, bool fast=false) {
speed += fast ? add*2 : add;
}
// 错误:跳过右边给左边设
// void accelerate(int add=10, bool fast) {}
6. 析构函数:对象的“报废收尾员”
核心比喻
析构函数是汽车报废时的“收尾操作”(注销车牌、回收配件)——对象销毁时自动执行,清理动态资源(如new的内存),避免泄漏。
核心要点
名字为~类名(如~Car()),无返回值、无参数、不能重载;
编译器会生成默认析构,但默认析构不清理动态资源(比如new的内存);
手动调用析构函数会导致重复释放资源,程序崩溃。
核心场景(清理动态内存)
class Car {
private:
int* speed; // 动态内存指针
public:
Car() { speed = new int(0); } // 申请内存
~Car() { delete speed; } // 析构清理内存
};
7. 运算符重载:给自定义类定制“运算符规则”
核心比喻
运算符重载像给专属魔法尺子定制规则——内置类型(int)能直接用+、<<,自定义类(Car)通过重载让my_car+50表示加速,cout<<my_car表示打印信息。
核心规则
函数名固定为operator+/operator<<等,不能创造新运算符;
不能改变运算符的优先级/操作数个数/结合性;
常用写法:<</>>用友元函数,其余(+、==等)用成员函数。
常用示例
class Car {
private:
string brand;
int speed = 0;
public:
Car(string b) : brand(b) {}
// 重载+号(成员函数)
Car operator+(int add) {
Car new_car(brand);
new_car.speed = speed + add;
return new_car;
}
// 重载<<号(友元函数)
friend ostream& operator<<(ostream& out, const Car& car) {
out << car.brand << "速度:" << car.speed;
return out;
}
};
8. 核心知识点总结
类是抽象模板,对象是具体实例,public/private控制成员访问权限;
构造函数初始化对象,析构函数清理动态资源,二者均自动调用;
函数重载看参数(同名不同参),缺省参数从右往左设,二者结合需避免模糊匹配;
运算符重载是特殊的函数重载,让类对象能像内置类型一样使用运算符,遵循语义直觉。
结尾
类与对象是C++面向对象编程的基础,本文梳理的知识点覆盖了新手入门的核心内容。建议结合代码实操(比如改写Car类的示例)加深理解,后续可进一步学习深拷贝/浅拷贝、继承、多态等进阶知识点。如果有疑问,欢迎在评论区交流~




