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

news2024/9/20 20:44:31

目录

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.coloradmin.cn/o/1808691.html

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

相关文章

Postman环境变量以及设置token全局变量!

前言百度百科解释: 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。 环境变量是在操作系统中一个具有特定名字的对象,它…

【微服务】springcloud-alibaba 配置多环境管理使用详解

目录 一、前言 二、配置多环境问题概述 2.1 什么是微服务多环境配置管理 2.1.1 微服务多环境配置管理问题起源 2.2 为什么要做多环境配置管理 2.3 微服务多环境配置管理解决方案 三、springboot 配置多环境管理解决方案 3.1 前置准备 3.1.1 搭建一个springboot工程 3.…

第五十六周:文献阅读

目录 摘要 Abstract 文献阅读:应用于地表水总磷浓度预测的可解释CEEMDAN-FE-LSTM-Transformer混合模型 一、现有问题 二、提出方法 三、方法论 1、CEEMDAN(带自适应噪声的完全包络经验模式分解) 2、FE(模糊熵 &#xff09…

k8s离线部署Calico网络(2续)

下载离线镜像 百度网盘 链接:https://pan.baidu.com/s/14ReJW-ZyYZFLbwSEBZK6mA?pwdi6ct 提取码:i6ct 1.将离线镜像上传至所有服务器并解压: [rootmaster ~]# tar xf calico.tar.gz [rootmaster ~]# cd calico 2.所有服务器使用for循环导入…

Python 基础语法详解(三)

Python 基础语法详解(三) Python 运算符Python 算术运算符①理论讲解:②实操讲解: Python 比较运算符①理论讲解:②实操讲解: Python 赋值运算符Python 位运算符①理论讲解:②实操讲解&#xff…

JVM学习-JVM运行时参数

JVM参数选项 标准参数选项 特点 稳定,后续版本不会变化以【-】开头 各种选项 运行java或者java -help可以看到所有的标准选项 补充内容 -server:64位机器上只支持Server模式的JVM,适用于需要大内存的应用程序,默认用并行垃圾回…

【微信小程序】事件传参的两种方式

文章目录 1.什么是事件传参2.data-*方式传参3.mark自定义数据 1.什么是事件传参 事件传参:在触发事件时,将一些数据作为参数传递给事件处理函数的过程,就是事件传参 在微信小程序中,我们经常会在组件上添加一些自定义数据,然后在…

【前端】使用window.print() 前端实现网页打印详细教程(含代码示例)

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 🤓 同时欢迎大家关注其他专栏,我将分享Web前后端开发、人工智能、机器学习、深…

云服务平台仿真-身份认证/授权/申请和释放IT资源[云计算3]

实验名称 云服务平台仿真--身份认证/授权/申请和释放IT资源 实验目的 通过CloudSim仿真,熟悉云服务平台的构建。通过CloudSim仿真,熟悉各种云机制在云服务中的实现原理。 实验原理 CloudSim可以模拟云服务的各类底层方法。在省略技术细节的前提下&a…

tkinter菜单栏

tkinter菜单栏 菜单栏效果代码 菜单栏 在 Tkinter 中,Menu 组件用于创建菜单栏、下拉菜单和上下文菜单,是构建图形用户界面(GUI)应用程序的常见需求。 效果 代码 import tkinter as tk from tkinter import messagebox# 创建主…

linux安装jdk + docker+dockercompose+aliyunACR

下载安装包 链接:https://pan.baidu.com/s/1AyFvPA5qwy4IxfZoTQohrQ 提取码:6666 安装jdk jdk-8u411-linux-x64.tar.gz 链接:https://pan.baidu.com/s/1BZ7J4L5PY-9nuQyxBMDGTA 提取码:6666 1、解压jdk tar -xvf jdk-8u411-li…

上市公司短视主义数据集(2001-2022年)

数据简介:上市公司短视主义是指公司管理层过于关注短期业绩和股价表现,而忽视公司的长期发展和战略规划。这种短视行为可能会导致公司投资决策的失误,影响公司的长期竞争力。 在上市公司年度报告年度中,通过已有的反映管理者“短…

SpringBoot的Mybatis-plus实战之基础知识

文章目录 MybatisPlus 介绍一、MyBatisPlus 集成步骤第一步、引入依赖第二步、定义mapper 二、注解TableNameTableldTableField 三、配置文件四、加解密实现步骤 在SpringBoot项目中使用Mybatis-plus,记录下来,方便备查。 MybatisPlus 介绍 为简化开发而…

C语言 图形化界面方式连接MySQL【C/C++】【图形化界面组件分享】

博客主页:花果山~程序猿-CSDN博客 文章分栏:MySQL之旅_花果山~程序猿的博客-CSDN博客 关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长! 目录 一.配置开发环境 二…

晨控CK-UR12-E01与欧姆龙NX/NJ系列EtherNet/IP通讯手册

晨控CK-UR12-E01与欧姆龙NX/NJ系列EtherNet/IP通讯手册 晨控CK-UR12-E01 是天线一体式超高频读写器头,工作频率默认为902MHz~928MHz,符合EPC Global Class l Gen 2/IS0-18000-6C 标准,最大输出功率 33dBm。读卡器同时…

41 mysql subquery 的实现

前言 sub query 是一个我们经常会使用到的一个 用法 我们这里 看一看各个场景下面的 sub query 的相关处理 查看 本文, 需要 先看一下 join 的相关处理 测试数据表如下, 两张测试表, tz_test, tz_test03, 表结构 一致 CREATE TABLE tz_test (id int(11) unsigned NOT NUL…

HTML静态网页成品作业(HTML+CSS)—— 名人霍金介绍网页(6个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有6个页面。 二、作品演示 三、代…

千万别买BBA 有40万+预算冲它就对了

文 | Auto芯球 作者 | 擎天 如果现在买BBA 不是纯纯大冤种吗? 有钱就无脑冲M9啊 不然肯定会后悔 这话说给所有有40万预算的朋友听 别不信 今天我才看到一组数据 从4月29号到6月2号 短短五周时间 问界M9就卖了1.82万辆 在40万以上的国产车中遥遥领先 比…

ChatTTS改良版 - 新增精选高品质音色,新增超长文本推理,新增api接口

这个版本是ChatTTS的一个分支,基于ChatTTS修改,由6drf21e大佬改良,大佬GitHub地址 GitHub - 6drf21e/ChatTTS_colab: 🚀 一键部署(含离线整合包)!基于 ChatTTS ,支持音色抽卡、长音频…

港中文斯坦福提出SD加速模型PCM,一步即可生成图像和视频,可直接与SD1.5,SDXL,AnimateLCM结合!

又有新的SD加速模型可以用了,PCM解决了原来LCM模型的各种问题。并且对 AnimateLCM 也做了优化,用PCM直接生成动画也可以保证质量了。 PCM从这三个角度说明了LCM的设计空间是有限的并很好地解决了这些限制。 PCM主要改善了三个LCM原有的问题:…