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

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

      自己大大小小面试了不少企业,做过的笔试题也不少,面对的提问也是各种各样,不过对这些面试总结后还是能发现一些规律(多态,抽象类,设计模式等),由于自己每次面试后都会第一时间记录下面试中的问题,并及时补充遗漏的知识点。这里分几期来将自己面试中遇到的问题列出来并给出自己的理解,作为分享用。愿意交流的可以写下评论。谢谢!

    问题1、C与C++有什么区别?

                 C语言面向过程,C++面向对象。

                 C语言的内存分配使用的是malloc/free,C++是new/delete。(malloc与new的区别后面讲)

                 C++是C的超集,所以说C++有C没有的特性,比如继承,封装,多态。以及STL函数库还有多种设计模式,以及可以定义模板。

                 C++中有类的概念,所以会涉及到构造函数,析构函数,复制构造函数等特性。比较复杂。

                 C++中的struct具备和类一样的作用和特性,不过struct成员默认访问修饰符是public,class则是private。C中的struct仅仅只是定义了数据块在内存中存储的方式和数据类型。

                 C++有虚函数概念,重载,覆盖,重写等概念,C没有

                 C中没有引用的概念,C++有(这点有疑惑)   

 问题2、C++的特性是什么?有什么作用?

              特性是继承,封装和多态。

             继承可以扩展已存在的代码模块(类);继承有公有继承,私有继承,保护继承。不同的继承方式规则不同。请见下表

               

             外部指的是对象

    封装:封装可以隐藏实现细节,使得代码模块化。通过私有成员变量和函数来实现派生类和其对象无法访问私有成员。

    多态作用:接口重用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用, 多态分为编译时多态(重载)和运行时多态(虚函数)。也就是多态分编译时多态和运行时多态,注意的是函数的类型,参数都必须一致,这与重载有不同。

问题3、虚函数原理是什么?如何实现?实用它的场景是什么?举个例子(每次面试比然会考察到的)

   虚函数是C++多态的核心,面试必考。解决了运行时多态的问题。基类定义了虚函数后,派生类可以根据此虚函数实现自己的成员函数的实现,也就是实现了覆盖。这样基类指针指向派生类时可以调用派生类的成员函数。

      

这里也会涉及到多态的概念:

      首先多态性有两种,一种是类的多态性,实现的方式是虚函数,以及迟邦定技术(当编译器使用迟绑定时,就会在运行时再去确定对象的类型以及正确的调用函数。而要让编译器采用迟绑定,就要在基类中声明函数时使用virtual关键字)。一种是函数的多态,是指一个函数被定义成多个不同的参数的函数,到底调用哪个函数取决于指针所指的类型。这是在编译器就决定的。

 

问题4、构造函数特点是什么?里面能否调用虚函数?构造函数调用顺序是什么?

   这个问题是当时面试一家外企遇到的笔试题的变形,原题是通过代码来考察此问题。这道题其实还可以有衍生,比如构造函数中能否new本身类等。其实搞清楚基本原理,这些衍生问题都是可以分析出来的。   

       构造函数其实是在类实例化时对对象进行初始化的作用,可以重载,也可以调用虚函数,但并不实现多态。构造函数不能是虚函数,原因在于:

a、:构造函数是用来建立对象时初始化对象的,在构造函数还没调用完之前是不可能有虚函数表的,那么也就是说函数不可能是虚函数。

 b、:虚函数对应一个虚函数表,但是这个虚函数表是存储在对象的内存空间的,那么假如构造函数是虚函数,那么必须通过调用虚函数表来实现,但是这是对象还没实例化,内存空间都没有,所以构造函数是不能为虚函数的。

c、从实现上看,虚函数表在构造函数调用后才建立,因而构造函数不可能为虚函数,从实际含义上看,在调用构造函数时还不能确定对象的真实类型,而且构造函数的作用是提供初始化,在对象生命期只执行一次,不是对象的动态行为,所以也没有必要成为虚函数。  

    构造函数调用顺序是先执行基类构造函数,如果基类有虚基类先执行虚基类,其他基类按声明顺序依次执行,在执行成员对象的,最后是自己的。

 

问题5、写一个STRING类

   这个问题是一个很经典的问题,通过手写出此代码,可以考察构造函数,复制构造函数,赋值操作符,,析构函数知识点,深浅拷贝,甚至衍生到单例的懒汉,饿汉模式(后面会讲)。基本上是每次面试中都会有涉及。所以很重要。   

Class String {

               Public:

                          String(const char*str=NULL);

                          ~String(){};

                          String (const String&other);

                          String &operator=(const String&other); //赋值函数    

            Private:

                          Char*m_data;      

             }

  这个String很重要,考察了C++大部分内容,涉及到构造函数的相关知识,赋值函数的知识以及拷贝构造函数的知识。一个例子就可以举一反三,很棒的例子。

           构造函数:构造函数可以重载,但构造函数本身不能是虚函数,但是构造函数可以调用虚函数,不过不实现多态。

                  String::String(const char*str)

                 {

                      If(str==NULL)

                     {

                          m_data=new char[1];

                          If(...)//判断是否New成功

                        {

                                 //.....

                        }

                  m_data=’\0’;    

                  }

                 else

                      {

                         int length=strlen(str);

                         m_data=new char[length+1];

                         If(...)//判断是否New成功

                         {

                              //.....

                         }

                          strcpy(m_data,str);           

        }

}     

         析构函数:析构函数没有参数和返回值 ,一般来讲析构函数都是虚函数(类中有虚函数时),这样做的好处是避免析构时没有析构派生类而导致内存泄漏。 析构函数不能重载。

         String::~String()

            {

              delete []m_data;

              m_data=NULL;

         }

拷贝构造函数:拷贝构造函数在三种情况下会调用

  1. 以值传递的方式作为函数的形参
  2. 以值传递的方式作为函数的返回值
  3. 作为另一个同类对象的初始化参数

这里面还涉及到浅拷贝和深拷贝概念

    默认拷贝函数是浅拷贝

   浅拷贝会出现

深拷贝需要对拷贝构造函数进行修改,添加内存分配的过程,这样才能出现

String ::String(const String &other)

{

   int iength=strlen(&other);

   m_data=new char[length+1];

   If(...)//判断是否New成功

              {

                   //.....

              }

         strcpy(m_data,other.mdata);

}

复制构造函数出现在将一个对象赋给另一个还没实例化的对象时调用。

 

赋值函数,赋值函数出现在基于同一个类的对象都已创建,但是需要用其中一个对象赋值给另一个对象时调用赋值函数。

A a;

B b;

B=a;//这时会调用赋值函数

String&String::operator=(const String&other)

{

   if(this==other)

      {

             return this;

       }

     delete m_data;

    m_data=null;

    int length=strlen(other.m_data);

         m_data=new char[length+1];

          If(...)//判断是否New成功

              {

                   //.....

              }

         strcpy(m_data,other.m_data);

         return *this;  

}

待续。。。

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



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

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

Python绘制TSP、VRP问题求解结果图全过程

《Python绘制TSP、VRP问题求解结果图全过程》本文介绍用Python绘制TSP和VRP问题的静态与动态结果图,静态图展示路径,动态图通过matplotlib.animation模块实现动画效果... 目录一、静态图二、动态图总结【代码】python绘制TSP、VRP问题求解结果图(包含静态图与动态图