-
如果同时定义了两个同名函数,一个带const,一个不带,会有问题吗?
没有,这相当于函数的重载 -
说一说隐式类型转换
首先,对于内置类型,低精度的变量给高精度变量赋值会发生隐式类型转换,其次,对于单个形数调用的构造函数的对象构造来说,函数调用可以直接使用该参数传入,编译器会自动调用其构造函数生成临时对象,完成从形参类型到该类类型的隐式转换。 -
说一说C++函数栈空间的最大值
默认是1M,不过可以调整. -
说一说extern“C”
C++调用C函数需要extern C,因为C语言没有函数重载。 -
new/delete与malloc/free的区别是什么
首先,new/delete是C++的关键字,而malloc/free是C语言的库函数,后者使用必须指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数 -
说说你了解的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操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。
-
虚函数表具体是怎样实现运行时多态的?
子类若重写父类虚函数,虚函数表中,该函数的地址会被替换,对于存在虚函数的类的对象,在VS中,对象的对象模型的头部存放指向虚函数表的指针,通过该机制实现多态。 -
C语言是怎么进行函数调用的?
每一个函数调用都会分配函数栈,在栈内进行函数执行过程。调用前,先把返回地址压栈,然后把当前函数的esp指针压栈。
注: ESP: extended stack pointer栈指针寄存器为,存放指向栈顶的指针.EBP是指向栈底的指针,在过程调用中不变,又称为帧指针 -
C语言参数压栈顺序?
从右向左 -
C++如何处理返回值?
对于非引用返回的都是临时变量,但是引用返回的不是临时变量而是这个引用。
生成一个临时变量,把它的引用作为函数参数传入函数内。(给的答案) -
C++中拷贝赋值函数的形参能否进行值传递?
不能。如果是这种情况下,调用拷贝构造函数的时候,首先要将实参传递给形参,这个传递的时候又要调用拷贝构造函数。。如此循环,无法完成拷贝,栈也会满。 -
回答一下malloc与new区别
malloc需要给定申请内存的大小,返回的指针需要强制转换。
int *p;
p = (int*)malloc(sizeof(int) * 128);
new会调用构造函数,不用指定内存大小,返回的指针不用强制转换。
int *p = new int(10);
-
说一说select
select在使用前,先将需要监控的描述符对应的bit位置1,然后将其传给select,当有任何一个事件发生时,select将会返回所有的描述符,需要在应用程序自己遍历去检查哪个描述符上有事件发生,效率很低,并且其不断在内核态和用户态进行描述符的拷贝,开销很大. -
说说fork,wait,exec函数
-
父进程产生子进程使用fork拷贝出来一个父进程的副本,fork后的父进程和子进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,但只有一点不同,如果fork成功,子进程中fork的返回值是0, 父进程中fork的返回值是子进程的进程号,如果fork不成功,父进程会返回错误。
-
exec函数可以加载一个elf文件去替换父进程,从此父进程和子进程就可以运行不同的程序了。
-
调用了wait的父进程将会发生阻塞,直到有子进程状态改变,执行成功返回0,错误返回-1。exec执行成功则子进程从新的程序开始运行,无返回值,执行失败返回-1
-
回答一下静态函数和虚函数的区别
静态函数在编译的时候就已经确定运行时机,虚函数在运行的时候动态绑定。虚函数因为用了虚函数表机制,调用的时候会增加一次内存开销 -
c++程序如何编译运行
- 预处理
预处理可以简单理解为编译器将源码中的预处理指令(以#号开头行)转换成相应代码。如#include指令就是将#include指定的文件直接包含进来。 - 编译
把经过预处理生成的文件进行一系列语法分析、词法分析、语义分析优化后生成相应的汇编代码文件。 - 汇编
汇编代码文件转换为二进制代码文件(.o文件). - 目标文件与库文件进行链接
将多个.o文件以及库文件进行链接. - 执行可执行文件