C++程序设计-第六/七/八章 运算符重载/包含与继承/虚函数和多态性【期末复习|考研复习】

前言

总结整理不易,希望大家点赞收藏。

给大家整理了一下C++程序设计中的重点概念,以供大家期末复习和考研复习的时候使用。


C++程序设计系列文章传送门:
第一章 面向对象基础
第四/五章 函数和类和对象
第六/七/八章 运算符重载/包含与继承/虚函数和多态性
第九/十一/十二章 模板/输入/输出流/标准模板库
C++程序设计-练手题集合


文章目录

  • 前言
  • 第六章 运算符重载
    • 6.1 何时需要定义赋值运算符
    • 6.2 举例说出你所了解的必须以类成员方式定义的运算符
    • 6.3 C++编译器为类自动产生的四个默认成员函数分别是什么
  • 第七章 包含与继承
    • 7.1 包含和继承是面向对象语言提供的两种重要的代码复用机制阐述它们有什么区别如何选择应用
    • 7.2 继承等级是什么?
    • 7.3 继承中的类的赋值兼容原则
  • 第八章 虚函数和多态性
    • 8.1 什么是虚函数?什么是纯虚函数?为什么引入虚函数和纯虚函数?
    • 8.2 析构函数应该是虚函数吗?为什么?
    • 8.3 为什么默认的析构函数不是虚函数?
  • 练手题
    • 9.1
    • 9.2
  • 下一章传送门


第六章 运算符重载

6.1 何时需要定义赋值运算符

如果一个类需要进行赋值操作,就需要定义赋值运算符。

class MyClass {
public:MyClass& operator=(const MyClass& other) { // 实现赋值操作的代码return *this;}
};

对于含有指针成员的类来说,使用默认的赋值运算符可能会导致指针的浅拷贝问题。在这种情况下,需要自定义赋值运算符,以确保指针的深拷贝,避免出现潜在的内存泄漏和错误。

6.2 举例说出你所了解的必须以类成员方式定义的运算符

赋值运算符(=)、下标运算符([])、函数调用运算符(())、成员访问运算符(->)。这些运算符必须被定义为成员函数的原因是它们需要访问类的私有成员,只有成员函数才能访问类的私有成员。另外,它们的左操作数都是类的对象,因此只有成员函数才能访问对象的成员。

6.3 C++编译器为类自动产生的四个默认成员函数分别是什么

默认成员函数包括默认构造函数、析构函数、拷贝构造函数和拷贝赋值运算符。

Mystring(const char* str=nullptr);			   
~Mystring();							   
Mystring(const Mystring& other);			   	// 要进行深拷贝
Mystring& operator=(const Mystring& other);  	//重载操作符

第七章 包含与继承

7.1 包含和继承是面向对象语言提供的两种重要的代码复用机制阐述它们有什么区别如何选择应用

包含是指在一个类中嵌入另一个类的对象,通过调用该对象的方法来实现功能复用。这种方式可以实现代码的模块化和灵活性,但需要手动管理对象的生命周期和内存分配。
继承是指一个类可以从另一个类继承属性和方法,从而实现代码的复用和扩展。这种方式可以减少代码的重复,提高代码的可维护性和可扩展性,但也可能导致代码的耦合度过高,难以维护和扩展。
在选择应用时,需要根据具体的需求和设计原则进行权衡。一般来说,如果需要实现简单的功能复用,可以选择包含;如果需要实现复杂的继承关系和代码复用,可以选择继承。

7.2 继承等级是什么?

公有继承(public inheritance):派生类可以访问基类的公有成员和保护成员,但不能访问基类的私有成员。
保护继承(protected inheritance):派生类可以访问基类的公有成员和保护成员,但不能访问基类的私有成员。
私有继承(private inheritance):派生类可以访问基类的公有成员和保护成员,但不能访问基类的私有成员。
虚拟继承(virtual inheritance):用于解决多重继承带来的问题,将同一基类的多个派生类共享同一个基类子对象,避免多次复制基类数据成员。防止菱形继承。class A; class B::virtual public A{}; class C::virtual public A{};
只要是父类中private成员无论以什么方式继承,儿子都无法访问;如果是公有继承儿子中的访问权限不变;如果是保护继承,儿子中父亲除了private成员其余均为protected成员;如果是私有继承,均为private成员。
子类不会继承父类的构造函数、析构函数和赋值操作符

7.3 继承中的类的赋值兼容原则

1、子类对象可以当作父类的对象使用(子类是特殊的父类)
2、子类对象可以直接赋值父类对象
3、子类对象可以直接初始化父类对象
4、父类指针可以直接指向子类对象
5、父类引用可以直接引用子类对象

第八章 虚函数和多态性

8.1 什么是虚函数?什么是纯虚函数?为什么引入虚函数和纯虚函数?

被 virtual 关键字修饰的成员函数称为虚函数。在虚函数后面添加 =0 ,虚函数就成为纯虚函数。纯虚函数只是一个接口,它的具体实现需要由子类来完成,子类必须实现纯虚函数,否则子类也会变成抽象类。
引入纯虚函数可以将基类的某些函数强制为虚函数,并且必须被子类实现。引入虚函数和纯虚函数的目的在于实现多态性。通过定义虚函数和纯虚函数,可以使得子类可以覆盖基类中的函数,从而实现子类对于函数的重写和扩展。而通过运行时动态绑定的方式,可以根据对象的实际类型来确定调用相应的函数,从而实现多态性。

8.2 析构函数应该是虚函数吗?为什么?

当一个类被继承时,如果其析构函数不是虚函数,那么在使用基类指针或引用指向派生类对象并删除这个对象时,可能会导致只有基类部分被析构,派生类部分的资源没有被正确地释放,从而导致内存泄漏或者其它的错误。这是因为在这种情况下,编译器只会调用基类的析构函数,而不会调用派生类的析构函数,因为指针或引用的静态类型是基类类型,因此需要使用虚析构函数来确保正确地释放资源。
总之,如果一个类可能会被继承,那么就应该将其析构函数声明为虚函数,以确保正确释放派生类的资源。

8.3 为什么默认的析构函数不是虚函数?

当类中有虚成员函数时,类会自动进行一些额外工作。这些额外的工作包括生成虚函数表和虚表指针,虚表指针指向虚函数表。每个类都有自己的虚函数表,虚函数表的作用就是保存本类中虚函数的地址,我们可以把虚函数表形象地看成一个数组,这个数组的每个元素存放的就是各个虚函数的地址。当我们创建一个类时,系统默认我们不会将该类作为基类,所以就将默认的析构函数定义成非虚函数,这样就不会占用额外的内存空间。同时,系统也相信程序开发者在定义一个基类时,会显示地将基类的析构函数定义成虚函数,此时该类才会维护虚函数表和虚表指针。

练手题

9.1

在这里插入图片描述
在这里插入图片描述

9.2

在这里插入图片描述

下一章传送门

第九/十一/十二章 模板/输入/输出流/标准模板库

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

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

相关文章

搭建个人智能家居 3 -第一个设备“点灯”

搭建个人智能家居 3 -第一个外设“点灯” 前言ESPHome点灯 HomeAssistant 前言 前面我们已经完成了搭建这个智能家居所需要的环境HomeAssistant和ESPHome,今天我们开始在这个智能家居中添加我们的第一个设备(一颗LED灯),如果环境…

使用Java自带的VisualVM监控远程服务器部署在Docker容器中的Java项目并使用Mat在线工具排查服务器内存泄露或内存溢出的原因

事情是这样的,我们项目最近应业主的要求迁移到了新的服务器,起初一切正常,部署、上线、测试都没有问题,项目大概运行了一周的工作日时间都没出现问题,直到周六那天,项目经理打电话过来说服务器崩了&#xf…

【深度学习】YOLOv9继续训练——断点训练方法

YOLOv9继续训练主要分为两个情况: 其一、训练过程中意外中断,未完成训练预期的epoch数量; 其二、训练完了,但是未收敛,在这个基础上,还想用这个权重、学习率等参数继续训练多一些轮次 一、训练过程中意外…

基于YOLOv8深度学习的野外火焰烟雾检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

【相关问题解答1】bert中文文本摘要代码:import时无法找到包时,几个潜在的原因和解决方法

【相关问题解答1】bert中文文本摘要代码 写在最前面问题1问题描述一些建议import时无法找到包时,几个潜在的原因和解决方法1. 模块或包的命名冲突解决方法: 2. 错误的导入路径解决方法: 3. 第三方库的使用错误解决方法: 4. 包未正…

Text-to-SQL 工具Vanna进阶|数据库对话机器人的多轮对话

跟数据库对话机器人对话,我可不止一个问题。 可能基于第一句问话,还有第二句、第三句问话。。。第N句对话。所以本文测试了多轮对话功能。 单轮对话的环境搭建参考博客 Text-to-SQL 工具Vanna + MySQL本地部署 | 数据库对话机器人 我的数据是这样 1. 基础配置 import vann…

Parade Series - WebRTC ( < 300 ms Low Latency ) T.B.D

Parade Series - FFMPEG (Stable X64) 延时测试秒表计时器 ini/config.ini [system] homeserver storestore\nvr.db versionV20240312001 verbosefalse [monitor] listrtsp00,rtsp01,rtsp02 timeout30000 [rtsp00] typelocal deviceSurface Camera Front schemartsp ip127…

Heparin-PCL/PLGA/PLA Heparin肝素偶联聚己内酯/聚乳酸/聚乳酸羟基乙酸共聚物

肝素的结构与性质:肝素是一种硫酸化多糖,具有高度负电荷。它由重复的二糖单元组成,这些单元含有硫酸基团,这些硫酸基团负责其负电荷。 纳米材料的电荷特性:纳米材料可以通过化学修饰来带正电荷或负电荷。例如&#xf…

编曲学习:钢琴编写 人性化、逻辑预制 工程音频导出

第8课 钢琴编写 人性化、逻辑预制 工程音频导出小鹅通-专注内容付费的技术服务商https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_65e30339e4b064a8cfe56001?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv 音乐创作中,有思路时可以不套学习到的公式,没有思路时可以套…

多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测

多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测 目录 多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现VMD-CN…

科研工具分享-SCI写作课

教程地址【传送门】 所为搭建自己本地的chatGpt,其一就是方便,其二就是没有Ip休眠,这里解释一下,所为ip休眠,就是你长时间不用,就跟电脑自动休眠一样,你需要重新刷新一次网页 他才跟你继续聊天…

群晖 Synology Photos DSM7 自定义文件夹管理照片

背景 众所周知,目前群晖DSM7中使用Synology Photos做照片管理时,个人照片只能默认索引 /home/Photos 文件夹,但是如果个人照片很多或者用户很多时,共享文件夹/homes 所在的存储空间就会不够用 当然,如果你的存…

登录阿里云镜像仓库报认证失败

阿里云web界面登录输入用户名和密码都是正确的,但是用docker login登录一直报认证失败。 解决问题方案: https://www.alibabacloud.com/help/zh/acr/support/faq-about-errors-of-docker-login-docker-push-and-docker-pull

程序猿成长之路之socket篇-socket通信原理简介

hello,各位小伙伴们大家好,上次以RSA加解密算法介绍作为密码学篇的结尾后,时光飞逝,转眼到了新一年的春季,这次将介绍一下socket通信和编程原理。 什么是socket(套接字)? socket(套…

DataGrip 2023:让数据库开发变得更简单、更高效 mac/win

JetBrains DataGrip 2023是一款功能强大的数据库IDE,专为数据库开发和管理而设计。通过DataGrip,您可以连接到各种关系型数据库管理系统(RDBMS),并使用其提供的一组工具来查询、管理、编辑和开发数据库。 DataGrip 2023软件获取 DataGrip 2…

【网络安全】手机不幸被远程监控,该如何破解,如何预防?

手机如果不幸被远程监控了,用三招就可以轻松破解,再用三招可以防范于未然。 三招可破解可解除手机被远程监控 1、恢复出厂设置 这一招是手机解决软件故障和系统故障的终极大招。只要点了恢复出厂设置,你手机里后装的各种APP全部将灰飞烟灭…

Leetcode 240. 搜索二维矩阵 II

题目描述: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6…

NAS网络存储的简单了解

一、概述 NAS网络存储,即网络附加存储(Network Attached Storage),是一种具有很大存储容量的电脑外敷设备,它通过网络直接连接到交换机上。NAS的主要功能是为网络区域存储(或磁盘)的用户提供数据…

设计模式 -- 2:策略模式

目录 总结部分:策略模式的优点部分代码部分 总结部分: 策略模式和简单工厂模式很像 区别在于 简单工厂模式 需求的是由工程创造的类 去给客户直接答案 而策略模式在于 我有主体 一个主体 根据策略的不同来进行不同的计算 我的主体就负责收钱 然后调度相…

让若依生成的service、mapper继承mybatisPlus的基类

前言:若依继承mybatisPlus后,生成代码都要手动去service、serviceImpl、mapper文件去继承mybatisplus的基类,繁琐死了。这里通过修改若依生成模版从而达到生成文件后直接使用mybatisPlus的方法。 一、首先找到若依生成模版文件位置&#xff…