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

C++:笔试题

1.什么是虚函数?什么是纯虚函数?

虚函数是类中的一个成员函数,使用关键字virtual在函数名前声明。

        虚函数主要目的是允许子类重写父类中的同名函数,从而实现多态性,并且子函数重写的是虚函数表中的函数。

        当通过父类的指针或引用调用虚函数时,会通过虚函数指针在虚函数表中遍历要调用的函数,若有则调用,若无则调用父类函数。

        纯虚函数:是虚函数的一种特殊形式,它在声明时没有函数体,在函数声明的末尾使用= 0。

包含纯虚函数的类被称为抽象类,抽象类不能直接实例化对象,只能作为其他类的父类。

2.基类为什么需要虚析构函数?

        这是多态的问题,当基类指针指向派生类对象时,如果基类的析构函数不是虚的,那么在删除基类指针时,只会调用基类的析构函数,而不会调用派生类的析构函数。这会导致派生类中分配的资源没有被正确释放,造成内存泄漏。

        如果基类的析构函数是虚的,那么在删除基类指针时,会先调用派生类的析构函数,然后调用基类的析构函数。这样可以确保派生类和基类中的资源都被正确释放。

3.如何初始化const和static数据成员?

        当const修饰类中成员变量时,在构造函数的初始化列表中,必须对其进行初始化工作。

const修饰普通变量,必须初始化变量。

        当static修饰类中成员变量时,在类内声明,在类外定义及初始。static修饰类的成员变量是类的一部分,不属于任何单个对象。

4.指针和引用的区别?

指针

①使用星号(*)来定义和使用指针。

②指针是一个变量,占用内存空间,它存储了另一个变量的内存地址。

③指针可以重新赋值以指向不同的对象。

④有空指针

⑤可以多级指针

引用

①使用&来定义引用。

②引用是一个别名,它为已存在的变量提供了另一个名字,不占用内存空间,与引用目标位于同一内存空间。

③引用在定义时必须被初始化,并且不能重新绑定到另一个对象。

④没有空引用

⑤没有多级引用

5.new和malloc的区别?

①malloc申请空间时,没有单个和连续空间的区别,而new申请时分单个和连续空间的操作

②malloc属于c标准库的函数,属于函数调用,而new\C++中的关键字。

③malloc申请空间不可以进行初始化,new申请空间时可以给空间进行初始化。

④malloc申请空间需要计算申请空间大小,以字节为单位申请空间,new申请空间时自动计算申请空间大小,且以数据类型为单位申请空间。

⑤使用malloc分配的内存不会调用构造函数。释放时使用free,也不会调用析构函数。

使用new分配的对象,其构造函数会被调用。当使用delete释放对象时,其析构函数也会被调用。 

6.内存泄漏怎么产生的?如何避免? 

①使用newmalloc分配的内存没有用deletefree来释放。

解决:每次使用new分配内存后,确保在不再需要内存时使用delete来释放。

②多个对象相互的引用,导致引用过深

解决:避免成员变量之间的循环引用。

③指针没有被正确初始化或指向被释放的内存,导致野指针。

解决:智能指针

④在继承中,父类析构函数中没有采用虚函数,导致父类指针指向子类堆区空间中的对象时,释放父类指针时,子类空间无法释放,导致内存泄漏

7.c++的内存分区?

全局/静态存储区:全局变量和静态变量存储在这里。在C语言中,全局变量又分为初始化的和未初始化的,分别放在数据段(data)和BSS段(bss),但在C++中没有这个区分,它们共同占用同一块内存区。这个区域的内存在程序的生命周期内几乎都是全局的 。

栈区:用于存储函数调用时的局部变量、函数参数以及返回地址。当函数调用完成后,分配给这个函数的栈空间会被释放。例如,函数内的局部变量就存放在栈区 。

堆区:用于动态内存分配。当使用new(C++)或者malloc(C)分配内存时,分配的内存块就位于堆区。程序员需要手动释放这些内存,否则可能导致内存泄漏 。

代码段:用于存储常量数据,例如字符串字面量和其他编译时常量。这个区域通常也是只读


http://www.mrgr.cn/news/37274.html

相关文章:

  • 深入理解C#中的装箱与拆箱操作及其性能影响
  • 力扣经典笔试题 最小K个数 小根堆 大根堆 快速排序 一题多解
  • 硬件设计很简单?合宙低功耗4G模组Air780E—开机启动及外围电路设计
  • 代码随想录算法训练营第四四天| 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 392.判断子序列
  • 大学生科技竞赛系统小程序的设计
  • Day 2 词汇备战
  • MySQL_插入、更新和删除数据
  • 【Python报错已解决】TypeError: list indices must be integers or slices, not str
  • [网络]数据链路层-MAC帧与ARP协议
  • java日志门面之JCL和SLF4J
  • ICM20948 DMP代码详解(46)
  • 个人文章汇总(MyBatis)
  • 解决 Adobe 盗版弹窗
  • Linux在桌面和服务器领域的最新技术趋势,包括3D桌面、虚拟技术、安全性提升等维度。
  • 11 函数的定义和使用
  • FastAPI 第五课 -- 基本路由
  • 显示技术概念极简理解(分辨率、英寸、PPI、DPI)
  • 2:数据结构:列表与元组
  • sicp每日一题[2.30]
  • Java中的注解处理器:自定义注解与APT工具的应用场景