【C/C++笔试练习】初始化列表、构造函数、析构函数、两种排序方法、求最小公倍数

news2025/4/27 2:11:04

文章目录

  • 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;
}

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

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

相关文章

自然语言处理---RNN经典案例之使用seq2seq实现英译法

1 seq2seq介绍 1.1 seq2seq模型架构 seq2seq模型架构分析&#xff1a; seq2seq模型架构&#xff0c;包括两部分分别是encoder(编码器)和decoder(解码器)&#xff0c;编码器和解码器的内部实现都使用了GRU模型&#xff0c;这里它要完成的是一个中文到英文的翻译&#xff1a;欢迎…

数据库MongoDB

MongoDB记录是一个文档&#xff0c;由一个字段和值对组成的数据结构&#xff0c;文档类似于JSON对象。 一个文档认为就是一个对象&#xff0c;字段的数据类型是字符型&#xff0c;值除了使用基本类型外&#xff0c;还可以包括其他文档&#xff0c;普通数组和文档数组。 一、…

Python —— UI自动化之使用JavaScript进行元素点亮、修改、点击元素

1、JavaScript点亮元素 在控制台通过JavaScript语言中对元素点亮效果如下&#xff1a; 将这个语句和UI自动化结合&#xff0c;代码如下&#xff1a; locator (By.ID,"kw") # 是元组类型 web_element WebDriverWait(driver,5,0.5).until(EC.visibility_of_eleme…

Windows安装virtualenv虚拟环境

需要先安装好python环境 1 创建虚拟环境目录 还是在D:\Program\ 的文件夹新建 .env 目录&#xff08;你也可以不叫这个名字&#xff0c;一般命名为 .env 或者 .virtualenv &#xff0c;你也可以在其他目录中创建&#xff09; 2 配置虚拟环境目录的环境变量 3 安装虚拟环境 进…

网络原理之UDP协议

文章目录 前言应用层协议常见的几种数据格式1. xml2. JSON3. protobuffer 端口号传输层UDP 报文协议格式源端口号和目的端口号UDP 长度校验和 前言 前面我们学习了如何使用 UDP 数据报 和 TCP 流实现网络编程一个回显服务器&#xff0c;在知道了 UDP 和 TCP 协议的基本原理之后…

Arduino驱动BMA220三轴加速度传感器(惯性测量传感器篇)

目录 1、传感器特性 2、硬件原理图 3、驱动程序 BMA220的三轴加速度计是一款具有I2C接口的超小型三轴低g加速度传感器断路器,面向低功耗消费市场应用。它可以测量3个垂直轴的加速度,从而在手机、手持设备、计算机外围设备、人机界面、虚拟现实功能和游戏控制器中感知倾斜、…

MYSQL第五章节有关约束操作详解(附代码,例题详解)这一篇就够了

c知识点合集已经完成欢迎前往主页查看&#xff0c;点点赞点点关注不迷路哦 点我进入c第一章知识点合集 MYSQL第一章节DDL数据定义语言的操作----点我进入 MYSQL第二章节DDL-数据库操作语言 DQL-数据查询语言----点我进入 MYSQL第三章节DCL-管理用户&#xff0c;控制权限----点我…

【Lua语法】字符串

Lua语言中的字符串是不可变值。不能像在C语言中那样直接改变某个字符串中的某个字符&#xff0c;但是可以通过创建一个新字符串的方式来达到修改的目的 print(add2(1 , 2 ,15,3))a "no one"b string.gsub(a , "no" , "on1111")print(a) print…

英语——名言篇——成语

爱屋及乌 Love me, love my dog.百闻不如一见 (眼见为实 ) Seeing is believing.比上不足比下有余 worse off than some, better off than many; to fall short of the best, but be better than the worst.笨鸟先飞 A slow sparrow should make an early start.不眠之夜 white…

VSCode C/C++ 分目录+多文件编译配置2

前言&#xff1a;介绍 task.json 和 launch.json 文件 task.json 和 launch.json 是用于配置 VS Code 编辑器中的任务 和 调试功能的两个重要文件。 task.json 文件用于配置任务&#xff0c;它定义了执行特定操作的任务&#xff0c;并提供了相应的命令和参数。以下是 task.js…

BERT理解

参数计算&#xff08;沐神对于bert参数计算介绍&#xff09;

【趣味随笔】移动机器人基础(导航方式、自主导航、硬件系统结构分布)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

动画制作软件 Animate 2024 mac中文版介绍说明(an2024) v24.0

Animate 2024 mac是一款动画制作软件&#xff0c;它能帮助用户轻松制作出各种精美的动画作品。 Animate 2024拥有强大而直观的设计工作流程&#xff0c;能够让用户自由地构建动画场景、绘制精美的图形&#xff0c;并轻松添加动态效果。无论是传统手绘风格还是骨骼动画&#xff…

电路综合原理与实践---单双端口理想微带线(伪)手算S参数与时域波形

电路综合原理与实践—单双端口理想微带线&#xff08;伪&#xff09;手算S参数与时域波形与时域波形 1、单理想微带线&#xff08;UE&#xff09;的S参数理论推导 参考&#xff1a;Design of Ultra Wideband Power Transfer Networks的第四章&#xff0c;之后总结推导过程 2…

华为eNSP配置专题-RIP路由协议的配置

文章目录 华为eNSP配置专题-RIP路由协议的配置0、概要介绍1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、终端构成和连接2.2、终端的基本配置 3、RIP路由的配置3.1、RIP路由的配置3.2、RIP路由的删除 华为eNSP配置专题-RIP路由协议的配置 0、概要介绍 路由信息…

2023年淘宝双十一预售红包入口介绍

2023年淘宝双十一预售红包入口介绍 近两年&#xff0c;淘宝双十一推出了预售玩法会场。在会场中&#xff0c;大家可以做预售任务&#xff0c;领取现金红包&#xff0c;让购物变得更省。那么&#xff0c;2023年淘宝双十一预售红包入口在哪里?下面小编就给大家介绍下&#xff0c…

SSM框架集成

文章目录 SSM1 介绍2 集成步骤目录结构配置 web.xml配置 jdbc.properties配置 SqlMapConfig.xml配置 applicationContext-dao.xml配置 applicationContext-service.xml配置 log4j.properties编写解决中文乱码的过滤器编写实体类编写 ItemsMapper 接口编写映射 ItemsMapper.xml编…

Power BI实现实时动态和用户输入的数据交互

背景&#xff1a;Power BI一般作为一个展示和分析数据的平台存在&#xff0c;即使是我们用Direct Query的mode也是受制于连接的数据库的表刷新&#xff0c;不能实现实时动态数据变化展示。 解决思路&#xff1a;当Power Apps里面输入了新的数据时&#xff0c;数据会写入到data…

[SWPUCTF 2023 秋季新生赛]——Web方向 详细Writeup

Web colorful_snake 来玩贪吃蛇~ F12查看源代码&#xff0c;可以看到this_is_real_flag函数&#xff0c;发现是unicode编码 利用网站转换得到flag 一键连接! 连连need <?php highlight_file(__FILE__); error_reporting(0); $md5_1 $_GET[md5_1]; $md5_2 $_GET[md5_2]; …

python实现客户成套订单配送策略混合遗传算法编码

以如下的论文文献为学习对象&#xff1a;2008年发表在《控制工程》的文献《客户成套订单配送策略混合遗传算法研究》 文献研究的学术意义 本文研究的目的是寻求在车队车辆数有限情况下 &#xff0c;如何合理安排每天的车辆 &#xff0c;使得总成本最小的方案。另外&#xff0…