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

news2024/10/3 10:47:32

前言

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

给大家整理了一下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.coloradmin.cn/o/1504950.html

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

相关文章

Qt之输入框带自动补全提示功能

这个功能主要是提升人机交互的体验,在输入信息时,自动读取历史信息,协助用户自动补全信息,帮助用户快速输入。 一、使用的控件 使用QComboBox代替传统文本输入框,同时将其属性改为可编辑。 二、使用方式 可以不输入信息,下拉选择项:代码中使用QStringList作为提示信息…

汽车协议学习

ⅠOBD 1.OBD接口 OBD有16个引脚,每个引脚的电压不同(可以对应不同的协议) 车端: 16- 9 (短一点点的) 8-1 (长一点的) 2.基于OBDⅡ的通信协议 CAN (ISO-15765&am…

如何基于 esp-at 固件测试 TCP (UART 转 WiFi 透传)吞吐?

测试工具: windows/Ubuntu/Android(电脑或手机与 ESP 开发板连接相同路由器)iperf2 工具ESP 系列的开发板USB-TTL 串口调试工具路由器 测试固件: AT 固件 AT 固件硬件接线说明 不同环境下的 Iperf 工具安装说明 Iperf 工具用于…

用C语言执行SQLite3的gcc编译细节

错误信息: /tmp/cc3joSwp.o: In function main: execSqlite.c:(.text0x100): undefined reference to sqlite3_open execSqlite.c:(.text0x16c): undefined reference to sqlite3_exec execSqlite.c:(.text0x174): undefined reference to sqlite3_close execSqlit…

部署LVS负载均衡集群架构

目录 一、ipvsadm 工具 二、NAT模式下部署LVS负载均衡 1、部署NFS共享存储服务器 1.1 安装NFS软件 1.2 新建共享目录和站点文件 1.3 设置共享策略 2、部署节点服务器1 2.1 安装并启动nginx软件 2.2 挂载共享目录到网页站点目录 2.3 修改网关 3、部署节点服务器2 3.…

植物病害识别:YOLO甘蔗叶片病害识别分类数据集

YOLO甘蔗叶片病害识别数据集, 包含尾孢菌叶斑病,眼斑病,健康,红腐病,锈病,黄叶病6个常见病类别,3300多张图像,yolo标注完整,全部原始图像,未应用增强。 适用于CV项目&…

GEE错误——Landsat9数据集进行去云操作后显示白板

问题 我遇到了一些有关 Landsat9 图像中的云遮蔽和图像处理的问题。我正在分享我所使用的代码以及我感兴趣的区域(资产)。请帮我解决这个问题。我是一名 GEE 学习者。问题:最终图像在大面积上有云状覆盖。 这里我们查看了搜索出的代码发现并不是没有数据集导致的,该区域有…

【Java探索之旅】数据类型与变量,字面常量,整型变量

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java入门到精通 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、字面常量二、数据类型三、变量3.1 变量概念3.2 语法格式 四、整型变量4.1 整型变…

【C++ vector 类】

1. 标准库中的vector类 vector 类 的介绍: 注意: 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样,vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是…

seo蜘蛛池的概念!蚂蚁SEO

蜘蛛池是一种特殊的网络营销技术,它的主要作用是吸引搜索引擎爬虫,提高网站的收录和排名,从而增加网站的流量和曝光度。 蚂蚁SEO是一个SEO工具,可以帮助您提高网站权重,吸引更多的搜索引擎爬虫,提高网站的…

物联网云原生云边协同

文章目录 一、物联网平台设计1.物联网平台设计2.物联网平台实现 二、部署环境1.节点配置2.版本信息 三、物联网平台部署1.部署 Kubernetes 集群2.部署 KubeEdge3.部署 ThingsBoard 集群4.部署 ThingsBoard Edge4.1.创建 Edge 实例4.2.部署 PostgreSQL4.3.创建数据库4.4.部署 Th…

Linux之生产消费者模型

(。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 我们在条件满足的时候,唤醒指定的线程&a…

unity学习(53)——选择角色界面--分配服务器返回的信息

好久没写客户端了,一上手还不太适应 1.经过测试,成功登陆后,客户端请求list_request,成功返回,如下图: 可见此时model第三个位置的参数是1.也成功返回了所有已注册角色的信息。 2.之前已知创建的角色信息…

计算机服务器中了locked勒索病毒怎么解密,locked勒索病毒解密流程

科技的发展带动了企业生产,越来越多的企业开始利用计算机服务器办公,为企业的生产运营提供了极大便利,但随之而来的网络安全威胁也引起了众多企业的关注。近日,云天数据恢复中心接到许多企业的求助,企业的计算机服务器…

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)

项目建议与立项申请、初步可行性研究、详细可行性研究、评估与决策是项目投资前使其的四个阶段。在实际工作中,初步可行性研究和详细可行性研究可以依据项目的规模和繁简程度合二为一,但详细可行性研究是不可缺少的。升级改造项目制作初步和详细研究&…

【01背包与完全背包】Aswing

01 https://www.acwing.com/problem/content/description/2/ #include<bits/stdc.h>using namespace std;const int MAXN 1005; int v[MAXN]; // 体积 int w[MAXN]; // 价值 int f[MAXN][MAXN]; // f[i][j], j体积下前i个物品的最大价值 int main() {int n,…

大模型产业落地,安全运营能否迎来“自动驾驶”时刻?

科技云报道原创。 通过一段文字描述&#xff0c;就能生成60秒堪比大片的视频&#xff0c;来自大模型Sora的出色表现&#xff0c;让全球都为之震撼。 无论是ChatGPT还是Sora&#xff0c;都只是大模型走出实验室的第一步&#xff0c;大模型如何在产业中落地&#xff0c;为具体的…

PyTorch搭建LeNet训练集详细实现

一、下载训练集 导包 import torch import torchvision import torch.nn as nn from model import LeNet import torch.optim as optim import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as npToTensor()函数&#xff1a; 把图像…

多维时序 | Matlab实现BiGRU-Mutilhead-Attention双向门控循环单元融合多头注意力机制多变量时序预测

多维时序 | Matlab实现BiGRU-Mutilhead-Attention双向门控循环单元融合多头注意力机制多变量时序预测 目录 多维时序 | Matlab实现BiGRU-Mutilhead-Attention双向门控循环单元融合多头注意力机制多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.多维时序 …

C++笔记之给枚举类型的变量赋值

C++笔记之给枚举类型的变量赋值 —— 杭州 2024-03-10 code review! 在C++中,你可以在结构体内部定义一个枚举类型,并在创建结构体变量时给枚举类型的变量赋值。下面是一个简单的例子展示了如何做到这一点: 代码 #include <iostream>// 定义结构体 struct MyStru…