【C/C++笔试练习】初始化列表、构造函数、析构函数、两种排序方法、求最小公倍数
文章目录
- C/C++笔试练习
- 1. 初始化列表
- (1)只能在列表初始化的变量
- 2.构造函数
- (2)函数体赋值
- (3)构造函数的概念
- (4)构造函数调用次数
- (5)构造函数调用次数
- (6)构造函数调用次数
- 3.析构函数
- (7)析构函数的概念
- (8)析构函数的概念
- (9)构造和析构的顺序
- 4.编程题 day8
- (10)两种排序方法
- (11)求最小公倍数
C/C++笔试练习
1. 初始化列表
(1)只能在列表初始化的变量
有一个类A,其数据成员如下:
class A {
...
private:int a;
public:const int b;float* &c;static const char* d;static double* e;
};
则构造函数中,成员变量一定要通过初始化列表来初始化的是:______。
A. a b c B. b c
C. b c d e D. b c d
E. b F. c
初始化列表是什么:
以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
初始化列表的示例:
class Date
{
public:
Date(int year, int month, int day): _year(year), _month(month), _day(day)
{}private:int _year;int _month;int _day;
};
初始化列表注意的地方:
(1)每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
(2)类中包含以下成员,必须放在初始化列表位置进行初始化:
1.引用成员变量
2.const成员变量
3.自定义类型成员(且该类没有默认构造函数时)
(3)尽量使用初始化列表初始化, 因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。
(4)成员变量在类中声明次序就是其在初始化列表中的初始化顺序, 与其在初始化列表中的先后次序无关。
只能在初始化列表中初始化的类型示例:
class A
{
public:A(int a):_a(a){}private:int _a;
};class B
{
public:
B(int a, int ref):_aobj(a),_ref(ref),_n(10){}private:A _aobj; // 没有默认构造函数int& _ref; // 引用const int _n; // const
};
根据上面的内容,我们知道const修饰的成员变量和引用成员变量只能使用初始化列表来进行初始化,a是内置成员可以在初始化列表也可以在函数体内初始化,而静态成员变量d,e只能在类外进行定义,不能在初始化列表中进行初始化, 所以选择b,c。
答案选:B
2.构造函数
(2)函数体赋值
假定一个类的构造函数为A(int aa,int bb){a=aa--;b=a*bb;}则执行A x(4,5);语句后,x.a和x.b的值分别为()
A. 20和5 B. 3和15
C. 5和4 D. 4和20
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值
class Date
{
public:
Date(int year, int month, int day)
{_year = year;_month = month;_day = day;
}
private:int _year;int _month;int _day;
};
函数体赋值和初始化列表不同:
虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。

在上面的程序中,先实例化了A对象x(4,5),将4,5分别赋值给A构造函数中的,aa和bb,然后函数体内赋值,注意:这里先把aa=4赋值给a,然后才执行后置–,此时,a=4,aa=3;然后b=a*bb,计算得到b=20, 输出即可。
答案选:D
(3)构造函数的概念
下列关于构造函数的描述正确的是?
A. 构造函数可以声明返回类型 B. 构造函数不可以用private修饰
C. 构造函数必须与类名相同 D. 构造函数不能带参数
构造函数的介绍:构造函数
构造函数是C++中的一个特殊函数,用于初始化类对象的数据成员,为对象分配内存并完成一些初始化工作。一个类可以有多个构造函数,但必须满足函数名相同、参数列表不同的条件,称为函数重载。
构造函数有以下特点:
(1)构造函数的函数名与类名相同。
(2)构造函数无返回值。
(3)对象实例化时编译器自动调用对应的构造函数。
(4)构造函数可以重载。
(5)如果一个类没有定义自己的构造函数,编译器会自动生成一个默认的构造函数,该函数不带任何参数并且什么也不做,它会自动初始化类的成员变量并分配内存。一旦用户显式定义编译器将不再生成
(6)C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型,如:int/char…,自定义类型就是我们使用class/struct/union等自己定义的类型,编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数。
(7)无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。
根据上面对构造函数的简单介绍,对于a构造函数没有返回值,b构造函数可以在实现特殊类的时候就有使用private修饰,c构造函数和类名相同,构造函数可以重载带参数。
答案选:C
(4)构造函数调用次数
假定有类AB,有相应的构造函数定义,能正确执行语句,请问执行完此语句后共调用该类的构造函数次数为___
AB a(4),b(5),c[3],*p[2]={&a,&b}
A. 5 B. 4
C. 3 D. 9

开始的时候我们实例化了a,b,这里会调用两次的单参数构造,然后实例化一个数组c,c中有三个元素,所以会调用三次默认构造,注意,这里的p是一个指针数组,创建的是指针,没有实例化对象。
所以,总共调用了2 + 3 = 5次构造函数。因此,答案为A. 5。
答案选:A
(5)构造函数调用次数
若MyClass是一个类名,其有如下语句序列:
MyClass c1,*c2;
MyClass *c3=new MyClass;
MyClass &c4=c1;
上面的语句序列调用构造函数个数是( )。
A. 1 B. 2
C. 3 D. 4

和上面类似,实例化c1,调用一次构造函数,c2是指针,不调用构造函数,c3指向一个MyClass对象,此时再实例化一个Myclass对象,调用一次构造函数,c4是c1的引用,不调用构造函数。
答案选:B
(6)构造函数调用次数
如果MyClass为一个类,执行”MyClass a[5], *b[6]”语言会自动调用该类构造函数的次数是()
A. 2 B. 5
C. 4 D. 9

此时实例化一个数组对象a,数组中有5个MyClass元素,所以调用5次构造函数,b是一个指针数组,内含6个MyClass类型的指针,没有实例化对象,所以不调用构造函数。
答案选:B
3.析构函数
(7)析构函数的概念
下面对析构函数的正确描述是()
A. 系统不能提供默认的析构函数
B. 析构函数必须由用户定义
C. 析构函数没有参数
D. 析构函数可以设置默认参数
析构函数的概念:析构函数
与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
析构函数有以下特点:
(1)析构函数名是在类名前加上字符 ~。
(2)无参数无返回值类型。
(3)一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
(4)析构函数不能重载。
(5)对象生命周期结束时,C++编译系统系统自动调用析构函数。
(6)如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。
所有对于选项A,B,当我们没有写析构函数的时候,系统会提供一个默认的析构函数,析构函数没有参数,不能重载,所以一个类只能有一个析构函数,D错误。
答案选:C
(8)析构函数的概念
哪种说法是错误的()?
A. 构造函数可以有形参
B. 析构函数可以有形参
C. 构造函数无任何函数类型
D. 析构函数无任何函数类型
构造函数可以有形参实现重载,但是一个类只能有一个析构函数,所以析构函数没有形参。构造函数和析构函数都没有返回值。
答案选:B
(9)构造和析构的顺序
在 main 函数中,变量 a 和 b 的构造函数和析构函数的调用顺序是()
class A;
class B;
int main() {A a;B b;return 0;
}
A. b构造 - a构造 - a析构 - b析构
B. a构造 - a析构 - b构造 - b析构
C. b构造 - a构造 - b析构 - a析构
D. a构造 - b构造 - b析构 - a析构
我们先实例化A类的对象a,此时a会调用构造函数,然后类B的对象b会被构造。要注意,这里的操作和new和delete的底层相似,当main函数结束时,对象b会被首先析构,然后是对象a。 所以,整个生命周期的顺序应该是:a构造 - b构造 - b析构 - a析构。
答案选:D
4.编程题 day8
(10)两种排序方法
两种排序方法
解题思路:
我们将接受的字符串都放到vector容器中,利用string的operator>=运算符重载来按ascii比较字符串,利用string的size来比较字符串的长度。
#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{int n;cin>>n;vector<string> v;v.resize(n);for(auto& str : v)cin>>str;bool lenSym = true, lexSym = true;// 这里要注意从i=1开始遍历,前后比较,比较长度for(size_t i = 1; i < v.size(); ++i){if(v[i-1].size() >= v[i].size()){lenSym = false;break;}}//比较ASCII码for(size_t i = 1; i < v.size(); ++i){if(v[i-1] >= v[i]){lexSym = false;break;}}if (lenSym&& lexSym)cout<<"both"<<endl;else if (!lenSym && lexSym)cout<<"lexicographically"<<endl;else if (lenSym && !lexSym)cout<<"lengths"<<endl;else if (!lenSym&&!lexSym)cout<<"none"<<endl;return 0;
}
(11)求最小公倍数
求最小公倍数
解题思路:
最小公倍数 = 两数之积除以最大公约数,这里使用碾转相除法进行最大公约数的求解:即a与b的最大公约数可以转化为a、b之间的余数为两者之间最小的数之间的公约数。所以对于输入的两个数进行连续求余,直到余数为0,求余的分母即为结果。
#include<iostream>
using namespace std;int gcd(int a, int b)
{int r;while(r = a%b){a = b;b = r;}return b;
}int main()
{int a,b;while(cin >> a >> b){cout << a*b/gcd(a,b) <<endl;}return 0;
}
相关文章:
【C/C++笔试练习】初始化列表、构造函数、析构函数、两种排序方法、求最小公倍数
文章目录 C/C笔试练习1. 初始化列表(1)只能在列表初始化的变量 2.构造函数(2)函数体赋值(3)构造函数的概念(4)构造函数调用次数(5)构造函数调用次数ÿ…...
分享 | 对 电商API 平台的再思考
API 是推动现代企业数字化转型的基础。它不但连接了内部应用程序、合作伙伴和客户,同时也快速持续地向市场提供了各种新产品、版本和功能。 但当下还是以集中式的 API 交付为主。一个企业的对外 API 交付过程通常都是冗余而繁琐的,对企业内部的敏捷性、速…...
C语言--程序环境和预处理
前言 本章就是c语言的最后一个板块了,学完这章节,我们将知道写出的代码如何变成可执行程序的,这是非常重要的一个章节,那让我们一起进入本章的学习吧。 本章重点: 程序的翻译环境程序的执行环境详解:C语言程…...
深度学习笔记_5 经典卷积神经网络LeNet-5 解决MNIST数据集
1、定义LeNet-5模型,包括卷积层和全连接层。 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms# 导入必要的库# 定义 LeNet-5 模型 class LeNet5(nn.Module):def __init__(self):super(LeNet5, self…...
国内智能客服机器人都有哪些?
随着人工智能技术的不断发展,智能客服机器人已经成为了企业客户服务的重要工具。国内的智能客服机器人市场也迎来了飞速发展,越来越多的企业开始采用智能客服机器人来提升客户服务效率和质量。 在这篇文章中,我将详细介绍国内知名的智能客服机…...
Matlab/C++源码实现RGB通道与HSV通道的转换(效果对比Halcon)
HSV通道的含义 HSV通道是指图像处理中的一种颜色模型,它由色调(Hue)、饱和度(Saturation)和明度(Value)三个通道组成。色调表示颜色的种类,饱和度表示颜色的纯度或鲜艳程度…...
【C进阶】动态内存管理
一、为什么存在动态内存分配 我们之前学的都是开辟固定大小的空间,但有时候需要空间的大小只有在程序运行时才能知道,那么就引入了动态内存开辟 内存分布所在: 二、动态内存函数的介绍 2.1malloc和free 动态内存开辟的函数 void * malloc…...
神经网络的梯度优化方法
神经网络的梯度优化是深度学习中至关重要的一部分,它有助于训练神经网络以拟合数据。下面将介绍几种常见的梯度优化方法,包括它们的特点、优缺点以及原理。 梯度下降法 (Gradient Descent): 特点: 梯度下降是最基本的优化算法,它试图通过迭代…...
linux 装机教程(自用备忘)
文章目录 安装 pyenv 管理多版本 python 环境安装使用使用 pyenv 和 virtualenv 管理虚拟 python 环境 vscode 连接远程服务器tmux 美化zsh 安装 pyenv 管理多版本 python 环境 安装 (教程参考:https://www.modb.pro/db/155036) sudo apt-…...
Tensorboard安装及简单使用
Tensorboard 1. tensorboard 简单介绍2. 安装必备环境3. Tensorboard安装4. 可视化命令 1. tensorboard 简单介绍 TensorBoard是一个可视化的模块,该模块功能强大,可用于深度学习网络模型训练查看模型结构和训练效果(预测结果、网络模型结构…...
SpringCloud 微服务全栈体系(二)
第三章 Eureka 注册中心 假如我们的服务提供者 user-service 部署了多个实例,如图: 思考几个问题: order-service 在发起远程调用的时候,该如何得知 user-service 实例的 ip 地址和端口?有多个 user-service 实例地址…...
flutter 常用组件:列表ListView
文章目录 总结#1、通过构造方法直接构建 ListView 提供了一个默认构造函数 ListView,我们可以通过设置它的 children 参数,很方便地将所有的子 Widget 包含到 ListView 中。 不过,这种创建方式要求提前将所有子 Widget 一次性创建好,而不是等到它们真正在屏幕上需要显示时才…...
十四天学会C++之第七天:STL(标准模板库)
1. STL容器 什么是STL容器,为什么使用它们。向量(vector):使用向量存储数据。列表(list):使用列表实现双向链表。映射(map):使用映射实现键值对存储。 什么…...
Linux 下安装 miniconda,管理 Python 多环境
安装 miniconda 1、下载安装包 Miniconda3-py37_22.11.1-1-Linux-x86_64.sh,或者自行选择版本 2、把安装包上传到服务器上,这里放在 /home/software 3、安装 bash Miniconda3-py37_22.11.1-1-Linux-x86_64.sh 4、按回车 Welcome to Miniconda3 py37…...
Django和jQuery,实现Ajax表格数据分页展示
1.需求描述 当存在重新请求接口才能返回数据的功能时,若页面的内容很长,每次点击一个功能,页面又回到了顶部,对于用户的体验感不太友好,我们希望当用户点击这类的功能时,能直接加载到数据,请求…...
k8s认证
1. 证书介绍 服务端保留公钥和私钥,客户端使用root CA认证服务端的公钥 一共有多少证书: *Etcd: Etcd对外提供服务,要有一套etcd server证书Etcd各节点之间进行通信,要有一套etcd peer证书Kube-APIserver访问Etcd&a…...
基于python开发的IP修改工具
工作中调试设备需要经常修改电脑IP,非常麻烦,这里使用Pythontkinter做了一个IP修改工具 说明: 1.启动程序读取config.json文件2.如果没有该文件则创建,写入当前网卡信息3.通过配置信息进行网卡状态修改4.更新文件状态,删除或修…...
Mybatis源码分析
1. Mybatis整体三层设计 SSM中,Spring、SpringMVC已经在前面文章源码分析总结过了,Mybatis源码相对Spring和SpringMVC而言是的简单的,只有一个项目,项目下分了很多包。从宏观上了解Mybatis的整体框架分为三层,分别是基…...
python树结构包treelib入门及其计算应用
树是计算机科学中重要的数据结构。例如决策树等机器学习算法设计、文件系统索引等。创建treelib包是为了在Python中提供树数据结构的有效实现。 Treelib的主要特点包括: 节点搜索的高效操作。支持常见的树操作,如遍历、插入、删除、节点移动、浅/深复制…...
Rust之自动化测试(三): 测试组合
开发环境 Windows 10Rust 1.73.0 VS Code 1.83.1 项目工程 这里继续沿用上次工程rust-demo 测试组合 正如本章开始时提到的,测试是一个复杂的学科,不同的人使用不同的术语和组织。Rust社区根据两个主要类别来考虑测试:单元测试和集成测试。单元测试很…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
