C++面试常见问题总结(二)(本人面试遇到的问题记录,作为学习和交流用)

本文主要是介绍C++面试常见问题总结(二)(本人面试遇到的问题记录,作为学习和交流用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 1:C++中类在内存中的分布情况是什么?对象的内存分布是什么? 

       C++将内存分为栈,堆,自由存储区,全局/静态存储区,常量存储区。

     类在内存中的存储方式是

         第一:类的普通成员函数不占内存,静态成员函数也不占内存,存放的位置不同。

        第二:虚函数占用4个字节(32bit)

        第三:空类占一个字节

        第四:定义的私有成员变量占空间,所占空间根据其变量类型以及保证内存对齐

     这里面还会引申出一个问题就是为什么栈的速度要快过堆得速度,这是因为两者在分配内存时的方式是不同的。栈的分配有大小限制,栈是机器系统提供的数据结构,计算机会在底层对栈提供支持,分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是在可能不连续的内存间寻找合适的内存进行分配,类似于单链表形式。当然分配的空间大,需要手动释放内存。

2:malloc和new的区别

    malloc是c语言中的,单纯的分配内存,不检查是否内存分配成功。new则是C++中的,分配时对构造函数,析构,虚函数等都要分配内存空间,且会检查是否分配成功,失败返回错误码。不过new的内部实现其实也是malloc。

malloc分配内存时必须自己指定要分配的空间,new则根据类型自动分配

malloc是标准库函数,new是C++运算符,malloc不能初始化或者析构函数,这是编译器做的事。

3. C/C++程序编译的过程是什么?

    预编译,用来处理预定义,之后是编译,主要检查语法错误,编译后生成的文件进入汇编器,生成汇编文件.s,之后进入链接器,将obj文件链接起来之后生成可执行文件。这个问题面试考的不多,其实这个问题主要是为了考察在实际工作中如何能准确定位代码问题出现在哪个阶段。便于快速解决问题。

4. 静态成员函数与一般成员函数有什么区别。如何使用静态成员函数

    静态成员函数没有this指针,因为它存储在静态存储区。

    静态成员函数不能访问非静态成员函数和非静态数据成员,反之则可

    静态成员函数必须在类体外定义,否则会造成每个对象都有这个静态成员函数,那么一旦某个对象对这个函数做了修改,其他实例就会收到影响。假如两个线程都要定义这个静态成员变量或者函数,那么会造成重复定义。

    静态成员函数属于整个类,每个对象都会共享这个成员函数。在任何实例前就已经存在,也就是说这个函数只有一个,而不存在一般成员函数那样的多个内存拷贝。

注意:类的静态常量成员可以类内初始化

静态成员和静态成员函数属于类级别,也就是和类一个级别。

一般成员函数属于对象级别。

一般成员函数属于每个对象,每个对象都会有一个一般成员函数的内存拷贝。

一般成员函数都会有this指针。这是与静态成员函数最根本的区别

静态成员函数只属于类,与对象没有任何关系​​​​​​​

5,友元函数的作用和弊端

    友元函数最好不要用,破坏了类封装性,在实际开发中可能会出现误修改导致出现严重BUG 的情况。当然友元类和友元函数虽然提高了程序运行的效率(即减少了类型检查和安全性检查等都需要的时间开销)  。

     友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend
友元类 :
       友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。
      当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。

这篇关于C++面试常见问题总结(二)(本人面试遇到的问题记录,作为学习和交流用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007450

相关文章

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd