TpLink一面问题回顾
1,写一个C++的宏定义#define max(a,b),会有什么问题,Linux中是如何解决的,C++中一般是如何解决的呢?
答:
step1: #define max(a,b) (((a)>(b))?(a):(b))
step2:如果a=i++ 变量值会在替换的过程中自+,值会变化
不同的编译器会有不同的处理方法,这样的代码不符合标准
GCC下为了避免这样的副作用,文档中使用如下的定义:
{statement list}是一个表达式,里面可以有很多语句
#define min(X,Y) (extension ({
typeof(X) x = X,typeof(Y) __y = Y):
(x<y)?x:__y;})
C++中使用template的方法解决:
template <class type="">
type min(type a,type b)
{
return a<b?a:b;
}</class>
2,内联函数有什么优点?
答:
1,编译器在调用内联函数时,会检查类型保证其调用正确,而宏定义不会做检查
2,内联函数与普通函数相比,不同调用堆栈,返回参数等,会提高效率
3,函数重载是什么?什么区分是否是重载函数?
答:
同一作用域内,存在多个同名的函数
参数列表的参数个数 类型 顺序和函数后的const关键字是区分重载函数得参数
4,C++多态的概念,对象能否调用静态成员和静态成员函数?
答:
1,通过虚函数来实现,通过基类对象的指针指向派生类对象,在运行时实现多态
如果存在虚函数,类中会有虚指针指向虚函数表,父类和子类存放的分别是自己虚函数的入口地址。
构造函数不能是虚函数,因为虚函数通过虚指针实现,构造函数是构造对象,如果是虚函数构造是没有虚指针就不知道调用哪个虚函数
析构函数一般是虚函数,因为通过基类指针指向的对象通过基类指针析构时,调用对应的析构函数才能保证内存不泄露。
2,当然能调用静态成员和静态函数,调用方法可以通过类名::或者对象obj.函数
但是静态成员函数不能调用普通函数,因为不存在this指针
查看12道真题和解析