【C++ 系列文章 -- 程序员考试 201805 下午场 C++ 专题 】
文章目录
- 1.1 C++ 题目六
- 1.1.1 填空(1)详解
- 1.1.1.1 C++ 纯虚函数介绍
- 1.1.2 填空(2)详解
- 1.1.2.1 父类声明了带参构造函数
- 1.1.2.2 子类中构造函数的构造原则
- 1.1.3 填空(3)详解
- 1.1.4 填空(4)详解
- 1.1.5 填空(4)和(5)详解
1.1 C++ 题目六
阅读下列说明和C++代码,填写程序中的空(1)~(6),将解答写入答题纸的对应栏内。
【说明】
以下C++代码实现一个简单绘图工具,绘制不同形状以及不同颜色的图形。部分类及其关系如图 6-1 所示。

include <iostream>
include <string>using namespace std;class DrawCircle { //绘制圆形,抽象类public:(1) ;//定义参数为 int radius, int x, int yvirtual~DrawCircle() { }
};class RedCircle:public DrawCircle { //绘制红色圆形public:void drawCircle(int radius, int x, int y) {cout << "Drawing Circle[red,radius: " <<radius;cout << ",x: " <<x<< ",y: "<<y<< "]" << endl;}
};class GreenCircle:public DrawCircle { //绘制绿色圆形public:void drawCircle(int radius, int x, int y) {cout <<"Drawing Circle[green,radius: " << radius;cout <<",x: " <<x<< ",y: " <<y<< "]" << endl;}
};class Shape { //形状,抽象类protected:(2) ;public:Shape(DrawCircle drawCircle) {this -> drawCircle = drawCircle;}virtual~shape() { } public:virtual void draw() = 0;
};class Circle:public Shape { //圆形private:int x,y,radius;public:Circle(int x,int y,int radius,DrawCircle drawCircle) (3) {this->x = x;this->y = y;this->radius = radius;}public:void draw() {drawCircle -> (4) ;}
};int main()
{Shape redCircle=new Circle(100,100,10, (5) );//绘制红色圆形Shape greenCircle=new Circle(100,100,10, (6) );//绘制绿色圆形redCircle ->draw();greenCircle ->draw();return 0;
}
1.1.1 填空(1)详解
C++ 中定义一个类,通常会实现两个函数 构造函数和析构函数,如果用户没有定义这两个函数那么编译器会采用默认的构造函数和析构函数。从题目代码中可以看到 类 class DrawCircle 中定义了一个析构函数virtual~DrawCircle(),但是没有看到构造函数,那么就有两种情况:
- 采用编译器默认的构造函数;
空(1)即是要实现的构造函数。
由于这个时候不确定,所以只能继续向下看代码,看到 类 class RedCircle and class GreenCircle 都继承了抽象类 class DrawCircle, 并且这两个类中都实现了成员函数void drawCircle(int radius, int x, int y), 对比这个成员函数与 空(1) 的注释可以得出 空(1) 应该是 抽象类class DrawCircle中定义的纯虚函数,因为它在子类中被重新实现了。所以 空(1) 应该填:
virtual void drawCircle (int radius,int x,int y) = 0
析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀
1.1.1.1 C++ 纯虚函数介绍
纯虚函数是在声明虚函数时被 “初始化” 为 0 的函数。声明纯虚函数的一般形式是 virtual 函数类型 函数名 (参数表列) =0;
注意:
- ① 纯虚函数没有 函数体;
- ② 最后面的 “=0” 并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”;
- ③ 这是一个声明语句,最后应有分号。
纯虚函数只有函数的名字而不具备函数的功能,不能被调用。它只是通知编译系统: “在这里声明一个虚函数,留待派生类中定义”。在派生类中对此函数提供定义后,它才能具备函数的功能,可被调用。
1.1.2 填空(2)详解
从下面代码中可以看到 空(2) 定义了一个 protected 东东。
class Shape { //形状,抽象类protected:(2) ;public:Shape(DrawCircle drawCircle) {this -> drawCircle = drawCircle;}virtual~shape() { } public:virtual void draw() = 0;
};
这个时候我们要想到 C++ 中的潜规则:protected(受保护)成员变量或函数与私有成员十分相似,但有一点不同,protected(受保护)成员在派生类(即子类)中是可访问的。我们可以从两点推出 空(2) 填什么:
- 继续看代码,可以发现
class Shape的子类中使用到了DrawCircle drawCircle; - 抽象类
class Shape中的this->drawCircle,也就是class Shape类中肯定要有个成员变量drawCircle,然后结合class Shape中带参数的构造函数Shape(DrawCircle drawCircle)可知drawCircle类型为DrawCircle。
1.1.2.1 父类声明了带参构造函数
在这种情况下,要特别注意。因为父类只有带参的构造函数,所以如果子类中的构造函数没有显示地调用父类的带参构造函数,则会报错,所以必需显示地调用。
1.1.2.2 子类中构造函数的构造原则
构造函数与父类的其它成员(成员变量和成员方法)不同,它不能被子类继承。因此,在创建子类对象时,为了初始化从父类中继承来的成员变量,编译器需要调用其父类的构造函数。如果子类的构造函数没有显示地调用父类的构造函数,则默认调用父类的无参构造函数。
-
父类没有声明构造函数
- 子类也没有声明自己的构造函数,则父类和子类均由编译器生成默认的构造函数。
- 子类中声明了构造函数(无参或者带参),则子类的构造函数可以写成任何形式,不用顾忌父类的构造函数。在创建子类对象时,先调用父类默认的构造函数(编译器自动生成),再调用子类的构造函数。
-
父类只声明了无参构造函数
如果子类的构造函数没有显式地调用父类的构造,则将会调用父类的无参构造函数。也就是说,父类的无参构造函数将会被隐式地调用。 -
父类只声明了带参构造函数
见上节内容。
1.1.3 填空(3)详解
从代码中可以看到填空(3)是在class Shape的子类class Circle的构造函数Circle 后面添加些内容。
class Shape { //形状,抽象类protected:(2) ;public:Shape(DrawCircle drawCircle) {this -> drawCircle = drawCircle;}virtual~shape() { } public:virtual void draw() = 0;
};class Circle:public Shape { //圆形private:int x,y,radius;public:Circle(int x,int y,int radius,DrawCircle drawCircle) (3){this->x = x;this->y = y;this->radius = radius;}public:void draw() {drawCircle -> (4);}
};
看到子类构造函数之前,先去瞟一眼它的父类中是怎么定义其构造函数的,这一看,不得了,发现它的父类中构造函数居然是个带参数的构造函数,为啥要带参数呢?上文已经说了,就是为了初始化父类中的成员变量。所以儿子在实现自己的构造函时候千万不要放了自己的老父亲,也要给父亲的部下(成员变量)上上电,具体怎么上电呢,也就是使用:显示调用下:
Circle(int x,int y,int radius,DrawCircle drawCircle) : Shape(drawCircle)
1.1.4 填空(4)详解
填空(4) 中 drawCircle -> 是父类中定义的protected 类DrawCircle drawCircle, 类DrawCircle drawCircle中定义了一个void drawCircle (int radius,int x,int y) 方法,所以 填空(4) 填 drawCircle(radius,x,y)。
1.1.5 填空(4)和(5)详解
根据class Circle 中的构造函数的参数定义 Circle(int x,int y,int radius,DrawCircle drawCircle),可知最后一个参数应该填对象作为Circle里面的实参。所以填:
new RedCircle()new GreenCircle()
相关文章:
【C++ 系列文章 -- 程序员考试 201805 下午场 C++ 专题 】
文章目录 1.1 C 题目六1.1.1 填空(1)详解1.1.1.1 C 纯虚函数介绍 1.1.2 填空(2)详解1.1.2.1 父类声明了带参构造函数1.1.2.2 子类中构造函数的构造原则 1.1.3 填空(3)详解1.1.4 填空(4ÿ…...
Python如何使用datetime模块进行日期和时间的操作
目录 一、引言 二、datetime模块的基本使用 三、日期的运算 四、注意事项 总结 本文将对Python的datetime模块进行深入探讨,阐述如何使用该模块进行日期和时间的各种操作。我们将介绍日期和时间的基本操作,以及格式化、时区处理等高级操作ÿ…...
flutter之bloc使用详解
flutter中一切皆为Widget,因此在我们开发中,往往业务和UI逻辑写在一起,这样不利于代码维护,因此状态管理框架久诞生了,这篇就开始讲一讲Bloc。 对于Bloc库有两个,如下图: flutter_bloc其实是对…...
记一次 .NET 某工厂无人车调度系统 线程爆高分析
一:背景 1. 讲故事 前些天有位朋友找到我,说他程序中的线程数爆高,让我帮忙看下怎么回事,这种线程数爆高的情况找问题相对比较容易,就让朋友丢一个dump给我,看看便知。 二:为什么会爆高 1. …...
高等数学啃书汇总重难点(九)多元函数微分法及其应用
下册最重要也是个人认为偏恶心的一节(主要东西是真不少....)重点在于会计算偏导、能理解全微分及隐函数求导3个核心内容,至于后面的关于几何层面的应用,建议掌握计算方法即可,学有余力再死磕推导过程等内容~ 1.平面点集…...
Vue3前端100个必要的知识点
为什么是必要的,就是这100个知识点学完后,能独立完成一个小项目。最终能得到一个解决方案。也算是前端知识的积累。如果后面有需要的地方可以回来查。100个其实比较多,我会按新手老鸟,大神来分成3个等级,话不多说&…...
CCS3列表和超链接样式
在默认状态下,超链接文本显示为蓝色、下画线效果,当鼠标指针移过超链接时显示为手形,访问过的超链接文本显示为紫色;而列表项目默认会缩进显示,并在左侧显示项目符号。在网页设计中,一般可以根据需要重新定…...
vue手机项目如何控制蓝牙连接
要控制蓝牙连接,您需要使用Vue的蓝牙插件或库,例如BLE-Peripheral或cordova-plugin-ble-central。以下是一些基本步骤: 导入蓝牙插件或库。在Vue组件中创建一个蓝牙对象并初始化它。扫描周围的蓝牙设备并连接到所需的设备。一旦连接成功&…...
遥遥领先,免费开源的django4-vue3项目
星域后台管理系统前端介绍 🌿项目简介 本项目前端基于当下流行且常用的vue3作为主要技术栈进行开发,融合了typescript和element-plus-ui,提供暗黑模式和白昼模式两种主题以及全屏切换,开发bug少,简单易学,…...
视频平台跨网级联视频压缩解决方案
一、 简介 视频监控领域对带宽有着较大的需求,这是因为视频流需要实时占用网络带宽资源。视频监控的传输带宽是组网结构的基础保障,关系到视频监控的稳定性、可靠性和可拓展性等因素。例如,720P的视频格式每路摄像头的比特率为2Mbpsÿ…...
利用python进行数据分析 pdf
利用python进行数据分析 pdf 介绍 在现代社会中,随着大数据时代的到来,数据分析的需求越来越大。而Python作为一门简洁且易于学习的编程语言,具有强大的数据分析能力,成为了广大数据分析师的首选工具之一。本文将指导一位刚入行的…...
Day46.算法训练
518. 零钱兑换 II class Solution {public int change(int amount, int[] coins) {int dp[] new int[amount 1];dp[0] 1;// 遍历物品for (int i 0; i < coins.length; i) {// 遍历背包 从小到大for (int j coins[i]; j < amount; j) {dp[j] dp[j - coins[i]]; …...
基于YOLOv8模型暗夜下人脸目标检测系统(PyTorch+Pyside6+YOLOv8模型)
摘要:基于YOLOv8模型暗夜下人脸目标检测系统可用于日常生活中检测与定位黑夜下人脸目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法…...
如何在 Photoshop 中使用位图模式制作自定义音乐海报
如何在 Photoshop 中使用位图创建炫酷的音乐海报设计。 1.如何设置新的 Photoshop 文件 步骤1 在 Photoshop中,转到 “文件”>“新建”。将文档命名为 “音乐海报”。 将宽度设置 为 1270 px , 高度 设置为 1600 px。将分辨率 设置 为 72 像素/英寸…...
1 — NLP 的文本预处理技术
一、说明 在本文中,我们将讨论以下主题:1为什么文本预处理很重要?2 文本预处理技术。这个文对预处理做一个完整化、程序化处理,这对NLP处理项目中有很大参考性。 二、为什么文本预处理很重要? 数据质量显着影响机器学习…...
TypeScript之泛型
一、是什么 泛型程序设计(generic programming)是程序设计语言的一种风格或范式 泛型允许我们在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型 在typescript中,定义函数,…...
一个小妙招从Prompt菜鸟秒变专家!加州大学提出PromptAgent,帮你高效使用ChatGPT!
夕小瑶科技说 原创 作者 | 谢年年、王二狗 有了ChatGPT、GPT4之后,我们的工作学习效率得到大大提升(特别在凑字数方面୧(๑•̀◡•́๑)૭)。 作为一个工具,有人觉得好用,自然也有人觉得难用。 要把大模型用得6&am…...
Netty通信框架
Netty框架的底层是NIO,NIO:non-blocking io 非阻塞IO 一个线程可以处理多个通道,减少线程创建数量; 读写非阻塞,节约资源:没有可读/可写数据时,不会发生阻塞导致线程资源的浪费 一…...
6西格玛质量标准: 提升业务效率的关键
在现代竞争激烈的商业环境中,企业需要不断提高效率,降低成本,同时确保产品和服务的质量。为了达到这个目标,许多企业已经转向了6西格玛质量标准。这个方法旨在通过最小化缺陷和提高流程稳定性来优化业务运作,为客户提供…...
OpenGL ES相关库加载3D 车辆模型
需求类似奇瑞的这个效果,就是能全方位旋转拖拽看车,以及点击开关车门车窗后备箱等 瑞虎9全景看车 (chery.cn) 最开始收到这个需求的时候还有点无所适从,因为以前没有做过类似的效果,后面一经搜索后发现实现的方式五花八门…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
