算法岗位之c++部分面试准备3

  1. 如果同时定义了两个同名函数,一个带const,一个不带,会有问题吗?
    没有,这相当于函数的重载

  2. 说一说隐式类型转换
    首先,对于内置类型,低精度的变量给高精度变量赋值会发生隐式类型转换,其次,对于单个形数调用的构造函数的对象构造来说,函数调用可以直接使用该参数传入,编译器会自动调用其构造函数生成临时对象,完成从形参类型到该类类型的隐式转换。

  3. 说一说C++函数栈空间的最大值
    默认是1M,不过可以调整.

  4. 说一说extern“C”
    C++调用C函数需要extern C,因为C语言没有函数重载。

  5. new/delete与malloc/free的区别是什么
    首先,new/delete是C++的关键字,而malloc/free是C语言的库函数,后者使用必须指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数

  6. 说说你了解的RTTI
    RTTI: Runtime Type Information,运行时类型信息,它提供了运行时确定对象类型的方法.
    运行时类型检查,在C++层面主要体现在dynamic_cast和typeid,VS中虚函数表的-1位置存放了指向type_info的指针。对于存在虚函数的类型,typeid和dynamic_cast都会去查询type_info

注: RTTI提供了两个十分有用的操作符:

  • typied操作符,返回指针和应用的实际类型(比如使用typeid(a).name()就能知道变量a是什么类型的)。
  • dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。
  1. 虚函数表具体是怎样实现运行时多态的?
    子类若重写父类虚函数,虚函数表中,该函数的地址会被替换,对于存在虚函数的类的对象,在VS中,对象的对象模型的头部存放指向虚函数表的指针,通过该机制实现多态。

  2. C语言是怎么进行函数调用的?
    每一个函数调用都会分配函数栈,在栈内进行函数执行过程。调用前,先把返回地址压栈,然后把当前函数的esp指针压栈。
    注: ESP: extended stack pointer栈指针寄存器为,存放指向栈顶的指针.EBP是指向栈底的指针,在过程调用中不变,又称为帧指针

  3. C语言参数压栈顺序?
    从右向左

  4. C++如何处理返回值?
    对于非引用返回的都是临时变量,但是引用返回的不是临时变量而是这个引用。
    生成一个临时变量,把它的引用作为函数参数传入函数内。(给的答案)

  5. C++中拷贝赋值函数的形参能否进行值传递?
    不能。如果是这种情况下,调用拷贝构造函数的时候,首先要将实参传递给形参,这个传递的时候又要调用拷贝构造函数。。如此循环,无法完成拷贝,栈也会满。

  6. 回答一下malloc与new区别
    malloc需要给定申请内存的大小,返回的指针需要强制转换。

int *p;
p = (int*)malloc(sizeof(int) * 128);

new会调用构造函数,不用指定内存大小,返回的指针不用强制转换。

int *p = new int(10);
  1. 说一说select
    select在使用前,先将需要监控的描述符对应的bit位置1,然后将其传给select,当有任何一个事件发生时,select将会返回所有的描述符,需要在应用程序自己遍历去检查哪个描述符上有事件发生,效率很低,并且其不断在内核态和用户态进行描述符的拷贝,开销很大.

  2. 说说fork,wait,exec函数

  • 父进程产生子进程使用fork拷贝出来一个父进程的副本,fork后的父进程和子进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,但只有一点不同,如果fork成功,子进程中fork的返回值是0, 父进程中fork的返回值是子进程的进程号,如果fork不成功,父进程会返回错误。

  • exec函数可以加载一个elf文件去替换父进程,从此父进程和子进程就可以运行不同的程序了。

  • 调用了wait的父进程将会发生阻塞,直到有子进程状态改变,执行成功返回0,错误返回-1。exec执行成功则子进程从新的程序开始运行,无返回值,执行失败返回-1

  1. 回答一下静态函数和虚函数的区别
    静态函数在编译的时候就已经确定运行时机,虚函数在运行的时候动态绑定。虚函数因为用了虚函数表机制,调用的时候会增加一次内存开销

  2. c++程序如何编译运行

  • 预处理
    预处理可以简单理解为编译器将源码中的预处理指令(以#号开头行)转换成相应代码。如#include指令就是将#include指定的文件直接包含进来。
  • 编译
    把经过预处理生成的文件进行一系列语法分析、词法分析、语义分析优化后生成相应的汇编代码文件。
  • 汇编
    汇编代码文件转换为二进制代码文件(.o文件).
  • 目标文件与库文件进行链接
    将多个.o文件以及库文件进行链接.
  • 执行可执行文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值