https://www.nowcoder.com/tutorial/93/2a565e401f31468cabb3a378c60d5049
● 如果同时定义了两个函数,一个带const,一个不带,会有问题吗?
不会,这相当于函数的重载。
● 请你来说一说隐式类型转换
参考
对于内置类型,低精度的变量给高精度变量赋值会发生隐式类型转换
可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。
● 说说你了解的类型转换
const_cast:去除const引用对象的const
static_cast:完成基础数据类型;同一个继承体系中类型的转换;任意类型与空指针类型void* 之间的转换。
dynamic_cast:用于存在虚函数的父子关系的强制类型转换
reinterpret_cast:可以用于任意类型的指针之间的转换
● 请你来说一说C++函数栈空间的最大值
默认是1M,不过可以调整
● 请你来说一说extern“C”
参考
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言(而不是C++)的方式进行编译。
为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern "C"就是其中的一个策略。
由于CPP支持多态性,也就是具有相同函数名的函数可以完成不同的功能,CPP通常是通过参数区分具体调用的是哪一个函数。在编译的时候,CPP编译器会将参数类型和函数名连接在一起
但是在C语言中,由于完全没有多态性的概念。由于这种的原因,当采用CPP与C混合编程的时候,就可能会出问题。
● 请你回答一下new/delete与malloc/free的区别是什么
参考
1.malloc/free是C语言的库函数,new/delete是C++的操作符
2.malloc开辟空间大小需手动计算,new是由编译器自己计算
3.malloc返回类型为void*,必须强制类型转换对应类型指针,new则直接返回对应类型指针;
4.无论释放几个空间大小,free只传递指针,多个对象时delete需加[]
●请你说说你了解的RTTI
RTTI是”Runtime Type Information”的缩写,意思是运行时类型信息,它提供了运行时确定对象类型的方法。
在C++层面主要体现在dynamic_cast和typeid
对于存在虚函数的类型,typeid和dynamic_cast都会去查询type_info
● 请你说说虚函数表具体是怎样实现运行时多态的?
子类若重写父类虚函数,虚函数表中,该函数的地址会被替换
● 请你说说C语言是怎么进行函数调用的?
每一个函数调用都会分配函数栈,在栈内进行函数执行过程。
调用前,先把返回地址压栈,然后把当前函数的esp指针压栈。
● 请你说说C语言参数压栈顺序?
从右到左
● 请你说说C++如何处理返回值?
生成一个临时变量,把它的引用作为函数参数传入函数内。
——函数返回值存入内存单元,调用程序访问该内存单元,获得返回值
可以把引用作为返回值,要注意被引用的对象不能超出作用域。可以返回一个对静态变量的引用。
● 请你回答一下C++中拷贝赋值函数的形参能否进行值传递?
值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
不能。如果是这种情况下,调用拷贝构造函数的时候,首先要将实参传递给形参,这个传递的时候又要调用拷贝构造函数。。如此循环,无法完成拷贝,栈也会满。
● 请你回答一下malloc与new区别
malloc需要给定申请内存的大小,返回的指针需要强转。
new会调用构造函数,不用指定内存大小,返回的指针不用强转。
● 请你说一说select
。。。这个不懂,有待学习
● 请你说说fork,wait,exec函数
父进程产生子进程使用fork拷贝出来一个父进程的副本,此时只拷贝了父进程的页表,两个进程都读同一块内存
exec函数可以加载一个elf文件去替换父进程,从此父进程和子进程就可以运行不同的程序了。
父进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出
● 请你回答一下静态函数和虚函数的区别
静态函数在编译的时候就已经确定运行时机,虚函数在运行的时候动态绑定。
虚函数因为用了虚函数表机制,调用的时候会增加一次内存开销
● 请你说一说重载和覆盖
重载:两个函数名相同,但是参数列表不同(个数,类型),返回值类型没有要求,在同一作用域中
重写:子类继承了父类,父类中的函数是虚函数,在子类中重新定义了这个虚函数,这种情况是重写