【探索C++】用实例教你理解面向对象编程(看不懂打我版)

news2025/1/17 6:14:41
  • (꒪ꇴ꒪ ),Hello我是祐言QAQ
  • 我的博客主页:C/C++语言,Linux基础,ARM开发板,软件配置等领域博主🌍
  • 快上🚘,一起学习,让我们成为一个强大的攻城狮!
  • 送给自己和读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

       看完这一篇保准你对OOP理解通透了!!!

接下来进入正题!

        面向对象编程(OOP)的概念就像是使用一套构造工具来构建真实世界的模型。在这个模型中,对象就像是真实世界中的事物,它具有一些属性(例如颜色、形状、大小)和一些可以执行的操作,我们称之为方法(例如移动、旋转、改变颜色)。这些对象是从一个模具(或者说是蓝图)——中创建的。

        看完上面这段话相信你对面向对象编程有了一个初步且不成熟的理解,那么接下来让我们通过一些简单的C++代码来具体理解这些概念,并尝试成为C++的主人。

一、类与对象


        假设我们要模拟一个动物园。我们可以创建一个Animal类,用来描述动物园中的每一个动物。

#include <iostream>

using namespace std;//当我们使用命名空间后,下面标粉的代码就可以省略

class Animal {
public:
    // 数据成员
    std::string name;
    std::string type;
    int age;

    // 成员函数
    void eat() {
        std::cout << name << " is eating.\n";
    }

    void sleep() {
        std::cout << name << " is sleeping.\n";
    }
};


        在这个例子中,Animal类定义了三个数据成员(name,type和age两个成员函数(eat和sleep。我们可以根据这个类创建具体的动物对象tiger

Animal tiger;
tiger.name = "Tiger";
tiger.type = "Carnivore";
tiger.age = 5;

tiger.eat(); // outputs: Tiger is eating.


        在上述代码中,tiger是一个Animal对象它具有自己的名字、类型和年龄,并且可以进行吃和睡觉的操作

        看完这个形象又生动的例子,相信你一定可以理解类和对象了吧,其实这和python中的类和对象的理解几乎可以说一模一样,对于学过python的同学一定深有体会。

二、封装


        封装是一种将数据和操作数据的函数绑定到一个实体的机制,它可以隐藏对象的内部状态,并且只通过对象的方法来访问它。这可以防止对象的状态被外部代码随意修改,从而保证数据的安全性。

        让我们修改一下Animal类,将数据成员设置为私有,并通过公有的成员函数来访问它们:

class Animal {
private:
    std::string name;        // 私有成员变量,表示动物的名称
    std::string type;          // 私有成员变量,表示动物的类型
    int age;                      // 私有成员变量,表示动物的年龄

public:
    // 公有成员函数,用于设置动物的名称
    void setName(std::string newName) {
        name = newName;
    }

    // 公有成员函数,用于设置动物的类型
    void setType(std::string newType) {
        type = newType;
    }

    // 公有成员函数,用于设置动物的年龄
    void setAge(int newAge) {
        age = newAge;
    }

    // 公有成员函数,用于描述动物正在进食的行为
    void eat() {
        std::cout << name << " is eating.\n";
    }

    // 公有成员函数,用于描述动物正在睡眠的行为
    void sleep() {
        std::cout << name << " is sleeping.\n";
    }
};


        现在,我们不能直接访问Animal对象的name,type和age了,而是只能通过setName,setType和setAge的方法来修改它们。说起这些方法,你乍一看肯定觉得好难,但是作为一个已经精通了C的人为什么不能把他们理解为C中的函数定义呢,所以说,学习C++并不难,我认为的核心学习思路就是把C结和python来再看C++,只不过这里的函数不叫函数了,在C++中它们被称方法(成员函数)

三、继承


        继承是指从已有的类创建新类的机制新类(派生类)继承了基类的属性和方法,并可以添加新的属性和方法,或者覆盖基类的方法。

        让我们创建一个Bird类,它继承自Animal类,并添加了一个新的方法fly:


class Bird : public Animal {
public:
    void fly() {
        std::cout << "The bird is flying.\n";
    }
};


        在这个例子中,Bird类继承了Animal类的所有公有和保护成员,因此我们可以像使用Animal对象一样使用Bird对象

Bird parrot;
parrot.setName("Parrot");
parrot.setType("Herbivore");
parrot.setAge(2);

parrot.eat();  // outputs: Parrot is eating.
parrot.fly();  // outputs: The bird is flying.


四、多态


        多态是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。多态性允许我们将派生类的对象当作基类的对象来使用,从而实现代码的通用性。

        让我们为Animal类添加一个makeSound方法并在Bird类中覆盖它:
 

class Animal {
private:
    std::string name; 
    std::string type;  
    int age;         

public:
    // 公有成员函数,用于描述动物正在发出声音的行为
    virtual void makeSound() {
        std::cout << name << " is making a sound.\n";
    }
};

// 定义一个名为 Bird 的类,继承自 Animal 类
class Bird : public Animal {
public:
    // 重写从父类继承的公有成员函数 makeSound
    void makeSound() override {
        std::cout << "The bird is chirping.\n";
    }
};


        现在,我们可以创建一个Animal指针指向Bird对象,并调用makeSound方法

Animal* animal = new Bird();
animal->makeSound(); // 输出: The bird is chirping.

        在这个例子中,虽然animal的类型是Animal*,但是调用makeSound方法时,实际执行的是Bird类的版本这就是多态

        我知道巴巴一大堆不如一个完整例程来的快,那么浅浅展示一下啦:

         完成例程:

#include <iostream>
#include <string>

// 定义基类 Animal
class Animal {
private:
    std::string name;  // 私有成员变量,表示动物的名称
    std::string type;  // 私有成员变量,表示动物的类型
    int age;           // 私有成员变量,表示动物的年龄

public:
    // 成员函数:设置动物的名称
    void setName(std::string newName) {
        name = newName;
    }

    // 成员函数:设置动物的类型
    void setType(std::string newType) {
        type = newType;
    }

    // 成员函数:设置动物的年龄
    void setAge(int newAge) {
        age = newAge;
    }

    // 成员函数:描述动物正在发出声音的行为
    virtual void makeSound() {
        std::cout << name << " is making a sound.\n";
    }
};

// 定义派生类 Bird,继承自 Animal
class Bird : public Animal {
public:
    // 成员函数:描述鸟正在飞翔的行为
    void fly() {
        std::cout << "The bird is flying.\n";
    }

    // 重写基类的 makeSound 方法
    void makeSound() override {
        std::cout << "The bird is chirping.\n";
    }
};

int main() {
    // 创建 Animal 对象并设置属性
    Animal tiger;
    tiger.setName("Tiger");
    tiger.setType("Carnivore");
    tiger.setAge(5);

    // 调用基类的 makeSound 方法
    tiger.makeSound();  // 将会输出: Tiger is making a sound.

    // 创建 Bird 对象并设置属性
    Bird parrot;
    parrot.setName("Parrot");
    parrot.setType("Herbivore");
    parrot.setAge(2);

    // 调用派生类的方法和基类的重写方法
    parrot.makeSound(); // 将会输出: The bird is chirping.
    parrot.fly();       // 将会输出: The bird is flying.

    return 0;
}

五、总结


        面向对象编程(OOP)是一种强大的编程范式,它通过抽象,封装,继承和多态等机制,将复杂的问题分解为一组互相交互的对象,使代码更易于理解,维护和扩展。这就好比你在玩乐高,每个乐高积木(对象)都有自己的颜色和形状(属性),并且可以与其他积木拼接(方法)。通过组合各种积木,你可以构建出城堡,汽车,飞机等各种模型(程序)。

        那么接下来,就跟随我的脚步,在编程的海洋里构建属于自己的城堡吧!!!

        更多C语言Linux系统ARM板实战数据结构相关文章,关注专栏:

   手撕C语言

            玩转linux

                    脚踢数据结构

                            6818(ARM)开发板实战

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉感谢关注🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/896462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件系统工具-架构师真题(六)

_____不属于可修改性考虑的内容。&#xff08;2016&#xff09; 可维护性可扩展性结构重构可变性 答案:D 解析&#xff1a; 可修改性指快速较高的性能价格进行系统优化&#xff0c;包括可维护性、可扩展性、结构重组和可移植性四个方面。 软件系统工具中&#xff0c;软件评…

Docker 常规软件安装

1. 总体安装步骤 1. 搜索镜像 search 2. 拉取镜像 pull 3. 查看镜像 images 4. 启动镜像 - 端口映射 run 5. 停止容器 stop 6. 移除容器 rm 2. 安装tomcat 1. 搜索 docker search tomcat 2. 拉取 docker pull tomcat 3. 查看本地镜像 docker images tomcat 4. 创建容器实…

两个List合并、去重、排序

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

打通应用“壁垒”,数据分类分级结果与安全策略自动匹配

《网络安全法》、《数据安全法》等法律法规&#xff0c;以及各行业各领域与数据安全相关的标准规范&#xff0c;几乎都涉及对数据进行分类分级保护的要求。数据安全始于分类分级&#xff0c;已成为毫无疑问的行业共识。 但现实中不少用户却止步在分类分级工作&#xff0c;“如…

linux虚拟机中各服务端口及配置文件路径

查询端口状况命令&#xff1a; netstat -an| grep 端口号 查询服务状态&#xff08;服务是否开启&#xff09;命令&#xff1a;systemctl status 服务名 开启服务命令&#xff1a;systemctl start 服务名 21端口&#xff1a;FTP 文件传输服务 22端口&#xff1a;SSH协议、…

无涯教程-Perl - wait函数

描述 该函数等待子进程终止,返回已故进程的进程ID。进程的退出状态包含在$?中。 语法 以下是此函数的简单语法- wait返回值 如果没有子进程,则此函数返回-1,否则将显示已故进程的进程ID Perl 中的 wait函数 - 无涯教程网无涯教程网提供描述该函数等待子进程终止,返回已故…

怎么把pdf压缩到5m以内?压缩办法非常多

怎么把pdf压缩到5m以内&#xff1f;PDF文件是我们办公过程中较为常用的文件格式&#xff0c;PDF文件所包含的内容通常较多&#xff0c;比如文本、图像以及音视频等等。这样的话&#xff0c;PDF文件占用内存也较大。如果需要对PDF文件进行使用、传输、分享等的话&#xff0c;可能…

中路对线发现正在攻防演练中投毒的红队大佬

背景 2023年8月14日晚&#xff0c;墨菲安全实验室发布《首起针对国内金融企业的开源组件投毒攻击事件》NPM投毒事件分析文章&#xff0c;紧接着我们在8月17日监控到一个新的npm投毒组件包 hreport-preview&#xff0c;该投毒组件用来下载木马文件的域名地址竟然是 img.murphys…

【TypeScript】任意类型

前置准备 在 powershell 安装 ts-node 包&#xff0c;可以先借助 xmzs 包切换淘宝镜像&#xff0c;加快安装速度。 在 vscode 终端执行 npm init -y 生成 package.json 文件 然后在 vscode 终端执行 npm i types/node -D 最后就可以在 vscode 终端执行ts-node&#xff0c;直接…

Typora 相对路径保存图片以及 Gitee 无法显示图片

目录 Typora 相对路径保存图片 Gitee 无法显示图片 Typora 相对路径保存图片 Step1&#xff1a;修改 Typora 的偏好设置 自动在当前目录创建名为 "./${filename}.assets" 的文件夹粘贴图片到 md 中时&#xff0c;图片会自动另存到 "./${filename}.assets&qu…

macOS Ventura 13.5.1(22G90)发布(附黑/白苹果系统镜像地址)

系统镜像下载&#xff1a;百度&#xff1a;黑果魏叔 系统介绍 黑果魏叔 8 月 18 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.5.1 更新&#xff08;内部版本号&#xff1a;22G90&#xff09;&#xff0c;本次更新距离上次发布隔了 24 天。 本次更新重点修复了…

ip2region(1):java通过Ip2region实现IP定位

1 Ip2region简介 Ip2region是一个开源工具库,是一种用于IP地址定位的工具。 它是基于B树数据结构的数据库&#xff0c;可用于将IP地址转换为国家、省、市、区县等信息。 使用Ip2region工具&#xff0c;您可以轻松地查找某个IP地址所在的区域信息&#xff0c;从而帮助您进行定位…

页面加载慢问题排查结论

遇到一个很奇怪的现象&#xff0c;已知A和B两个页面&#xff0c;都有调用同一个弹框&#xff0c;但是A页面很快&#xff0c;一切正常&#xff0c;B页面需要加载很久&#xff0c;就很奇怪。 后面又发现&#xff0c;B页面里面不同tab C和D&#xff0c;调用上面的弹框&#xff0c…

专业高度契合|中国文学对接伦敦大学亚非学院访学申请成功

G老师的研究方向以中国文学为主&#xff0c;重点是现当代文学&#xff0c;优先申请英国高校访学&#xff0c;而英国高校从事该领域研究的学者屈指可数&#xff0c;经过努力&#xff0c;我们先后得到伦敦国王学院、斯特林大学及伦敦大学亚非学院的接受意向&#xff0c;用伦敦国王…

【目标检测中对IoU的改进】GIoU,DIoU,CIoU的详细介绍

文章目录 1、IoU2、GIoU(Generalized Intersection over Union)3、DIoU4、CIoU 1、IoU IoU为交并比&#xff0c;即对于pred和Ground Truth&#xff1a;交集/并集 1、IoU可以作为评价指标使用&#xff0c;也可以用于构建IoU loss 1 - IoU 缺点&#xff1a; 2、对于pred和GT相…

学渣的愤怒!自考本科能不能不考英语和数学?

英语和高数哪个更难&#xff1f; 这是自考生们最头大的两个科目。 自考高数有多难&#xff1f; 高数主要有微积分、线性代数和概率论三个部分。 其中微积分是基础、也是重要的一部分&#xff0c;不仅涉及到很多抽象概念和符号运算&#xff0c;还需要具备良好的计算能力和逻…

Nginx的介绍

本资料转载于传智教育-解锁你的IT职业薪未来&#xff0c;仅用于学习和讨论&#xff0c;如有侵权请联系 视频地址&#xff1a;04-Nginx的优点_哔哩哔哩_bilibili 资源文档&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1RlFl92FdxRUqc858JSxPSQ 提取码&#xff1a;12…

Air780EG —— 合宙4G定位解决方案

定位模式&#xff1a; 外部单片机控制模式(常见于AT固件客户)&#xff1a; 开机 -> 搜星 -> 定位成功 -> 上报 -> 关机 780E自行控制模式(常见于二次开发客户&#xff0c;AT用户也可以使用): 开机 -> 搜星 -> 定位成功 -> 模块休眠&#xff0c;关闭GP…

【LVS】3、LVS+Keepalived群集

为什么用它&#xff0c;为了做高可用 服务功能 1.故障自动切换 2.健康检查 3.节点服务器高可用-HA Keepalived的三个模块&#xff1a; core&#xff1a;Keepalived的核心&#xff0c;负责主进程的启动、维护&#xff1b;调用全局配置文件进行加载和解析 vrrp&#xff1a;实…

【时间序列】WWW 2023时间序列相关论文汇总

WWW 会议为交叉&#xff0c;新兴&#xff0c;综合领域的顶级会议&#xff0c;属于CCF A类&#xff0c;几乎计算机的任何一个领域都可以投WWW&#xff0c;是计算机交叉学科领域最具影响力的会议之一。WWW 每年的录用率非常低&#xff0c;今年共录用了365篇论文&#xff0c;录用率…