【C/C++笔试练习】new和deleted底层原理、静态数据成员、运算符重载、只能使用new创建的类、模版声明、另类加法、走方格的方案数

文章目录

  • C/C++笔试练习
  • 选择部分
    • (1)new和deleted底层原理
    • (2)静态数据成员
    • (3)运算符重载
    • (4)程序分析
    • (5)静态数据成员
    • (6)只能使用new创建的类
    • (7)模版声明
  • 编程题
    • (8)另类加法
    • (9)走方格的方案数

C/C++笔试练习

选择部分

(1)new和deleted底层原理

  C++语言中,类ClassA的构造函数和析构函数的执行次数分别为()

ClassA *pclassa=new ClassA[5];
delete pclassa

  A. 5,1
  B. 1,1
  C. 5,5
  D. 1,5

   答案选:A

  
   对于扩容和释放空间的函数和操作符,C/C++一般提供了这三种:

   1.malloc/realloc/realloc/free

   最基本的扩容函数,一般扩容以字节为大小的空间。
  

   2.new/delete

   C++引入的新的扩容操作符,new T一般是这样实现的:

   <1>new调用operator new(size)来申请空间,operator new使用malloc来循环申请空间;
   <2>new再申请完空间之后,会调用T的类构造函数初始化空间。

  
   和free类似,delete用来释放new申请的空间:

   <1>delete先调用析构函数释放new p指向对象中的资源;
   <2>接着调用operator delete释放p所指的空间,最后使用free清理空间。

   注意:new和delete只能申请和释放单个元素的空间,如果要创建多个对象,就要使用new[]了。一定要配合使用,否则会有内存泄漏问题。

  
   3.new[]/delete[]

   new T[N]:

   <1>new[]调用operator new(size)来申请空间,operator new使用malloc来循环申请空间;
   <2>new[]再申请完空间之后,会调用N次T的类构造函数初始化空间。

   delete[] p;

   <1>delete[]先调用N次析构函数释放new p指向的N个对象中的资源;
   <2>接着调用operator delete释放p所指的空间,最后使用free清理空间。

  
   所以这个问题的答案选择A,即类ClassA的构造函数和析构函数的执行次数分别为5和1。因为在代码中,使用new ClassA[5]创建了5个ClassA对象,这将调用5次ClassA的构造函数。然后,使用delete pclassa释放了这5个对象,这将调用一次ClassA的析构函数。 因此,类ClassA的构造函数执行了5次,析构函数执行了1次。所以答案选A。但是这样使用不匹配,可能造成内存泄漏。

  

(2)静态数据成员

  下列静态数据成员的特性中,错误的是()

  A. 引用静态数据成员时,要在静态数据成员名前加<类名>和作用域符号
  B. 说明静态数据成员时前边要加关键字static来修饰
  C. 静态数据成员在类体外进行初始化
  D. 静态数据成员不是所有对象所共有的

   答案选:D

  
  静态成员变量:

  所有对象共享,并不属于具体的某个对象,静态成员变量需要在类中声明然后需要在类外单独进行定义,一定不能在构造函数初始化列表的位置初始化。

  在类外访问静态成员变量的时候可以使用: 对象.静态成员变量 或 类名::静态成员变量。

// 通过类名直接访问静态成员变量  
int MyClass::staticVar;  // 通过对象名访问静态成员变量  
MyClass obj;  
int var = obj.staticVar;

  

  引用静态数据成员时,需要在静态数据成员名前添加类名和作用域符号。 这是正确的,所以选项A是正确的。

  静态数据成员在定义时需要使用static关键字进行修饰。 这是正确的,所以选项B是正确的。

  静态数据成员在类体外进行初始化。 这是正确的,所以选项C是正确的。

  静态数据成员是所有对象共享的, 它们不属于任何一个特定的对象实例。因此,选项D是错误的。

  

(3)运算符重载

  在重载一个运算符为成员函数时,其参数表中没有任何参数,这说明该运算符是 ( )

  A. 无操作数的运算符
  B. 二元运算符
  C. 前缀一元运算符
  D. 后缀一元运算符

   答案选:C

  重载成员函数,虽然参数中没有任何参数,但是每个非静态成员函数都有一个隐含的this指针。

   注意一下这个前缀一元运算符:

Date& operator++()   //前置++
Date operator++(int) //后置++

   所以当重载一个运算符为成员函数时,如果该运算符的参数表中没有任何参数,那么说明该运算符是一个一元运算符。 此外,如果该运算符是前缀形式的,那么在参数表中应该有一个空的参数列表;如果该运算符是后缀形式的,那么在参数列表中应该有一个非空的参数列表。因此,选项C是正确的答案。

  

(4)程序分析

#include<iostream>
using namespace std;class MyClass{
public:MyClass(int i=0){cout<<1;}MyClass(const MyClass&x){cout<<2;}MyClass& operator=(const MyClass&x){cout<<3; return*this;}~MyClass(){cout<<4;}
};int main(){MyClass obj1(1),obj2(2),obj3(obj1);return 0;
}

  运行时的输出结果是

  A. 121,444
  B. 112,444
  C. 11,114,444
  D. 11,314,445
  E. 11,314,444

   答案选:B

   在C++中,一个类的构造函数、析构函数以及赋值运算符都可以被重载。这些函数在类的对象进行某些特定操作时会被自动调用。

   这个程序中定义了一个类MyClass,并重载了构造函数、拷贝构造函数、拷贝赋值运算符和析构函数。

   构造函数:当你创建一个类的对象时,构造函数会被调用。这里的构造函数有两个参数,一个默认参数0,和一个常量引用参数x,用于拷贝构造。

   拷贝构造函数:当一个类对象被另一个类对象初始化时,拷贝构造函数会被调用。这个函数有一个常量引用参数x,输出为2。

   拷贝赋值运算符:当使用一个类的对象给另一个同类对象赋值时,拷贝赋值运算符会被调用。这个函数有一个常量引用参数x,输出为3,并且返回当前对象的引用。

   析构函数:当一个类对象被销毁时,析构函数会被调用。这个函数没有参数,输出为4。

   在main函数中,首先创建了两个对象obj1和obj2,分别输出1和2。然后创建了一个新的对象obj3,使用obj1作为初始化参数,这会调用拷贝构造函数,所以输出为11。最后程序结束,所有对象被销毁,所以输出为444。

   所以整个程序的输出应该是112444,答案选B。

在这里插入图片描述

  

(5)静态数据成员

  下面有关c++静态数据成员,说法正确的是()

  A. 不能在类内初始化
  B. 不能被类的对象调用
  C. 不能受private修饰符的作用
  D. 可以直接用类名调用

   答案选:D

   C++的静态数据成员可以在类内初始化,也可以在类外初始化,因此选项A错误。

   静态数据成员是类的所有对象共享的数据,因此可以通过对象调用, 因此选项B错误。

   静态数据成员需要在类外定义和初始化,并且只能被类的对象调用,因此选项D正确。

   静态数据成员可以受private修饰符的作用,因此选项C错误。

  

(6)只能使用new创建的类

  在C++中,为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该()

  A. 将构造函数设为私有
  B. 将析构函数设为私有
  C. 将构造函数和析构函数均设为私有
  D. 没有办法能做到

   答案选:B

  
  如果将构造函数私有,则在创建A类对象的时候,new会<1>申请空间,<2>调用构造函数,但是构造函数是私有的,就无法调用构造函数了, 也就不可以new对象,所以将构造函数私有无法实现。

  但是如果将析构函数私有,在创建A类对象的时候,就可以顺利调用构造函数进行初始化了,只是在delete和析构的时候,无法正常析构。

  怎么解决无法正常析构问题?给A类增加一个公有方法,即可:

void Release(A* &p)
{delete p;
}

  

(7)模版声明

//下列的模板声明中,其中几个是正确的()
1)template
2)template<T1,T2>
3)template<class T1,T2>
4)template<class T1,class T2>
5)template<typename T1,T2>
6)template<typename T1,typename T2>
7)template<class T1,typename T2>
8)<typename T1,class T2>

  A. 2
  B. 3
  C. 4
  D. 5

   答案选:B

  
  对于C++模板的声明,正确的模板声明应该遵循以下格式:

  template <class T1, class T2>

  template <class T1, class T2>其中,T1和T2是模板类型参数。在模板参数列表中,class关键字是可选的

  根据上述规则,以下模板声明是正确的:

  template 错误,没有类型

  template<T1,T2> 错误,缺少类型关键字

  template<class T1,T2> 错误,第二个参数缺少类型关键字

  template<typename T1,T2> 错误,第二个参数缺少类型关键字

  <typename T1,class T2> - 错误,没有模版说明

  所以,正确的应该是2,6,7。

            

编程题

(8)另类加法

另类加法

  本题可以通过位运算实现,具体实现如下:

  两个数求和,其实就是 求和后当前位的数据+两个数求和的进位

  例如:
  1 + 2: 00000001 + 00000010求和后当前位的数据: 00000011 ; 求和后的进位数据: 没有进位,则 00000000两者相加,则得到: 00000011 就是3

  2 + 2: 00000010 + 00000010求和后当前位的数据: 00000000; 1和1进位后当前为变成0了,求和后进位的数据: 00000100, 两个1求和后进位了相加后得到: 00000100 就是4

  求和后当前位的数据:简便的计算方法就是两个数进行异或 00000001 ^ 00000010 -> 00000011

  求和后进位的数据:简便的计算方法就是两个数相与后左移一位 (00000010 & 00000010) << 1

class UnusualAdd {public:int addAB(int A, int B) {if (A == 0) return B;if (B == 0) return A;int a = A ^ B;//求和后当前位的数据int b = (A & B) << 1;//求和后进位的数据return addAB(a, b);//递归两个数进行相加,任意为0时截止}
};

  

(9)走方格的方案数

走方格的方案数

  本题为求取路径总数的题目,一般可以通过递归求解,对于复杂的问题,可以通过动态规划求解。也可以通过递归解答。

#include<iostream>
using namespace std;int pathNum(int n, int m) 
{if (n > 1 && m > 1)return pathNum(n - 1, m) + pathNum(n, m - 1);else if (((n >= 1) && (m == 1)) || ((n == 1) && (m >= 1)))return n + m;elsereturn 0;
}int main() 
{int n, m;while (cin >> n >> m) {cout << pathNum(n, m) << endl;}return 0;
}

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

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

相关文章

【Qt】QMainWidget中的栏和菜单

默认结构最复杂的标准窗口 提供了菜单栏, 工具栏, 状态栏, 停靠窗口菜单栏: 只能有一个, 创建的最上方工具栏: 可以有多个, 默认提供了一个, 窗口的上下左右都可以停靠状态栏: 只能有一个, 窗口最下方停靠窗口: 可以有多个, 默认没有提供, 窗口的上下左右都可以停靠 菜单栏 在…

【实战Flask API项目指南】之六 数据库集成 SQLAlchemy

实战Flask API项目指南之 数据库集成 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 在上一篇文章中&#xff0c;我们实现了…

day53【子序列】1143.最长公共子序列 1035.不相交的线 53.最大子序和

文章目录 1143. 最长公共子序列1035.不相交的线53. 最大子序和 1143. 最长公共子序列 题目链接&#xff1a;力扣链接 讲解链接&#xff1a;代码随想录讲解 题意&#xff1a;给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 …

微信自动回复有什么好处?怎么设置?

微信自动回复有什么好处&#xff1f; 首先&#xff0c;它可以帮助我们节省时间和精力。当我们无法立即回复消息时&#xff0c;自动回复可以及时告知对方我们的状况&#xff0c;避免对方的焦虑和不便。 其次&#xff0c;自动回复可以增强沟通效率。无论是工作还是个人生活中&a…

gtsam初探以及结合LIO-SAM算法的一些理解

概述 GTSAM&#xff08;Georgia Tech Smoothing and Mapping&#xff09;是基于因子图的C库&#xff0c;本篇基于GTSAM对因子图优化做一个简单了解和梳理&#xff0c;并以LIO-SAM为例进一步分析因子图优化在SLAM中的应用。 参考链接&#xff1a; [0]gtsam官方文档 [1]https:/…

最小化安装移动云大云操作系统--BCLinux-R8-U2-Server-x86_64-231017版

有个业务系统因为兼容性问题&#xff0c;需要安装el8.2的系统&#xff0c;因此对应安装国产环境下的BCLinuxR8U2系统来满足用户需求。BCLinux-R8-U2-Server是中国移动基于AnolisOS8.2深度定制的企业级X86服务器通用版操作系统。本文记录在DELL PowerEdge R720xd服务器上最小化安…

Redis-分布式锁

Redis-setnx实现分布式锁 Redis实现分布式锁主要利用Redis的setnx命令。setnx是SET if not exists(如果不存在&#xff0c;则SET)的简写。(NX是互斥、EX是设置超时时间) 但是如上会面临一个问题&#xff0c;当业务执行时间太长&#xff0c;导致业务还没执行完锁已到期&#xf…

学习笔记二十九:K8S配置管理中心Configmap实现微服务配置管理

Configmap概述 Configmap概述Configmap能解决哪些问题&#xff1f;Configmap应用场景局限性 Configmap创建方法命令行直接创建通过文件创建指定目录创建configmap 编写configmap资源清单YAML文件使用Configmap通过环境变量引入&#xff1a;使用configMapKeyRef通过环境变量引入…

Azure机器学习 - 在 Azure 机器学习中上传、访问和浏览数据

目录 一、环境准备二、设置内核三、下载使用的数据四、创建工作区的句柄五、将数据上传到云存储空间六、访问笔记本中的数据七、创建新版本的数据资产八、清理资源 机器学习项目的开始阶段通常涉及到探索性数据分析 (EDA)、数据预处理&#xff08;清理、特征工程&#xff09;以…

Java语法 - 01

Java基础 Java 是一种广泛使用的高级编程语言&#xff0c;最初由Sun Microsystems于1995年发布。它被设计为具有简单、可移植和面向对象的特性&#xff0c;以满足跨平台应用程序开发的需求。以下是一些关于 Java 的简介&#xff1a; 跨平台性&#xff1a;Java 程序可以在不同…

基于QT的简易计算器(一)

目录 0 简介1.设计原理1.1界面设计1.1.1界面基本布局1.1.2 界面调整和美化1.1.2 控件重命名 1.2 连接信号和槽1.3 软件逻辑1.3.1四则运算1.3.2 连续运算&#xff08;不完全&#xff09;的原理1.3.3 清屏1.3.4 退格1.3.5 等于1.3.6 小数点 2.总结与拓展 0 简介 最近在学QT&…

Django实战项目-学习任务系统-自定义URL拦截器

接着上期代码框架&#xff0c;6个主要功能基本实现&#xff0c;剩下的就是细节点的完善优化了。 首先增加URL拦截器&#xff0c;你不会希望没有登录用户就可以进入用户主页各种功能的&#xff0c;所以增加URL拦截器可以解决这个问题。 Django框架本身也有URL拦截器&#xff0…

【Python入门二】安装第三方库(包)

安装第三方库/包 1 使用pip安装2 使用PyCharm软件安装3 离线安装&#xff0c;使用whl文件安装参考 在Python中&#xff0c;有多种安装第三方库的方法&#xff0c;下面是一些常用的方法&#xff1a; 1 使用pip安装 pip是Python中最常用的包管理工具&#xff0c;也是最常用的在线…

代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集

背包问题 说到背包问题大家都会想到使用动规的方式来求解,那么为什么用动规呢,dp数组代表什么呢?初始化是什么,遍历方式又是什么,这篇文章笔者将详细讲解背包问题的经典例题0-1背包问题和完全背包问题的解题方式,希望能帮助到大家 1.暴力方式 有人一提到背包问题就只会使用动态…

OpenGL ES入门教程(一)编写第一个OpenGL程序

OpenGL ES入门教程&#xff08;一&#xff09;编写第一个OpenGL程序 前言 从本文开始我将参考学习OpenGL ES应用开发实践指南 Android卷 [&#xff08;美&#xff09;KevinBrothaler著]&#xff08;提取码: 394m&#xff09;&#xff0c;并基于自己的理解以更加通俗易懂的方式…

近独立粒子的最概然分布

近独立粒子&#xff1a;粒子之间相互作用微弱基本粒子中&#xff0c;自旋量子数为半整数的有 电子 、 质子 、中子、中微子自旋量子数为整数的有 光子、pi介子 经典力学描述系统的微观运动状态 经典力学中&#xff0c;全同粒子可以分辨量子力学&#xff0c;全同粒子不可以分辨微…

2023-11-02 LeetCode每日一题(环和杆)

2023-11-02每日一题 一、题目编号 2103. 环和杆二、题目链接 点击跳转到题目位置 三、题目描述 总计有 n 个环&#xff0c;环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。 给你一个长度为 2n 的字符串 rings &#xff0c;表示这 n 个环在…

BetterDisplay Pro v1.4.15(显示器管理管理软件)

BetterDisplay Pro是一款屏幕显示优化工具&#xff0c;可用于Windows和Mac操作系统。它可以帮助用户调整屏幕的亮度、对比度、色彩等参数&#xff0c;以获得更好的视觉体验。此外&#xff0c;BetterDisplay Pro还提供了一些额外的功能&#xff0c;如屏幕分割、窗口管理、快捷键…

Django3框架-(3)-[使用websocket]:使用channels实现websocket功能;简化的配置和实际使用方式

概述&#xff1a; 对于Django使用channels实现websocket的功能&#xff0c;之前就写了几篇博文了。随着在项目的使用和实际维护来说&#xff0c;重新设置了相关处理方法。 一般来说&#xff0c;前后端都只维护一个全局的连接&#xff0c;通过携带数据来判断具体的操作&#x…

Flink1.18新特性生产环境应用的重点解读!

大家好&#xff0c;我是你们的群主王知无呀。 Flink 1.18已经于近期发布了。在这个新版本中新增了很多新的功能和特性。在这些特性中&#xff0c;有一些是生产环境非常重要的能力&#xff0c;大家在使用过程中可以重点参考和了解其中的原理。 算子级别状态保留时间TTL设置 首先…