目录
1.面向对象入门
C++支持面向对象编程,这也是和C语言的最大区别。在编程中,实体被描述为对象。程序为了解决现实问题,其手段就是对显示实体的模拟。
现实的实体可以分为:属性和行为2类逻辑。
以闹钟为例,属性:长、宽、高···;行为:报时、响铃···。在C++中,可以使用结构体描述其属性,函数描述其行为:
cpp
// 属性长宽高可以使用结构体描述
struct AlarmClock {
double length_cm;
double width_cm;
double height_cm;
};
// 响铃行为,可以用函数描述
void clock_ring(int frequency, int duration) {
Beep(frequency, duration);
}
int main()
{
struct AlarmClock ac = {10, 20, 30};
clock_ring(1000, 3000);
return 0;
}
当前代码虽然完成了想要的功能,但是属性和行为是分离的。例如,结构体对象可以通过.访问属性,但是无法使用函数(行为)。我们希望有一个整体,能够包含属性和行为,这是最为合适的。这需要一个新的数据结构实现上述需求,也就是类(class)。
这是一个示例:
cpp
#include <iostream>
#include <windows.h>
using namespace std;
/*
* 封装的AlarmClock结构
* 基于AlarmClock得到ac变量
* ac可以访问属性(长宽高)
* ac可以访问clock_ring函数
* ac可以访问say_hi函数
* say_hi函数也可以访问属性
*/
class AlarmClock {
public:
double length_cm;
double width_cm;
double height_cm;
void clock_ring(int frequency, int duration) {
Beep(frequency, duration);
}
void say_hi(const string msg="chloe") {
cout << "我的长度:" << length_cm << " 宽度:" << width_cm << " 高度:" << height_cm << endl;
}
};
int main() {
AlarmClock ac = {10, 20, 30};
cout << "闹钟长度:" << ac.length_cm << endl;
cout << "闹钟宽度:" << ac.width_cm << endl;
cout << "闹钟高度:" << ac.height_cm << endl;
ac.clock_ring(1000, 2000);
ac.say_hi();
return 0;
}
基于class,可以得到具体的对象(class结构的变量),同时可以得到多个对象:
cpp
AlarmClock ac2 = {50, 60, 70};
ac2.clock_ring(3000, 1000);
AlarmClock ac3 = {80, 90, 100};
ac3.clock_ring(4000, 1000);
2.class的使用语法
class类中可以包含多个成员(变量和函数),其基本语法如下:
cpp
// 类的声明(可以省略)
class class_name;
class name{
public:
成员变量···;
成员方法···;
private:
成员变量···;
成员方法···;
protected:
成员变量···;
成员方法···;
};
其中,
- public/private/protected 为访问修饰符(后续分析),当前全部使用public
- 成员变量即变量声明,设计在类中用于记录数据,可声明任意个
- 成员方法即函数声明,设计在类中为类对象提供具体的功能,可声明任意个。
注意:函数写在类中,一般称之为方法。
实例:设计一个学生类
cpp
/*
* 学生类包含五个成员,分别是4个成员属性、1个成员函数
* 成员函数的const表示无法修改成员属性的值
* 当成员函数不准修改成员属性的值,可以加上const关键字用以限制
*/
// 声明学生类(可省略
class Student;
class student {
public:
int id; // 学号
string name; // 姓名
int age; // 年龄
string addr; // 地址
void say_hi() const {
cout << "我是:" << name << ", 学号: " << id << endl;
cout << "我今年" << age << "岁了" << endl;
cout << "我住在:" << addr << endl;
}
};
类的使用:
cpp
#include <iostream>
using namespace std;
// 声明学生类(可省略
class Student;
class Student {
public:
int id; // 学号
string name; // 姓名
int age; // 年龄
string addr; // 地址
void say_hi() const {
cout << "我是:" << name << ", 学号: " << id << endl;
cout << "我今年" << age << "岁了" << endl;
cout << "我住在:" << addr << endl;
}
};
// 使用类,就是得到类的对象(类类型的变量)来干活
int main() {
// 方式1:先声明一个类对象,然后对类对象成员进行赋值(标准,但写法复杂)
class Student stu; // 在Student类前面加上class关键字,强调该类型是一个类对象
stu.id = 1001; // 通过.访问成员变量并赋值
stu.name = "张三";
stu.age = 11;
stu.addr = "北京";
cout << "我是" << stu.name << ", 我今年" << stu.age << "岁了" << endl;
stu.say_hi(); // 通过.调用成员函数
cout << "---------------------------" << endl;
// 方式2:声明和赋值同步应用
class Student stu2 = {1000, "李四", 12, "上海"};
stu2.say_hi();
cout << "---------------------------" << endl;
// 方式2:变种写法(还可以再省略一下,更快捷)
class Student stu3{1002, "王五", 13, "广州"};
stu3.say_hi();
return 0;
}
【提示】const的应用:
成员变量对成员函数的访问分为2种:读取和修改。如果只读取不修改,一般情况下可以加上const修饰函数。下面这种情况加上const就会报错:
cpp
void say_hi() const {
cout << "我是:" << name << ", 学号: " << id << endl;
cout << "我今年" << age << "岁了" << endl;
cout << "我住在:" << addr << endl;
name = 'abc';
}
3.类的访问修饰符【教程未完待续】
类的访问修饰符主要有三类:
- public表示公开权限,即成员是公开的
- private表示私有权限,即成员是私有的
- protected表示保护权限,即成员是受保护的(后续学习)
本节主要讨论public和private。
公有(public)成员特性:
首先明确,访问控制符pubilc和private在类的设计阶段(内部)不起作用,类的方法可以访问其他成员。
如下代码示例,使用public修饰类成员变量时,方法可以访问任意变量。将public改为private就会报错。
cpp
#include <iostream>
using namespace std;
// public和private的区别
// 在类的设计阶段,可以被其他成员使用
class Wukong {
public:
int id;
string name;
int money;
void info() const {
cout << "我是:" << name << ", 编号: " << id ;
cout << ", 游戏币:" << money << endl;
}
};
int main() {
// 公有成员,类生产的具体对象可以使用这些成员
class Wukong wk{001, "gina", 10000};
wk.info();
return 0;
}
私有(private)作用:
添加private修饰一些变量/方法,能实现只有类内部成员可访问的效果。例如:
cpp
#include <iostream>
using namespace std;
// public和private的区别
// 在类的设计阶段,可以被其他成员使用
class Wukong {
public:
int id;
string name;
void info() const {
cout << "我是:" << name << ", 编号: " << id ;
cout << ", 游戏币:" << money << endl;
}
// 打怪
void fight() {
cout << "小怪打完了,增加游戏币。" << endl;
addMoney(); // 虽然addMoney()是私有的,但是在类的内部可以被public成员调用
}
// 做任务
void action() {
cout << "任务做完了,增加游戏币。" << endl;
addMoney();
}
// 展示游戏币余额
void showMoney() const {
cout << "游戏币余额:" << money << endl;
}
private:
int money = 0; // 游戏币数额不可被修改
void addMoney() {
money += 1000;
}
};
int main() {
// 公有成员,类生产的具体对象可以使用这些成员
class Wukong wk;
wk.id = 1001;
wk.name = "小z";
wk.fight();
wk.action();
wk.showMoney();
return 0;
}
在这段代码中,wk.money 这样的写法是错误的,因为 money 变量被 private 修饰,外部无法直接访问。为了保护数据安全,这类变量只能通过类内部提供的 public 方法间接访问或修改,即做任务和战斗。
课程更新到这里就暂时结束了,小曹老师讲的很全面、对新手很友好,期待更新的那天!
附上全套课程链接:黑马程序员C++零基础入门到精通全套视频教程,基于AI大模型的智能编码辅助编程,C++从基础到项目开发一套通关_哔哩哔哩_bilibili