C++~~期末复习题目讲解---lijiajia版本

目录

1.类和对象

(3)创建对象的个数

(3)全局变量,局部变量

(4)构造函数的执行次数

(5)静态动态析构和构造顺序

(6)初始化顺序和声明顺序

(7)构造和复制构造

(8)拷贝构造的三种情况和例题讲解

2.继承和派生

(1)派生的构造和析构

(2)赋值的兼容性规则

3.虚函数


1.类和对象

(1)类和对象的三个特征:封装性,继承性,多态性

(2)系统为对象分配内存空间,不会给类分配内存空间,类和对象的关系就是这个数据类型和变量之间的关系;

(3)创建对象的个数

下面的这个题目就是对于引用的考察,问的是对象的个数,这个里面只有c1和c3是对象,其他的两个c2就是一个指针,并不是一个对象,c4就是c1的一个别名,也不是一个对象,c3虽然也是一个指针,但是c3指向了new出来的内存空间,所以c3也是一个对象;

(3)全局变量,局部变量

左边的这个题目就是先输出的就是5,第二个输出的number就是局部变量10,第三个输出的::number就是输出的全局变量,也就是3;

(4)构造函数的执行次数

这个题目考察的就是构造函数的执行次数,没执行一次这个构造函数,就会输出一个1,我们要看在这个主函数里面创建了多少个对象,每次创建一个对象,就会执行一次构造函数,就会输出一个1,这个时候创建一个对象a就会执行一次析构函数,对象b是一个数组,里面有两个数据,每个数据在创建的时候,都会执行一次构造函数,所以这个数组就会创建两个对象,执行两次这个构造函数,再会输出两个1,这个指针数组不会创建对象,所以也是不会执行构造函数的;所以这个执行语句创建这个a对象的时候,会执行一次构造函数,b[2]数组会创建两个对象,执行两次构造函数,这个数组指针不会执行构造函数;

(5)静态动态析构和构造顺序

上面的这个程序,有一个局部的静态对象,一个局部的动态对象,一个全局对象,这个程序的执行顺序是这样的:

我们首先就会构造这个全局的对象,然后进入这个主函数,第一次调用这个func函数的时候,先构造这个静态对象(static修饰的对象),再去构造这个局部的动态对象,这个函数执行完毕之后,会把这个动态的对象析构掉,静态的对象不会被析构,因为我们之前学习这个static的时候就已经知道,出了作用域之后,这个static修饰的变量的数值会被保留的,我们再次进入这个作用域的时候就会恢复到之前的数值,因此这个静态的局部对象不会被析构掉,第二次调用func函数的时候,就会先创建这个动态的局部变量,因为这个static修饰的静态的局部变量没有被析构掉,因此这个静态对象不会执行构造函数,func结束之后,会把这个动态的局部对象析构掉,当程序执行完毕之后,才会把这个静态的对象析构掉,然后再去析构这个全局对象;

(6)初始化顺序和声明顺序

对象成员的构造函数的调用顺序取决于这些对象成员在这个类里面声明的顺序,与这个初始化列表里面的初始化的顺序没有关系;

向上面的这个声明顺序是bac初始化列表里面的顺序是cba,这个初始化顺序就是声明的顺序,也就是bac,与这个初始化列表的顺序没有关系;

通过下面的这个题目,我们也是可以理解这一点的,这个是c类;里面定义了ab类的对象作为成员变量,这个时候按照声明的顺序,就会先执行这个b的构造函数,再执行a的构造函数,再调用c的构造函数,析构函数的执行顺序和这个顺序恰好是相反的;

(7)构造和复制构造

这个题目用到了拷贝构造的相关知识,就是使用这个d1赋拷贝给d2相当于是使用已经初始化的对象d1去初始化对象d2;

这个时候调用d1的构造函数,使用5去初始化这个成员变量,调用构造函数就会输出1,d1赋值构造p2的时候就会输出2,创建新的对象的时候,使用这个pd指针指向他,就会调用第一个构造函数,先会输出1,然后就会调用这个geta函数,输出的就是指针指向对象初始化数值8,析构指针的时候就会输出8,然后析构d12d2就会输出两个5;

(8)拷贝构造的三种情况和例题讲解

 拷贝构造函数的三种执行情况:就是下面的这个选择题的三个选项ACD,这个就是调用拷贝构造函数的三种情况;

1.用一个对象初始化同类的另外一个对象;

2.函数的形参是一个对象,而且我们调用这个函数的时候;

3.函数的返回值是类的对象,函数执行返回调用调用的时候;

首先用一个对象去初始化另外的一个对象,就是上面展示的代码,这个如何区分初始化和赋值,就是只要在定义这个类型的时候进行的赋值操作都叫做初始化,定义这个变量或者是对象之后进行操作就是赋值,上面的第一种情况里面展示的两种都是属于初始化的,而不是赋值;

 这个里面就是就是调用拷贝构造函数的第二种情况,就是这个自定义的函数里面的参数是一个类,这个时候a1就是实参a2的复制品;

这个里面,自定义函数的返回值是一个类的对象,这个时候拷贝构造函数同样会被调用;

下面通过两个例题实际认识一下这个拷贝构造函数的执行:

这个题目表面上问的是这个程序的输出结果,实际上就是拷贝构造函数的执行次数,这个只有拷贝构造函数被执行的时候,才会有输出;

这个时候因为这个自定义函数的数据类型是一个引用类型,所以不会执行拷贝构造函数,函数里面的u就是一个已经存在的对象,t就是新的对象,这个时候用已经存在的对象去初始化新的对象的时候,就会调用这个拷贝构造函数,返回值是类的对象,因此也会执行拷贝构造函数,在这个题目里面就执行了两次拷贝构造函数,因此打印结果就是两个1;

如果把这个题目的自定义函数的参数改为普通的对象,而不是引用,这个时候就会执行三次拷贝构造函数,同时这个题目就会包括拷贝构造函数执行的所有情况,因此请读者下去仔细体会;

这个也是让我们去考虑调用了哪些函数,输出结果的判断首先要清楚这个函数的执行顺序以及执行情况是怎样的;

定义对象c1的时候,这个会先执行一次这个构造函数,输出1;

这个时候就会使用默认构造函数的语句进行初始化,调用show函数的时候,这个首先就是函数的参数是一个类的对象,就会执行拷贝构造函数,输出结果3;

因为前面是调用的默认的构造函数初始化,这个时候的成员变量的值就是字符A,被打印输出;

定义对象c2的时候就会调用我们自己写的有一个参数的构造函数,输出2,然后调用show函数,同样会执行这个拷贝构造函数,输出3,然后是这个打印输出成员变量的值,也就是这个构造函数执行时候传递进去的B字符;

2.继承和派生

(1)派生的构造和析构

这个程序里面的A是子类,B是公共继承A的派生类,所以这个程序在执行的时候,先会去执行a的构造函数,再去执行b的构造函数,new  a的时候又会去调用a的构造函数;

 这个析构的时候,先去析构掉这个派生类,delete p的时候,就会执行a类的析构,因为这个指针执行的是a类里面的内存,这个时候再去析构基类;

(2)赋值的兼容性规则

 

例题派生的兼容性规则简单运用体会这个赋值兼容性怎么提现的

这个派生的兼容性规则我们可以通过下面的这个实例进行理解,基类和派生类之间到底是如何兼容的,首先我们看一下下面的这个基类和派生列之间都是公共继承的;

创建基类对象obj1,创建派生类对象obj2和obj3,然后去调用函数,第一次调用func函数传递基类对象的地址,打印的就是base class,第二次调用这个函数,虽然传递的是派生类对象的地址,但是func函数里面基类的指针只能访问基类的who,(这个地方就体现了赋值兼容性规则里面的派生类对象的地址传递给基类的指针),打印结果还是base class 下一个同理,我们使用obj2调用这个函数的时候才会输出这个derivel class,使用obj3调用这个函数的时候,才会输出derive2 class;

3.虚函数

(1)下面的这个题目既可以帮助我们了解虚函数,也可以帮助我们了解这个复制兼容性规则;

定义基类的对象b,和基类的指针p指向派生类D,使用这个D创建对象d,然后依次调用这个函数,第一个函数的参数就是基类指针,第二个函数的参数就是基类的引用,第三个函数的参数就是派生类的对象;

首先我们主函数里面调用第一个函数,传递的参数就是p指针,也就是基类的指针,这个基类的指针可以访问到派生类里面的成员函数,因为我们创建一个派生类D,指针指向他;(基类的指针指向派生类的对象的地址)

第二次调用函数,参数是对象的引用,而且是基类对象的引用,两个都是基类,输出的就是B;

第三次调用函数传递的是类,函数的参数也是类,这个时候类和类之间的赋值就要考虑这个赋值兼容性规则,实参是派生类对象,形参是基类对象,这个时候派生类对象只能访问到属于基类的部分,因此打印结果还是D;因为这个赋值兼容性规则里面就说了,这个func3函数里面只能访问到属于基类的部分,也就是这个func3函数形参b只能接受这个派生类里面属于基类的一部分,新派生出来的这个形参是不能接受的;

 

(2)虚函数的第二个题目

这个基类里面有一个虚函数,一个不是虚函数;

obj这个派生类的对象,函数参数是基类的引用,调用fun1函数,只会访问这个基类的成员函数,调用fun2就会访问这个派生类里面的函数,输出deprived;

 

(3)虚函数的第三个题目

这个是连续的两个派生,我们到底该如何理解这个虚函数,就是可以理解为这个虚函数就是实际是不存在的,执行的时候执行的是这个派生类的虚函数;

定义基类的aa对象和p指针,这个时候没有任何输出,然后定义一个派生类two的对象,bb这个时候就会执行构造函数,输出第一个2,定义three类的时候,先会去执行父类2的函数,2又回去执行自己的父类1的函数,但是1这个父类函数是虚函数,所以只会打印一个2,就是第二个2;

然后基类的指针p指向派生类对象cc,调用f函数的时候,先调用父类的f函数,输出1,再输出3;

(4)虚函数的第四个问题

我们创建了一个基类的对象,fn传参,形参是基类的引用,但是因为这个基类的虚函数和子类的虚函数的函数的参数不一样,因此这个只会调用基类里面定义的函数;

【6小时速通C++】面向对象部分:类和对象、构造和析构、继承和派生、虚函数_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1Ze411H74Y/?spm_id_from=333.880.my_history.page.click&vd_source=a432cb5e896a2b96961d1f73a6ebe0ca 

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

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

相关文章

安装systemd-bootchart

要安装systemd-bootchart,你可以按照以下步骤进行: 步骤一:更新软件包列表 首先,打开终端并更新你的软件包列表,以确保你拥有最新的可用软件包信息。运行以下命令: sudo apt update步骤二:安…

Git使用总结(git使用,git实操,git命令和常用指令)

简介:Git是一款代码版本管理工具,可以记录每次提交的代码,防止代码丢失,可实现版本迭代,解决代码冲突,常用的远程Git仓库:Gitee(国内)、GitHub(国外&#xff…

接口请求的六种常见方式详解(get、post、head等)

一.接口请求的六种常见方式: 1、Get 向特定资源发出请求(请求指定页面信息,并返回实体主体) 2、Post 向指定资源提交数据进行处理请求(提交表单、上传文件),又可能导致新的资源的建…

封装console

目的 1. 封装console.log , 使得打印更美观方便 2. 同时希望上线后不在打印消耗资源 例图: export const prettyLog () > {const isProduction import.meta.REACT_APP_ENV "prod";const isEmpty (value) > {return value null || val…

Flutter 实现dispose探测控件

文章目录 前言一、什么是dispose探测控件?1、通常情况2、使用dispose探测控件 二、如何实现1、继承StatefulWidget2、定义dipose回调3、定义child4、重载Dispose方法5、build child 三、完整代码四、使用示例1、基本用法2、设置定义数据 总结 前言 开发flutter一般…

Java 期末复习 习题集

💖 单选题 💖 填空题 💖 判断题 💖 程序阅读题 1. 读代码写结果 class A {int m 5;void zengA(int x){m m x;}int jianA(int y){return m - y;} }class B extends A {int m 3;int jianA(int z){return super.jianA(z) m;} …

Chapter 6 Frequency Response of Amplifiers

Chapter 6 Frequency Response of Amplifiers 这一节我们学习单极和差分运放的频率响应. 6.1 General Considerations 我们关心magnitude vs 频率, 因此有低通, 带通, 高通滤波器 6.1.1 Miller Effect Miller’s Theorem 考虑impedance Z1和Z2, X和Y之间增益为Av. Z1 Z/(…

spring 启动顺序

BeanFactoryAware 可在Bean 中获取 BeanFactory 实例 ApplicationContextAware 可在Bean 中获取 ApplicationContext 实例 BeanNameAware 可以在Bean中得到它在IOC容器中的Bean的实例的名字。 ApplicationListener 可监听 ContextRefreshedEvent等。 CommandLineRunner 整…

数据结构与算法笔记:基础篇 - 二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?

概述 上篇文章,我们学习了树、二叉树及二叉树的遍历,本章来学习一种特殊的二叉树,二叉查找树。二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除、查找操作。 之前说过,散列表也是支持这些操作的&#xf…

盘点2024年5月Sui生态发展,了解Sui近期成长历程!

2024年5月是Sui的第一个生日月,Sui迎来了它的上线一周年纪念日。在过去的一年中Sui在技术进步与创新、生态系统的扩展、社区发展与合作伙伴关系以及重大项目和应用推出方面取得重要进展,展示了其作为下一代区块链平台的潜力。 以下是Sui的近期成长历程集…

QT 信号和槽 通过自定义信号和槽沟通 如何自定义槽和信号的业务,让它们自动关联 自定义信号功能

通过信号和槽机制通信,通信的源头和接收端之间是松耦合的: 源头只需要顾自己发信号就行,不用管谁会接收信号;接收端只需要关联自己感兴趣的信号,其他的信号都不管;只要源头发了信号,关联该信号…

STM32 | 独立看门狗 | RTC(实时时钟)

01、独立看门狗概述 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状…

QQ号码采集器-QQ邮箱采集器

寅甲QQ邮箱采集器或QQ号码采集软件, 一款采集QQ号、QQ邮件地址,采集QQ群成员、QQ好友的软件。可以按关键词采集,如可以按地区、年龄、血型、生日、职业等采集。采集速度非常快且操作很简单。

BoardLight - hackthebox

简介 靶机名称:BoardLight 难度:简单 靶场地址:https://app.hackthebox.com/machines/603 本地环境 靶机IP :10.10.11.11 ubuntu渗透机IP(ubuntu 22.04):10.10.16.17 windows渗透机IP(windows11&…

从欧盟弹性法案看软件物料清单(SBOM)

随着网络安全意识的提升和相关法规的推动,SBOM在国际上网络安全实践中的重要性日益凸显。 例如:美国国土安全部(DHS)的 “软件供应链评估工具包”(SCAT)就鼓励软件供应商提供SBOM,以帮助买方评…

重新认识Word —— 制作简历

重新认识Word —— 制作简历 PPT的图形减除功能word中的设置调整页边距进行排版表格使用 我们之前把word长排版文本梳理了一遍,其实word还有另外的功能,比如说——制作简历。 在这之前,我们先讲一个小技巧: PPT的图形减除功能 …

【数据结构】栈和队列-->理解和实现(赋源码)

Toc 欢迎光临我的Blog,喜欢就点歌关注吧♥ 前面介绍了顺序表、单链表、双向循环链表,基本上已经结束了链表的讲解,今天谈一下栈、队列。可以简单的说是前面学习的一特殊化实现,但是总体是相似的。 前言 栈是一种特殊的线性表&…

VISIO安装教程+安装包

文章目录 01、什么是VISIO?02、安装教程03、常见安装问题解析 01、什么是VISIO? Visio是由微软开发的流程图和图表绘制软件,它是Microsoft Office套件的一部分。Visio提供了各种模板和工具,使用户能够轻松创建和编辑各种类型的图…

【微信小程序开发(从零到一)】——个人中心页面的实战项目(二)

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

VS2022+Qt雕刻机单片机马达串口上位机控制系统

程序示例精选 VS2022Qt雕刻机单片机马达串口上位机控制系统 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《VS2022Qt雕刻机单片机马达串口上位机控制系统》编写代码,代码整洁&a…