C++面试题目集合(持续跟新)

2023-11-19

与我前面写的C语言进阶知识点遥相呼应。

这才是C++面试,网上的面试题有些太简单了。

C++面试题目最多集中在对象的内存模型,记住了:如果用c/c++,内存都不清楚,还写个屁的程序!

1.C++的虚函数是怎样实现的?

      C++的虚函数使用了一个虚函数表来存放了每一个虚函数的入口地址,这个虚函数表又使用一个虚函数指针来进行访问。通常,虚函数指针都放在对象模型的第一个位置存放,这样访问徐函数指针的速度最快,没有偏移量。通过虚函数指针,找到虚函数表,进而再做一个次偏移量计算,来得到真实虚函数的入口地址,从而访问了虚函数。这样看来,访问一个虚函数将使用两次间接计算,故要失去一些时间效率。另外,使用了虚函数,那么就要消耗一些空间,存放虚函数指针。但是,这都是值得的,为了实现多态。

2. 虚函数表是每个对象一个还是每个类一个呢?

     这个事搜狗的面试题目。其实讨论过,我之前看到这个问题,立马就想到了this指针。http://topic.csdn.net/u/20081031/16/6784c211-a475-4af5-a331-c3df887a2d0c.html比较详细的讨论。

    每个类只有若干个虚拟函数表,每个对象可以有若干个虚函数表指针。(这都是在多重继承的情况下出现的。单重继承的情况下,就是一个对象有一个虚函数表指针,每一个类有一个虚函数表)函数调用的时候会将this指针作为参数发过去,所以没有必要为每一个对象做一个虚拟函数表。
     “每个类有一个或多个虚函数表,单纯的继承下来的类有一个虚函数表,虚继承下来的类就有可能有多个虚函数表(只是有可能),对象没有虚函数表,但是有指向虚函数表的指针。对象之所一能调用“自己的函数”,是因为类的成员函数不知不觉的在编译时多了一个this指针参数来识别成员数据属于哪个对象。”

    关于这个问题,在《more effective c++》中的条款24有详细叙述,的确是每一个类的一个虚函数表。至于放的的位置,书中也有讲述。

3.函数指针和指针函数的区别?

     就想通过这个问题来判断我的C水平?C语言我看的数都有三本。

    函数指针,一个指针,指向了函数的调用地址。  void (*fun)(void)

  指针函数,就是一个函数的返回值是指针。 int *  fun(void)

  这道题目我真的很冤,指针函数,我真的没有听说过。

   数组指针和指针数组我知道什么区别

4. C++ 深拷贝和浅拷贝的区别?如果要delete一个浅拷贝,需要注意什么条件?

   现在有一个指针p1指向了一个内存空间m1;

   浅拷贝就是再用一个新的指针p2指向这片内存空间m1;

   深拷贝就是用一个新的指针p3指向m1的副本m2

   delete一个浅拷贝,首先要测试是不是有其它的指针还在指向这片空间。不然,直接就是野指针了。为什么野指针那么是绝对要禁止的?野指针现在指向了一片内存区间,这片内存区间以前是有意义的,现在被释放了,操作系统可能会讲这边区间放上其它程序数据。那么,野指针仍然指向了这片区间。如果此时使用野指针,改变了这片内存的数据,那么程序应该直接崩溃。而且,这样子的崩溃可能出现,可能等一会儿出现,不定。带来的bug很难查找。

5.  dynamic_cast的用法?

http://blog.csdn.net/wingfiring/article/details/633033

作为四个内部类型转换操作符之一的dynamic_cast和传统的C风格的强制类型转换有着巨大的差别。除了dynamic_cast以外的转换,其行为的都是在编译期就得以确定的,转换是否成功,并不依赖被转换的对象。而dynamic_cast则不然。在这里,不再讨论其他三种转换和C风格的转换。
首先,dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的source对象是否真的可以转换成target类型,这种检查不是语法上的,而是真实情况的检查。
先看RTTI相关部分,通常,许多编译器都是通过vtable找到对象的RTTI信息的,这也就意味着,如果基类没有虚方法,也就无法判断一个基类指针变量所指对象的真实类型, 这时候,dynamic_cast只能用来做安全的转换,例如从派生类指针转换成基类指针.而这种转换其实并不需要dynamic_cast参与.
也就是说,dynamic_cast是根据RTTI记载的信息来判断类型转换是否合法的。

struct B1{
    virtual ~B1(){}
};
struct B2{
    virtual ~B2(){}
};
struct D1 : B1, B2{};
int main()
{
    D1 d;
    B1* pb1 = &d;
    B2* pb2 = dynamic_cast<B2*>(pb1);//L1
    B2* pb22 = static_cast<B2*>(pb1);  //L2
    return 0;
}

pb2将会为NULL指针,pb22将会编译出错。


http://baike.baidu.com/view/1745213.htm

dynamic_cast < type-id > ( expression )  

该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*;  

如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。  dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。  

在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;  

在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

http://blog.csdn.net/wingfiring/article/details/633033

dynamic_cast 确实很好地解决了我们的问题,但也需要我们付出代价,那就是与 typeid 相比,dynamic_cast 不是一个常量时间的操作。为了确定是否能完成强制类型转换,dynamic_cast`必须在运行时进行一些转换细节操作。因此在使用 dynamic_cast 操作时,应该权衡对性能的影响


5. 请阅读以下的代码,试试看,你能发现错误或者不恰当地方吗?(提示:   不止一处)
http://topic.csdn.net/t/20061129/14/5194019.html

class   Wheel{};
class   Color{};

class   Car
{
private:
    Wheel*   wheels;
public:
    Car(int   wheel_count){wheels   =   new   Wheel[wheel_count];}
    ~Car(){delete   wheels;}
};

class   Roadster   :   public   Car
{
public:
    Color   color;

    Roadster(){};
    Roadster(const   Roadster&   rs)
    {
        this-> color   =   rs.color;
    }
    ~Roadster(){};
    Roadster&   operator=(const   Roadster&   rhs)
    {
        this-> color   =   rhs.color;
    }
    const   Roadster&   clone()
    {
        Roadster   the_new   =   *this;
        return   the_new;
    }
};

int   main(int   argc,   char*   argv[]){
    Roadster*   yours   =   new   Roadster;
    Roadster   mine;     mine   =   yours-> clone();
    Car*   pCar   =   yours;
    delete   pCar;
    return   0;
}; 

修改如下:

class   Wheel{};
class   Color{};

class   Car
{
private:
    Wheel*   wheels;
    //1.   没有保存wheels的下标
    //2.   最好用vector
public:
    Car(int   wheel_count){wheels   =   new   Wheel[wheel_count];}    
    ~Car(){delete   wheels;}
    //3.   析构函数要虚拟
    //4.   delete   wheels;   ->   delete   []wheels;
    //5.   要提供拷贝构造函数
    //6.   要重载赋值操作符
};

class   Roadster   :   public   Car
{
public:
    Color   color;
    //7.   成员变量要私有

    Roadster(){};
    //8.   要调用父类的构造函数
    Roadster(const   Roadster&   rs)
    {
        this-> color   =   rs.color;
    }
    //9.   要调用父类的拷贝构造函数
    ~Roadster(){};
    //10.   析构函数要虚拟(原则:析构函数要么虚拟且公有,要么保护且非虚拟)
    Roadster&   operator=(const   Roadster&   rhs)
    {
        this-> color   =   rhs.color;
    }
    //11.   需要调用父类的赋值操作符
    //12.   没有返回值
    //13.   返回的类型最好是const   Roadster&,   而不是Roadster&
    const   Roadster&   clone()
    {
        Roadster   the_new   =   *this;
        return   the_new;
    }
    //14.   不能返回局部变量的引用
    //15.   按照这里的逻辑,   其实可以直接返回*this
};

int   main(int   argc,   char*   argv[]){
    //16.   这里的{}风格与前面的不一致
    Roadster*   yours   =   new   Roadster;
    Roadster   mine;     mine   =   yours-> clone();
    //17.   最好是一行只有一条语句,   不要两条语句放在一行
    //18.   其实这里可以直接是Roadster   mine   =   yours-> clone();
    Car*   pCar   =   yours;
    delete   pCar;
    //我认为这里是没有问题的,作为Car类的使用者,他在这里用是没有问题的,错误的只是Car类的代码
    return   0;
}; 

6.C++程序进入main函数之前,退出main函数之后会做些什么?

 
main函数执行之前,主要就是初始化系统相关资源:
1.设置栈指针
2.初始化static静态和global全局变量,即data段的内容
3.将未初始化部分的赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容
4.运行全局构造器,C++中构造函数
5.将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数

main 函数之后会执行相反的工作。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++面试题目集合(持续跟新) 的相关文章

  • InvalidOperationException - 对象当前正在其他地方使用 - 红十字

    我有一个 C 桌面应用程序 其中我连续创建的一个线程从源 实际上是一台数码相机 获取图像并将其放在 GUI 中的面板 panel Image img 上 这必须是另一个线程 如它是控件的代码隐藏 该应用程序可以工作 但在某些机器上 我会在随
  • 用于代数简化和求解的 C# 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 网络上有很多代数求解器和简化器 例如 algebra com 上不错的代数求解器和简化器 然而 我正在
  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • 为什么 gcc 抱怨“错误:模板参数 '0' 的类型 'intT' 取决于模板参数”?

    我的编译器是gcc 4 9 0 以下代码无法编译 template
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且

随机推荐

  • 详解数据架构的七类视图(多图+案例)

    数据架构是业务与应用系统建设的桥梁 数据架构基于业务架构 业务模式 流程 规则等 识别出业务数据需求 统一数据语言及操作手段 作为应用系统的应用架构 系统功能 组件 接口等 和技术架构 技术指标 技术选型等 设计和开发的依据 一 企业架构概
  • python numpy数组切片_Python NumPy 数组(Array)切片

    1 数组切片 在python中 切片意味着从一个给定索引获取元素到另一个给定索引 我们这样传切片而不是索引 start end 我们还可以这样定义step start end step 如果我们不传start 则将其视为0 如果我们不传en
  • matlab中国官网下载,首页 - MATLAB中文论坛

    阅读来自MathWorks资深工程师的技术博客 I published Round With Ties to Even a couple of days ago Steve Eddins and Daniel Dolan immediate
  • Android Spider JDAX-GUI 反编译工具下载使用以及相关技术介绍

    文章目录 前言 一 JDAX下载 二 基本使用 2 1 解压zip 2 2 Java环境 2 3 进入Dos命令窗口启动Jdax Gui 2 4 正常使用 三 常见的反编译工具以及简单分析介绍 1 Android Killer 2 Dex2
  • qsort(),sort()排序函数

    一 qsort 函数 功 能 使用快速排序例程进行排序 头文件 stdlib h 用 法 void qsort void base int nelem int width int fcmp const void const void 参数
  • 面试题六道-2022-1-6

    CopyOnWriteArrayList的底层原理是怎样的 1 首先CopyOnWriteArraylist内部也是用过数组来实现的 在向CopyOnWriteArrayLlist添加元素时 会复制一个新的数组 写操作在新数组上进行 读操作
  • 尚筹网-前台-会员系统(springboot,springcloud 实战)

    总目标 环境搭建 会员登录注册 发起众筹项目 展示众筹项目 支持众筹项目 订单 支付 1 会员系统架构 1 1 架构图 1 2 需要创建的工程 父工程 聚合工程 shangcouwang01 member parent 唯一的pom工程 注
  • 强化学习 9 —— DQN 改进算法 DDQN、Dueling DQN 详解与tensorflow 2.0实现

    上篇文章强化学习 详解 DQN 算法介绍了 DQN 算法 但是 DQN 还存在一些问题 本篇文章介绍针对 DQN 的问题的改进算法 一 Double DQN 算法 1 算法介绍 DQN的问题有 目标 Q 值 Q Target 计算是否准确
  • VUE常用UI组件插件及框架-vue前端UI框架收集

    UI组件及框架 element 饿了么出品的Vue2的web UI工具套件 mint ui Vue 2的移动UI元素 iview 基于 Vuejs 的开源 UI 组件库 Keen UI 轻量级的基本UI组件合集 vue material 通
  • Java jar包启动及停止

    此处以SpringBoot maven工程为基础 基于Windows系统 工程开发好后 打包成jar包 一 启动jar包 在包所在的目录下运行cmd命令 执行命令 java jar jar包名 二 停止 1 用管理员打开cmd命令窗口 2
  • Java安全之SSL/TLS

    在前面所讲到的一些安全技术手段如 消息摘要 加解密算法 数字签名和数据证书等 一般都不会由开发者直接地去使用 而是经过了一定的封装 甚至形成了某些安全协议 再暴露出一定的接口来供开发者使用 因为直接使用这些安全手段 对开发者的学习成本太高
  • 初学树莓派——(六)树莓派安装OpenCV及USB摄像头配置

    目录 1 安装OpenCV 1 1前言 1 2换源及源内容更新 1 3安装依赖 1 4下载whl包 1 5安装OpenCV 1 6检查安装 2 USB摄像头配置 同时检查OpenCV安装情况 2 1前言 2 2Python调用cv2库来检查
  • sem_init函数用法

    sem init函数 sem init函数是Posix信号量操作中的函数 sem init 初始化一个定位在 sem 的匿名信号量 value 参数指定信号量的初始值 pshared 参数指明信号量是由进程内线程共享 还是由进程之间共享 如
  • 最优化算法概述以及常见分类

    1 最优化问题概述 通俗的来说 最优化问题就是在一定的条件约束下 使得效果最好 最优化问题是一种数学问题 是研究在给定的约束之下如何求得某些因素的量 来使得某一指标达到最优的学科 工程设计中最优化问题的一般说法是 选择一组参数 在满足一系列
  • 数据结构笔记(六)——散列(Hash Table)之散列函数(1)

    散列表 hash table 的实现叫做散列 hashing 这是以常数平均时间O 1 进行插入 删除和查找的技术 散列表没有顺序 需要元素间排序信息的操作 如findMin findMax不会得到有效支持 就是这东西不是这么用的 你可以实
  • RocketMq顺序发送消息

    错乱消息出现的原因 1 在RocketMq为啥消息不是按照顺序来的呢 首先您需要了解 队列是一个先进先出的一个数据的结构 生产者 您可以将topic理解为里面有一个一个的队列 你将一个消息发送到topic的时候 当前的消息不一定是往当前的这
  • win 10 搭建FTP服务,并使用的FTP进行传输文件(很详细)

    1 安装IIS工具 打开控制面板 点击 程序 点击 启用或关闭Windows功能 找到 internet information services 全部都选上 如下图 点击 确定 会出现以下页面 点击 关闭 即可 2 设置开机启动FTP服务
  • 高光谱图像中的Hughes(休斯)现象

    注解 在高光谱图像的分析中 随着参与运算波段数目的增加 分类精度 先增后降 的现象 场景 高光谱影像 由于维数的大幅度增加 在深度学习中 可以理解成模型提取的特征维数的增加 导致用于参数训练的所需样本数也急剧增加 如果样本数过少 那么估计出
  • Fiddler 详尽教程与抓取移动端数据包

    转载自 http blog csdn net qq 21445563 article details 51017605 阅读目录 1 Fiddler 抓包简介 1 字段说明 2 Statistics 请求的性能数据分析 3 Inspecto
  • C++面试题目集合(持续跟新)

    与我前面写的C语言进阶知识点遥相呼应 这才是C 面试 网上的面试题有些太简单了 C 面试题目最多集中在对象的内存模型 记住了 如果用c c 内存都不清楚 还写个屁的程序 1 C 的虚函数是怎样实现的 C 的虚函数使用了一个虚函数表来存放了每