目录
C++面向对象真没那么难:类与对象(上篇)
类就像手机设计图,对象就是你手里的iPhone
这篇没有复杂理论,只有小白秒懂的生活例子 + 手把手代码实操,包你30分钟摸透面向对象第一关!
一、类:现实世界的“设计图纸”
想象你要造手机:
- 设计图(类):规定手机要有屏幕/电池/摄像头(属性),能打电话/拍照(功能)
- 真机(对象):按照图纸造出来的iPhone14(具体存在的事物)
1.1 定义类就像写手机配置单
// 声明一个“手机”类
class Phone {
public: // 公共区域(外人能用的功能)
// 成员变量(属性)
float screenSize; // 屏幕尺寸
int battery; // 电池容量
// 成员函数(功能)
void call(string number) {
cout << "正在拨打:" << number << endl;
}
void takePhoto() {
cout << "咔嚓!照片已保存" << endl;
}
}; // 注意分号不能丢!
关键点解释:
public
:就像手机外壳的按钮,外部可以直接访问- 成员变量:描述特征的数据(如屏幕尺寸6.1英寸)
- 成员函数:描述行为的功能(拍照/打电话)
💡 对比现实:所有iPhone14都按照同一张图纸生产 → 一个类能创建无数对象!
二、对象:图纸造出来的“真机”
2.1 创建对象就像生产手机
int main() {
// 生产线1:造一台iPhone14(栈上创建)
Phone iphone14;
iphone14.screenSize = 6.1; // 装6.1寸屏
iphone14.battery = 3279; // 装3279mAh电池
// 生产线2:造一台Mate60(堆上创建)
Phone* mate60 = new Phone();
mate60->screenSize = 6.7; // 箭头访问堆对象
mate60->battery = 4700;
delete mate60; // 不用了记得拆解回收!
}
两种创建方式对比:
创建方式 | 特点 | 生命周期 | 访问方式 |
---|---|---|---|
栈对象 | Phone myPhone; | 自动销毁 | 点运算符. |
堆对象 | new Phone() | 需手动delete | 箭头-> |
⚠️ 新手坑:忘写
delete
→ 内存泄漏(相当于废旧手机堆满仓库)
三、访问控制:手机的“安全锁”
类用三种权限保护内部数据:
class BankAccount {
private: // 保险箱区域(仅内部能开)
string password = "888888"; // 密码藏这里
public: // 营业大厅(对外开放)
double balance = 1000.0; // 余额
// 唯一修改密码的通道
bool changePwd(string oldPwd, string newPwd) {
if (oldPwd == password) {
password = newPwd;
return true;
}
return false;
}
};
权限对照表:
关键词 | 谁可以访问 | 现实类比 |
---|---|---|
private | 仅类内部 | 手机主板(不能乱碰) |
public | 所有代码 | 手机充电口(随便用) |
protected | 类内和子类(中篇讲) | 家族继承的金库钥匙 |
✅ 封装的好处:防止你手滑把
password
改成123456
→ 账户更安全!
四、构造函数:手机的“出厂设置”
4.1 自动执行的初始化
每次创建对象时,构造函数自动调用(不用手动触发):
class Student {
private:
string name;
int id;
public:
// 构造函数(名字和类相同)
Student(string stuName, int stuId) {
name = stuName; // 给新对象贴名字
id = stuId; // 分配学号
cout << name << "同学已入学" << endl;
}
};
int main() {
Student stu1("张三", 20230001); // 创建即初始化
// 输出:张三同学已入学
}
4.2 析构函数:自动清理收尾
对象销毁时自动执行(比如关闭文件/释放内存):
class FileHandler {
public:
// 构造函数打开文件
FileHandler(string filename) {
cout << "打开文件:" << filename << endl;
}
// 析构函数关闭文件(~开头)
~FileHandler() {
cout << "文件已关闭" << endl;
}
};
int main() {
FileHandler myFile("data.txt");
// 程序结束自动输出:文件已关闭
}
🔥 新手技巧:构造函数初始化 > 析构函数收尾,形成完美闭环!
五、this指针:对象的“身份证”
当多个对象调用同一函数时,this
帮函数分清谁是谁:
class Cup {
public:
string color;
// this指向当前对象
void showOwner() {
cout << "这个" << color << "杯子是我的!" << endl;
cout << "我的内存地址:" << this << endl;
}
};
int main() {
Cup blueCup, redCup;
blueCup.color = "蓝色";
redCup.color = "红色";
blueCup.showOwner(); // 输出:这个蓝色杯子是我的!
redCup.showOwner(); // 输出:这个红色杯子是我的!
// 输出不同内存地址 → 证明this不同
}
this的日常用途:
- 区分重名变量
void setName(string name) {
this->name = name; // this->name指成员变量
} // name指参数
- 返回对象自身(链式调用)
Cup& setColor(string color) {
this->color = color;
return *this; // 返回自己(下篇详解)
}
// 可连续调用:myCup.setColor("蓝").setSize(10);
六、实战:用类实现咖啡点单系统
#include <iostream>
using namespace std;
class Coffee {
private:
string name;
float price;
public:
// 构造函数初始化
Coffee(string n, float p) : name(n), price(p) {}
// 显示订单
void showOrder() {
cout << "您点了:" << name
<< ",价格:" << price << "元" << endl;
}
};
int main() {
Coffee latte("拿铁", 28.5); // 创建拿铁对象
Coffee mocha("摩卡", 32.0); // 创建摩卡对象
latte.showOrder(); // 输出:您点了拿铁,价格28.5元
mocha.showOrder(); // 输出:您点了摩卡,价格32元
}
运行效果:
您点了:拿铁,价格:28.5元
您点了:摩卡,价格:32元
未完持续...(关注我,宝子,C++学习带你飞起来!!!)
现在只需记住:类是图纸,对象是实物
动手写个Student
类试试看(带姓名/学号/显示功能),遇到卡壳随时回看~ 我们中篇见! 👋