黑马程序员2024新版C++笔记 第五章 面向对象

目录

1.面向对象入门

2.class的使用语法

3.类的访问修饰符【教程未完待续】

公有(public)成员特性:

私有(private)作用:


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

相关推荐
黄雪超9 分钟前
JVM——SubstrateVM:AOT编译框架
java·开发语言·jvm
编码小笨猪10 分钟前
[ Qt ] | Qlabel使用
开发语言·c++·qt
chbmvdd11 分钟前
浅谈学习(费曼学习法)
笔记
吃个糖糖13 分钟前
Halcon联合QT ROI绘制
开发语言·qt
还有几根头发呀13 分钟前
double怎么在c/c++中输出保留输出最小精度为一位
c语言·开发语言·c++
天天代码码天天1 小时前
PP-OCRv5 C++封装DLL C#调用源码分享
开发语言·c++·c#·ocr
立秋67891 小时前
用 Python 模拟下雨效果
开发语言·python·pygame
不知道叫什么呀1 小时前
【C语言】指针全局变量
c语言·开发语言
wen__xvn1 小时前
每日刷题c++
数据结构·c++·算法
有很多梦想要实现1 小时前
Nest全栈到失业(四):半小时图书管理系统-Book
开发语言·前端·javascript·数据库·typescript·webstorm