当前位置: 首页 > news >正文

【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. 初始化列表&#xff08;1&#xff09;只能在列表初始化的变量 2.构造函数&#xff08;2&#xff09;函数体赋值&#xff08;3&#xff09;构造函数的概念&#xff08;4&#xff09;构造函数调用次数&#xff08;5&#xff09;构造函数调用次数&#xff…...

分享 | 对 电商API 平台的再思考

API 是推动现代企业数字化转型的基础。它不但连接了内部应用程序、合作伙伴和客户&#xff0c;同时也快速持续地向市场提供了各种新产品、版本和功能。 但当下还是以集中式的 API 交付为主。一个企业的对外 API 交付过程通常都是冗余而繁琐的&#xff0c;对企业内部的敏捷性、速…...

C语言--程序环境和预处理

前言 本章就是c语言的最后一个板块了&#xff0c;学完这章节&#xff0c;我们将知道写出的代码如何变成可执行程序的&#xff0c;这是非常重要的一个章节&#xff0c;那让我们一起进入本章的学习吧。 本章重点&#xff1a; 程序的翻译环境程序的执行环境详解&#xff1a;C语言程…...

深度学习笔记_5 经典卷积神经网络LeNet-5 解决MNIST数据集

1、定义LeNet-5模型&#xff0c;包括卷积层和全连接层。 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…...

国内智能客服机器人都有哪些?

随着人工智能技术的不断发展&#xff0c;智能客服机器人已经成为了企业客户服务的重要工具。国内的智能客服机器人市场也迎来了飞速发展&#xff0c;越来越多的企业开始采用智能客服机器人来提升客户服务效率和质量。 在这篇文章中&#xff0c;我将详细介绍国内知名的智能客服机…...

Matlab/C++源码实现RGB通道与HSV通道的转换(效果对比Halcon)

HSV通道的含义 HSV通道是指图像处理中的一种颜色模型&#xff0c;它由色调&#xff08;Hue&#xff09;、饱和度&#xff08;Saturation&#xff09;和明度&#xff08;Value&#xff09;三个通道组成。色调表示颜色的种类&#xff0c;饱和度表示颜色的纯度或鲜艳程度&#xf…...

【C进阶】动态内存管理

一、为什么存在动态内存分配 我们之前学的都是开辟固定大小的空间&#xff0c;但有时候需要空间的大小只有在程序运行时才能知道&#xff0c;那么就引入了动态内存开辟 内存分布所在&#xff1a; 二、动态内存函数的介绍 2.1malloc和free 动态内存开辟的函数 void * malloc…...

神经网络的梯度优化方法

神经网络的梯度优化是深度学习中至关重要的一部分&#xff0c;它有助于训练神经网络以拟合数据。下面将介绍几种常见的梯度优化方法&#xff0c;包括它们的特点、优缺点以及原理。 梯度下降法 (Gradient Descent): 特点: 梯度下降是最基本的优化算法&#xff0c;它试图通过迭代…...

linux 装机教程(自用备忘)

文章目录 安装 pyenv 管理多版本 python 环境安装使用使用 pyenv 和 virtualenv 管理虚拟 python 环境 vscode 连接远程服务器tmux 美化zsh 安装 pyenv 管理多版本 python 环境 安装 &#xff08;教程参考&#xff1a;https://www.modb.pro/db/155036&#xff09; sudo apt-…...

Tensorboard安装及简单使用

Tensorboard 1. tensorboard 简单介绍2. 安装必备环境3. Tensorboard安装4. 可视化命令 1. tensorboard 简单介绍 TensorBoard是一个可视化的模块&#xff0c;该模块功能强大&#xff0c;可用于深度学习网络模型训练查看模型结构和训练效果&#xff08;预测结果、网络模型结构…...

SpringCloud 微服务全栈体系(二)

第三章 Eureka 注册中心 假如我们的服务提供者 user-service 部署了多个实例&#xff0c;如图&#xff1a; 思考几个问题&#xff1a; order-service 在发起远程调用的时候&#xff0c;该如何得知 user-service 实例的 ip 地址和端口&#xff1f;有多个 user-service 实例地址…...

flutter 常用组件:列表ListView

文章目录 总结#1、通过构造方法直接构建 ListView 提供了一个默认构造函数 ListView,我们可以通过设置它的 children 参数,很方便地将所有的子 Widget 包含到 ListView 中。 不过,这种创建方式要求提前将所有子 Widget 一次性创建好,而不是等到它们真正在屏幕上需要显示时才…...

十四天学会C++之第七天:STL(标准模板库)

1. STL容器 什么是STL容器&#xff0c;为什么使用它们。向量&#xff08;vector&#xff09;&#xff1a;使用向量存储数据。列表&#xff08;list&#xff09;&#xff1a;使用列表实现双向链表。映射&#xff08;map&#xff09;&#xff1a;使用映射实现键值对存储。 什么…...

Linux 下安装 miniconda,管理 Python 多环境

安装 miniconda 1、下载安装包 Miniconda3-py37_22.11.1-1-Linux-x86_64.sh&#xff0c;或者自行选择版本 2、把安装包上传到服务器上&#xff0c;这里放在 /home/software 3、安装 bash Miniconda3-py37_22.11.1-1-Linux-x86_64.sh 4、按回车 Welcome to Miniconda3 py37…...

Django和jQuery,实现Ajax表格数据分页展示

1.需求描述 当存在重新请求接口才能返回数据的功能时&#xff0c;若页面的内容很长&#xff0c;每次点击一个功能&#xff0c;页面又回到了顶部&#xff0c;对于用户的体验感不太友好&#xff0c;我们希望当用户点击这类的功能时&#xff0c;能直接加载到数据&#xff0c;请求…...

k8s认证

1. 证书介绍 服务端保留公钥和私钥&#xff0c;客户端使用root CA认证服务端的公钥 一共有多少证书&#xff1a; *Etcd&#xff1a; Etcd对外提供服务&#xff0c;要有一套etcd server证书Etcd各节点之间进行通信&#xff0c;要有一套etcd peer证书Kube-APIserver访问Etcd&a…...

基于python开发的IP修改工具

工作中调试设备需要经常修改电脑IP&#xff0c;非常麻烦&#xff0c;这里使用Pythontkinter做了一个IP修改工具 说明: 1.启动程序读取config.json文件2.如果没有该文件则创建&#xff0c;写入当前网卡信息3.通过配置信息进行网卡状态修改4.更新文件状态&#xff0c;删除或修…...

Mybatis源码分析

1. Mybatis整体三层设计 SSM中&#xff0c;Spring、SpringMVC已经在前面文章源码分析总结过了&#xff0c;Mybatis源码相对Spring和SpringMVC而言是的简单的&#xff0c;只有一个项目&#xff0c;项目下分了很多包。从宏观上了解Mybatis的整体框架分为三层&#xff0c;分别是基…...

python树结构包treelib入门及其计算应用

树是计算机科学中重要的数据结构。例如决策树等机器学习算法设计、文件系统索引等。创建treelib包是为了在Python中提供树数据结构的有效实现。 Treelib的主要特点包括&#xff1a; 节点搜索的高效操作。支持常见的树操作&#xff0c;如遍历、插入、删除、节点移动、浅/深复制…...

Rust之自动化测试(三): 测试组合

开发环境 Windows 10Rust 1.73.0 VS Code 1.83.1 项目工程 这里继续沿用上次工程rust-demo 测试组合 正如本章开始时提到的&#xff0c;测试是一个复杂的学科&#xff0c;不同的人使用不同的术语和组织。Rust社区根据两个主要类别来考虑测试:单元测试和集成测试。单元测试很…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...