【转载】C++后台开发校招面试常见问题 //未完全转载

文章转自oscarwin大佬的文章
原贴链接

C和C++语言基础


extern关键字作用

  1. extern声明变量在在外部定义?
  2. extern修饰函数?
  3. extern C的作用?用法?

static关键字作用

  1. static修饰局部变量?
  2. static全局变量?(限定变量在一个编译单元内,一个编译单元就是指一个cpp和它包含的头文件,这个回答可以结合编译需要经历的几个过程来答)
  3. static修饰普通函数?
  4. static修饰成员变量?
  5. static修饰成员函数?

volatile是干啥的

  1. 访问寄存器要比访问内存要块,因此CPU会优先访问该数据在寄存器中的存储结果,但是内存中的数据可能已经发生了改变,而寄存器中还保留着原来的结果。为了避免这种情况的发生将该变量声明为volatile,告诉CPU每次都从内存去读取数据。
  2. 一个参数可以即是const又是volatile的吗?可以,一个例子是只读状态寄存器,是volatile是因为它可能被意想不到的被改变,是const告诉程序不应该试图去修改他。

说说const的作用,越多越好

  1. const修饰全局变量;
  2. const修饰局部变量;
  3. const修饰指针,const int *
  4. const修饰指针指向的对象, int * const
  5. const修饰引用做形参;
  6. const修饰成员变量,必须在构造函数列表中初始化;
  7. const修饰成员函数,说明该函数不应该修改非静态成员,但是这并不是十分可靠的,指针所指的非成员对象值可能会被改变

new与malloc区别

  1. new分配内存按照数据类型进行分配,malloc分配内存按照大小分配;
  2. new不仅分配一段内存,而且会调用构造函数,但是malloc则不会。new的实现原理?但是还需要注意的是,之前看到过一个题说int* p = new intint* p = new int()的区别,因为int属于C++内置对象,不会默认初始化,必须显示调用默认构造函数,但是对于自定义对象都会默认调用构造函数初始化。翻阅资料后,在C++11中两者没有区别了,自己测试的结构也都是为0;
  3. new返回的是指定对象的指针,而malloc返回的是void*,因此malloc的返回值一般都需要进行类型转化;
  4. new是一个操作符可以重载,malloc是一个库函数;
  5. new分配的内存要用delete销毁,malloc要用free来销毁;delete销毁的时候会调用对象的析构函数,而free则不会;
  6. malloc分配的内存不够的时候,可以用realloc扩容。扩容的原理?new没用这样操作;
  7. new如果分配失败了会抛出bad_malloc的异常,而malloc失败了会返回NULL。因此对于new,正确的姿势是采用try…catch语法,而malloc则应该判断指针的返回值。为了兼容很多c程序员的习惯,C++也可以采用new nothrow的方法禁止抛出异常而返回NULL
  8. newnew[]的区别,new[]一次分配所有内存,多次调用构造函数,分别搭配使用deletedelete[],同理,delete[]多次调用析构函数,销毁数组中的每个对象。而malloc则只能sizeof(int) * n
  9. 如果不够可以继续谈newmalloc的实现,空闲链表,分配方法(首次适配原则,最佳适配原则,最差适配原则,快速适配原则)。deletefree的实现原理,free为什么直到销毁多大的空间?

C++多态性与虚函数表

C++多态的实现?
多态分为静态多态和动态多态。静态多态是通过重载和模板技术实现,在编译的时候确定。动态多态通过虚函数和继承关系来实现,执行动态绑定,在运行的时候确定。
动态多态实现有几个条件:
(1) 虚函数;
(2) 一个基类的指针或引用指向派生类的对象;
基类指针在调用成员函数(虚函数)时,就会去查找该对象的虚函数表。虚函数表的地址在每个对象的首地址。查找该虚函数表中该函数的指针进行调用。
每个对象中保存的只是一个虚函数表的指针,C++内部为每一个类维持一个虚函数表,该类的对象的都指向这同一个虚函数表。
虚函数表中为什么就能准确查找相应的函数指针呢?因为在类设计的时候,虚函数表直接从基类也继承过来,如果覆盖了其中的某个虚函数,那么虚函数表的指针就会被替换,因此可以根据指针准确找到该调用哪个函数。
虚函数的作用?
虚函数用于实现多态,这点大家都能答上来
但是虚函数在设计上还具有封装和抽象的作用。比如抽象工厂模式。

动态绑定是如何实现的?
第一个问题中基本回答了,主要都是结合虚函数表来答就行。

静态多态和动态多态。静态多态是指通过模板技术或者函数重载技术实现的多态,其在编译器确定行为。动态多态是指通过虚函数技术实现在运行期动态绑定的技术。

虚函数表

虚函数表是针对类的还是针对对象的?同一个类的两个对象的虚函数表是怎么维护的?
编译器为每一个类维护一个虚函数表,每个对象的首地址保存着该虚函数表的指针,同一个类的不同对象实际上指向同一张虚函数表。

Last modification:September 18th, 2018 at 02:03 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment