白骑士的C++教学进阶篇 2.2 面向对象编程(OOP)

系列目录

上一篇:白骑士的C++教学进阶篇 2.1 指针与引用

        面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,通过将数据和操作数据的方法封装在对象中来实现代码的重用性、可扩展性和可维护性。C++作为一种面向对象的编程语言,提供了丰富的特性来支持OOP。本篇博客将详细介绍类与对象、构造函数与析构函数、继承与多态、抽象类与接口。

类与对象

        类是面向对象编程的核心概念,它定义了一组对象具有的属性和行为。对象是类的实例,通过类来创建对象。类将数据(属性)和方法(行为)封装在一起,提供了对现实世界事物的模拟。

类的定义

        在C++中,使用‘class‘关键字定义类。例如,定义一个表示人的类:

class Person {
public:// 属性std::string name;int age;// 方法void introduce() {std::cout << "Hello, my name is " << name << " and I am " << age << " years old." << std::endl;}
};

        在这个例子中,‘Person‘ 类包含两个属性 ‘name‘ 和 ‘age‘,以及一个方法 ‘introduce‘。

对象的创建与使用

        通过类来创建对象,并访问对象的属性和方法,例如:

int main() {// 创建对象Person person1;person1.name = "Alice";person1.age = 30;// 调用方法person1.introduce();return 0;
}

        在上面的代码中,我们创建了一个 ‘Person‘ 对象 ‘person1‘,并设置了它的属性,最后调用了 ‘introduce‘ 方法。

构造函数与析构函数

        构造函数和析构函数是类中的特殊成员函数,分别在对象创建和销毁时自动调用。它们用于初始化和清理对象。

构造函数

        构造函数用于初始化对象的属性。它的名称与类名相同,没有返回类型。例如,在 ‘Person‘ 类中添加一个构造函数:

class Person {
public:std::string name;int age;// 构造函数Person(std::string n, int a) {name = n;age = a;}void introduce() {std::cout << "Hello, my name is " << name << " and I am " << age << " years old." << std::endl;}
};

        使用构造函数创建对象,代码如下:

int main() {Person person1("Alice", 30);person1.introduce();return 0;
}

析构函数

        析构函数用于清理对象,它的名称与类名相同,但前面加一个波浪号 ‘~‘ ,没有参数和返回类型。例如,在 ‘Person‘ 类中添加一个析构函数:

class Person {
public:std::string name;int age;Person(std::string n, int a) : name(n), age(a) {}~Person() {std::cout << name << " is being destroyed." << std::endl;}void introduce() {std::cout << "Hello, my name is " << name << " and I am " << age << " years old." << std::endl;}
};

        当对象超出作用域时,析构函数会自动调用,代码如下:

int main() {Person person1("Alice", 30);person1.introduce();return 0;
}

继承与多态

        继承和多态是OOP的两个重要特性,继承用于创建类的层次结构,实现代码的重用;多态用于动态绑定,允许不同的对象以相同的方式被处理。

继承

        继承通过从已有类派生出新类来实现,派生类继承基类的属性和方法。使用‘:‘符号表示继承关系。例如,定义一个表示学生的类,继承自 ‘Person‘ 类:

class Student : public Person {
public:int studentID;Student(std::string n, int a, int id) : Person(n, a), studentID(id) {}void introduce() {std::cout << "Hello, my name is " << name << ", I am " << age << " years old, and my student ID is " << studentID << "." << std::endl;}
};

        在上面的代码中,‘Student‘ 类继承了 ‘Person‘ 类的属性和方法,并添加了新的属性 ‘studentID‘。

多态

        多态允许使用基类指针或引用来调用派生类的重载方法,实现运行时的动态绑定。使用 ‘virtual‘ 关键字声明虚函数。例如,在 ‘Person‘ 类中声明虚函数 ‘introduce‘:

class Person {
public:std::string name;int age;Person(std::string n, int a) : name(n), age(a) {}virtual void introduce() {std::cout << "Hello, my name is " << name << " and I am " << age << " years old." << std::endl;}
};

        在派生类‘Student‘中重载该虚函数,代码如下:

class Student : public Person {
public:int studentID;Student(std::string n, int a, int id) : Person(n, a), studentID(id) {}void introduce() override {std::cout << "Hello, my name is " << name << ", I am " << age << " years old, and my student ID is " << studentID << "." << std::endl;}
};

        使用基类指针或引用调用派生类方法,代码如下:

int main() {Person* person1 = new Student("Alice", 20, 1001);person1->introduce();delete person1;return 0;
}

抽象类与接口

        抽象类是不能实例化的类,用于定义接口。抽象类中至少有一个纯虚函数,使用 ‘= 0‘ 语法表示。例如,定义一个抽象类 ‘Shape‘:

class Shape {
public:virtual void draw() = 0; // 纯虚函数
};

        派生类必须实现所有纯虚函数。例如,定义一个表示圆形的类:

class Circle : public Shape {
public:void draw() override {std::cout << "Drawing a circle." << std::endl;}
};

        使用抽象类指针调用派生类方法,代码如下:

int main() {Shape* shape = new Circle();shape->draw();delete shape;return 0;
}

        抽象类和接口(纯虚类)在C++中提供了一种定义标准接口的方法,保证派生类实现特定的行为。

总结

        面向对象编程(OOP)是C++的重要特性,通过类与对象、构造函数与析构函数、继承与多态以及抽象类与接口,程序员可以编写更灵活、可扩展和易维护的代码。理解并熟练掌握这些概念和技巧,将大大提高编程能力和效率。希望通过本篇博客的介绍,能更好地理解和应用OOP,为编写复杂和高效的C++程序打下坚实的基础。

下一篇:白骑士的C++教学进阶篇 2.3 模版

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

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

相关文章

Java中HashMap详解:hash原理、扩容机制、线程不安全及源码分析

前言 HashMap 是 Java 中常用的数据结构之一&#xff0c;用于存储键值对。在 HashMap 中&#xff0c;每个键都映射到一个唯一的值&#xff0c;可以通过键来快速访问对应的值&#xff0c;算法时间复杂度可以达到 O(1)。 HashMap 的实现原理是基于哈希表的&#xff0c;它的底层是…

如何在element中table的 v-for中 使用slot-scope?

有时候我们需要通过数据库来动态控制表格的列,这样做的好处就是系统中如果有太多的表格项的话,直接这套代码就能通用了,其他的数据库里控制就行,不要太方便了,特别是一些ERP或者供应链的表格,动不动就是几十上百个字段,这时候不要太轻松了,废话不多说,直接上代码: &…

[Godot3.3.3] - 过渡动画

过渡动画 ScreenTransitionAnimation 项目结构 添加场景&#xff0c;根节点为 CanvasLayer2D 并重命名为 ScreenTransition: 添加子节点 ColorRect 和 AnimationPlayer&#xff0c;在 ColorRect 中将颜色(Color)设置为黑色&#xff1a; 找到 Material&#xff0c;新建 Shader…

AI网络爬虫022:批量下载某个网页中的全部链接

文章目录 一、介绍二、输入内容三、输出内容一、介绍 网页如下,有多个链接: 找到其中的a标签: <a hotrep="doc.overview.modules.path.0.0.1" href="https://cloud.tencent.com/document/product/1093/35681" title="产品优势">产品优…

【嵌入式DIY实例-ESP8266篇】-LCD1602显示DS1621传感器数据

LCD1602显示DS1621传感器数据 文章目录 LCD1602显示DS1621传感器数据1、DS1621介绍2、硬件准备与接线3、代码实现在本文中,介绍如何将 ESP8266 NodeMCU 板 (ESP-12E) 与 DS1621 数字温度传感器连接,其中温度值(摄氏度和华氏度)打印在 1602 LCD 屏幕上。 本项目中使用的 160…

《双流多依赖图神经网络实现精确的癌症生存分析》| 文献速递-基于深度学习的多模态数据分析与生存分析

Title 题目 Dual-stream multi-dependency graph neural network enables precise cancer survival analysis 《双流多依赖图神经网络实现精确的癌症生存分析》 01 文献速递介绍 癌症是全球主要的死亡原因&#xff0c;2020年约有1930万新发癌症病例和近1000万癌症相关死亡…

【Java】Idea运行JDK1.8,Build时中文内容GBK UTF-8编码报错一堆方块码

问题描述 在Windows系统本地运行一个JDK1.8的项目时&#xff0c;包管理用的Gradle&#xff0c;一就编码报错&#xff08;所有的中文内容&#xff0c;包括中文注释、中文的String字面量&#xff09;&#xff0c;但程序还是正常运行。具体如下&#xff1a; 解决 1. Idea更改编…

通讯录-C/C++

问题描述 设计一个通讯录管理程序&#xff0c;要求程序采用模块化设计方法&#xff0c;程序应采用由主控程序调用各模块实现各个功能的方式。程序应具有如下功能&#xff1a;输入记录、显示记录、查找记录、插入记录、记录排序、删除记录等。数据存储采用外存存储形式&#xff…

C++——类和对象(上)

文章目录 一、类的定义1.类定义格式2.访问限定符3.类域 二、实例化1.实例化概念2.对象⼤⼩ 三、 this指针 一、类的定义 1.类定义格式 与定义结构体类似 class ST {//成员变量int val;//成员函数void print(){cout << val << endl;}};class为定义类的关键字&…

SQL笔试题【数据岗】

视频号数据分析组外包招聘笔试题时间限时 45 分钟完成 题目 根据 3 张表表结构&#xff0c;写出具体求解的 SQL 代码 &#xff08;搞笑品类定义&#xff1a;视频分类或者视频创建者分类为“搞笑”&#xff09; l 题目 1&#xff1a;输出一张搞笑品类 dws 表&#xff0c;用于分…

从 QWebEnginePage 打印文档

QWebEnginePage 是 Qt WebEngine 模块中的一个类&#xff0c;它提供了用于处理网页内容的接口。如果你想要打印 QWebEnginePage 中的内容&#xff0c;你可以使用 QPrinter 和 QPrintDialog 类来实现。 项目配置了 Qt WebEngine 模块&#xff0c;并且在你的.pro文件中包含了相应…

el-date-picker 禁用 之前 和 之后 的时间

<el-date-pickerv-model"ruleForm.startTime"type"date"placeholder"请选择"format"YYYY-MM-DD"value-format"YYYY-MM-DD":disabled-date"pickerOptions"clearable/>const pickerOptions (time) > { if…

解析 pdfminer pdfparser.py

解析 pdfminer pdfparser.py 1. 导入必要的模块2. 定义PDFParser类2.1 初始化方法2.2 设置文档方法2.3 处理关键词方法举例说明: 3. 定义PDFStreamParser类3.1 初始化方法3.2 刷新方法3.3 处理关键词方法 总结 今天我们来看一段Python代码,这段代码实现了一个PDF文件的解析器。…

Python项目开发实战,掷硬币的连胜,案例教程编程实例课程详解

在Python中进行实战项目,比如模拟掷硬币并记录连胜次数,是一个既有趣又能加深理解随机数生成、循环控制、条件判断等编程基础的好方法。下面,我将逐步引导你完成一个详细的Python项目,该项目将模拟掷硬币的过程,并追踪记录连胜的次数,同时我们会深入探讨一些编程概念,如…

查看尝试登服务器ssh 访问ip地址

不指定时间查看尝试登录服务器的SSH访问IP地址 # CentOS/RHEL系统 zgrep "sshd" /var/log/secure-* | grep "Failed password" | awk {print $(NF-3)} | sort | uniq -c | sort -nr | head -n 10检查过去7天的日志尝试登录服务器的SSH访问IP地址 # CentOS…

AutoMQ vs Kafka: 来自小红书的独立深度评测与对比

测试背景 当前小红书消息引擎团队与 AutoMQ 团队正在深度合作&#xff0c;共同推动社区建设&#xff0c;探索云原生消息引擎的前沿技术。本文基于 OpenMessaging 框架&#xff0c;对 AutoMQ 进行了全面测评。欢迎大家参与社区并分享测评体验。 01 测试结论 本文主要测评云…

AI克隆声音,基于函数计算部署GPT-Sovits语音生成模型

阿里云的 https://developer.aliyun.com/adc/scenario/808348a321844a62b922187d89cd5077 还是 函数计算 FC (aliyun.com) 选择 语音克隆生成 GPT-SOVITS 通过访问域名就能访问 就可以上传个人的声音&#xff0c;然后进行输出 。

【逆向基础】十、逆向工具分享之DIE(Detect It Easy)

一、简介 DIE&#xff08;Detect It Easy&#xff09;是一款可以轻松检测PE文件的程序&#xff1b;其主要作用是查壳&#xff0c;并将pe文件的内容解析出来&#xff0c;包括PE文件中包含的导入函数、导出函数的名称及地址&#xff0c;入口函数地址等&#xff0c;是技术人员分析…

C# —— 数组的告诫查询方法

查询数组元素的方法 1.通过索引值找元素 a[0] 2.通过循环进行遍历 查询数组的每一个元素 int[] a1 new int[] { 1, 2, 3 }; Console.WriteLine(a1[0]);// 通过循环进行遍历 查询数组的每一个元素 for (int i 0; i < a1.Length; i) {// Console.WriteLine(a1[i]); } 3 in…

nuPlan 是一个针对自动驾驶车辆的闭环机器学习(ML-based)规划基准测试

nuPlan: A closed-loop ML-based planning benchmark for autonomous vehicles nuPlan 是一个针对自动驾驶车辆的闭环机器学习&#xff08;ML-based&#xff09;规划基准测试 Abstract In this work, we propose the world’s first closed-loop ML-based planning benchmar…