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.mzph.cn/news/735808.shtml

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

相关文章

Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 前言 1 基础知识回顾 1.1 线程的创建和启动 1.2 线程池的使用 2.运行环境说…

Shell常用脚本:文件或目录一键同步到多台服务器

注意: 将本地文件,同步到【/opt/module/script/xsyncByFileIp.txt】里面的目标机器 xsyncByFile.sh #!/bin/bash# 入参参数个数 argsCount$#if(($argsCount0)); thenecho "同步失败:请输入待同步的文件或者目录" exit; fiecho &q…

BetterDisplay for mac V2.2.5 强大的mac显示器管理开源工具

BetterDisplay是Mac OS 一个很棒的工具! 它允许您将显示器转换为完全可扩展的屏幕 管理显示器配置覆盖 允许亮度和颜色控制 提供 XDR/HDR 亮度升级(Apple Silicon 和 Intel Mac 上兼容的 XDR 或 HDR 显示器的额外亮度超过 100% - 多种方法可用&#x…

CSS 居中对齐 (水平居中 )

水平居中 1.文本居中对齐 内联元素&#xff08;给容器添加样式&#xff09; 限制条件&#xff1a;仅用于内联元素 display:inline 和 display: inline-block; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><…

python单例模式应用之pymongo连接

文章目录 单例模式介绍模块简介安装简单的连接使用单例模式的连接单例类的实现配置的使用单例模式的测试 单例连接的调用 https://gitee.com/allen-huang/python 单例模式介绍 适用场景&#xff1a; 单例模式只允许创建一个对象&#xff0c;因此节省内存&#xff0c;加快对象访…

Linux之selinux详解

华子目录 概念作用selinux与传统的权限区别selinux工作原理名词解释主体&#xff08;subject&#xff09;目标&#xff08;object&#xff09;策略&#xff08;policy&#xff09;&#xff08;多个规则的集合&#xff09;安全上下文&#xff08;security context&#xff09; 文…

RabbitMQ - 04 - Fanout交换机 (广播)

目录 部署demo项目 什么是Fanout交换机 实现Fanout交换机 1.控制台 声明队列 声明交换机 将交换机与队列绑定 2.编写消费者方法 3.编写生产者测试方法 部署demo项目 通过消息队列demo项目进行练习 相关配置看此贴 http://t.csdnimg.cn/hPk2T 注意 生产者消费者的…

【个人开发】llama2部署实践(三)——python部署llama服务(基于GPU加速)

1.python环境准备 注&#xff1a;llama-cpp-python安装一定要带上前面的参数安装&#xff0c;如果仅用pip install装&#xff0c;启动服务时并没将模型加载到GPU里面。 # CMAKE_ARGS"-DLLAMA_METALon" FORCE_CMAKE1 pip install llama-cpp-python CMAKE_ARGS"…

【实验报告】C语言实现猜单词的小游戏

之前帮别人写的一个简单的报告&#xff0c;无偿分享给大家~代码在后面&#xff0c;有一些图片出于懒惰没有上传。比较简单&#xff0c;喜欢的话关注我~&#xff0c;请勿商用~ 1 系统功能模块结构图 该程序主要思路&#xff1a; 头文件设计&#xff0c;存储结构设计&#xff0…

Biomedical knowledge graph-enhanced prompt generation for large language models

1. 生物医学知识图谱增强大语言模型提示生成 论文地址&#xff1a;[2311.17330] Biomedical knowledge graph-enhanced prompt generation for large language models (arxiv.org) 源码地址&#xff1a;https://github.com/BaranziniLab/KG_RAG 2. 摘要 大语言模型&#xff0…

UE4开个头-简易小汽车

跟着谌嘉诚学的小Demo&#xff0c;记录一下 主要涉及到小白人上下车和镜头切换操作 1、动态演示效果 2、静态展示图片 3、蓝图-上下车

机器人大赛有什么用?

机器人大赛在多个方面都具有显著的价值。首先&#xff0c;机器人大赛可以为学生提供一个实践与创新的机会&#xff0c;有助于培养学生的动手实践能力和创新思维。在比赛过程中&#xff0c;学生需要运用所学的知识和技能&#xff0c;设计、制作和调试机器人&#xff0c;这不仅可…

基于冠豪猪优化算法(Crested Porcupine Optimizer,CPO)的无人机三维路径规划(MATLAB)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化飞行…

在 .NET 项目中复制资源文件夹到生成目录

本文主要介绍在使用 Visual Studio 进行调试和发布时&#xff0c;如何在 .NET 项目中复制资源文件夹到生成目录。 1. 背景 在开发 .NET 项目的过程中&#xff0c;我们有时会遇到需要在 debug 、 release 或是发布时将资源文件夹复制到生成目录的需求。这些资源可能包括图片、配…

Git分支管理(IDEA)

文章目录 Git分支管理&#xff08;IDEA&#xff09;1.Git分支管理&#xff08;IDEA&#xff09;1.基本介绍1.分支理解2.示意图 2.搭建分支和合并的环境1.创建Gitee仓库2.创建普通maven项目3.克隆Gitee项目到E:\GiteeRepository4.复制erp文件夹下的内容到IDEA项目下5.IDEA项目中…

基于微信小程序的校园跑腿小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Django 模版基本语法

Django学习笔记 模版语法 本质&#xff1a;在HTML中写一些占位符&#xff0c;由数据对这些占位符进行替换和处理。 views.py def page2(request):#定义一些变量将变量传送给templates中的html文件name1 sallyname2 yingyinghobbys [swimming,badminton,reading]person {…

03-安装配置jenkins

一、安装部署jenkins 1&#xff0c;上传软件包 为了方便学习&#xff0c;本次给大家准备了百度云盘的安装包 链接&#xff1a;https://pan.baidu.com/s/1_MKFVBdbdFaCsOTpU27f7g?pwdq3lx 提取码&#xff1a;q3lx [rootjenkins ~]# rz -E [rootjenkins ~]# yum -y localinst…

【C语言】linux内核ip_generic_getfrag函数

一、讲解 这个函数ip_generic_getfrag是传输层用于处理分段和校验和的一个辅助函数&#xff0c;它通常用在IP层当需要从用户空间拷贝数据构建成网络数据包时。这个函数的实现提供了拷贝数据和进行校验和计算&#xff08;如果需要的话&#xff09;的功能。函数的参数解释如下&a…

[Spark SQL]Spark SQL读取Kudu,写入Hive

SparkUnit Function&#xff1a;用于获取Spark Session package com.example.unitlimport org.apache.spark.sql.SparkSessionobject SparkUnit {def getLocal(appName: String): SparkSession {SparkSession.builder().appName(appName).master("local[*]").getO…