找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

C++面试常见问题整理汇总(面试者必看哦!)

admin 2019-9-9 09:53 103人围观 C++相关



1. 继承方式

public      父类的访问级别不变
protected    父类的public成员在派生类编程protected,其余的不变
private        父类的所有成员变成private
    #include<iostream>usingnamespacestd;classbase{public:voidprinta(){ cout <<"base"<< endl; }protected:voidprinthello(){ cout <<"helo"<< endl; }private:voidprintnohello(){ cout <<"no hello"<< endl; }};classderived :public base{public:voidprintb(){ printhello(); }// void printc() { printnohello(); } //printnohello是父类的私有函数,不可访问};intmain(){ base a; a.printa();//a.printhello(); //printhello是类derived的protected函数,不可访问。}
    2. sizeof 和 strlen 的区别

    ① sizeof 是一个操作符,strlen 是库函数。
    ② sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为‘\ 0‘的字符串作参数。
    ③ 编译器在编译时就计算出了sizeof 的结果。而strlen 函数必须在运行时才能计算出来。并且 sizeof计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。
    ④ 数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了。
      #include<iostream>#include<cstdlib>#include<cstring>usingnamespacestd;intmain(){int a[] = {1, 2, 3, 4, 5};cout << sizeof(a) << endl; //20// cout << strlen(a) << endl;char b[] = {'a', 'b'};cout << strlen(b) << endl; //6cout << sizeof(b) << endl; //2}
      3. C中的 malloc 和C++中的 new 有什么区别

      new、delete 是操作符,可以重载,只能在 C++中使用。
      malloc、free 是函数,可以覆盖,C、C++中都可以使用。
      new  可以调用对象的构造函数,对应的 delete 调用相应的析构函数。
      malloc 仅仅分配内存,free 仅仅回收内存,并不执行构造和析构函数
      new、delete 返回的是某种数据类型指针,malloc、free 返回的是 void 指针。

      注意:malloc 申请的内存空间要用 free 释放,而 new 申请的内存空间要用 delete 释放,不要混用。

      因为两者实现的机理不同。



      4.简述C\C++程序编译的内存情况分配

      C、C++中内存分配方式可以分为三种:

      (1)从静态存储区域分配:内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static变量等。
      (2)在栈上分配:在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
      (3)从堆上分配:即动态内存分配。程序在运行的时候用 malloc 或 new 申请任意大小的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活。如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

      一个 C、C++程序编译时内存分为 5 大存储区:堆区、栈区、全局区、文字常量区、程序代码区。

      5. 面向对象的三大特征

      ① 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
      ② 继承,是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”和“组合”来实现。
      ③ 多态,简单的说,就是一句话:允许将指向子类类型的指针赋值给父类类型的指针。实现多态,有二种方式,覆盖,重载。

      覆盖,是指子类重新定义父类的虚函数的做法。
      重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

      总结:作用

      ① 封装可以隐藏实现细节,使得代码模块化
      ② 继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用
      ③ 多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。

      6. 简述多态的实现原理

      编译器发现一个类中有虚函数,便会立即为此类生成虚函数表vtable。虚函数表的各表项为指向对应虚函数的指针。编译器还会在此类中隐含插入一个指针 vptr指向虚函数表。调用此类的构造函数时,在类的构造函数中,编译器会隐含执行 vptr 与 vtable 的关联代码,将 vptr 指向对应的 vtable,将类与此类的 vtable 联系了起来。另外在调用类的构造函数时,指向基础类的指针此时已经变成指向具体的类的 this 指针,这样依靠此 this 指针即可得到正确的 vtable。

      如此才能真正与函数体进行连接,这就是动态联编,实现多态的基本原理。

      注意:一定要区分虚函数,纯虚函数、虚拟继承的关系和区别。牢记虚函数实现原理,因为多态C++面试的重要考点之一,而虚函数是实现多态的基础。

      7. c++空类的成员函数

      缺省的构造函数
      缺省的拷贝构造函数
      缺省的赋值运算符
      缺省的析构函数
      缺省的取址运算符
      缺省的取址运算符const

      注意:只有当实际使用这些函数的时候,编译器才会去定义它们。

      8. 谈谈你对拷贝构造函数和赋值运算符的认识

      两个不同之处:

      ① 拷贝构造函数生成新的类对象,而赋值运算符不能。
      ② 由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新建对象相同。而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配要先把内存释放掉。

      注意:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认的。

      9. extern 有什么作用

      extern 标识的变量或者函数声明其定义在别的文件中,提示编译器遇到此变量和函数时在其它模块中寻找其定义。

      10. 引用和指针区别

      ① 引用必须被初始化,但是不分配存储空间。指针不必在声明时初始化,在初始化的时候需要分配存储空间
      ② 引用初始化以后不能被改变,指针可以改变所指的对象
      ③ 不存在指向空值的引用,但是存在指向空值的指针









      它,

      不仅仅是一个码

      扫码关注

      C++资源免费送

      ----------------------------------------------------------------------------------------------------------------------
      我们尊重原创,也注重分享,文章来源于微信公众号:轻松学C语言,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
      ----------------------------------------------------------------------------------------------------------------------

      鲜花

      握手

      雷人

      路过

      鸡蛋

      yafeilinux和他的朋友们微信公众号二维码

      微信公众号

      专注于Qt嵌入式Linux开发等。扫一扫立即关注。

      Qt开源社区官方QQ群二维码

      QQ交流群

      欢迎加入QQ群大家庭,一起讨论学习!

      我有话说......