面试题总结(20230210_1)

  1. 宏定义#define和const常量的区别

(1)宏定义#define相当于字符替换,const为常量声明

(2)宏定义#define做预编译器处理,const为编译器处理

(3)宏定义#define做无类型安全检查,const做有类型安全检查

(4)宏定义#define不分配内存,const要分配内存

(5)宏定义#define存储在代码段,const存储在数据段

(6)宏定义#define可通过#undef取消,const不可以取消

  1. static的作用

(1)修饰普通变量,修改变量的存储区域和声明周期,使变量存储在静态区,在main韩束运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值那么系统就用默认值初始化它

(2)修饰普通函数,表明函数的作用范围,仅在定义该函数的文件内才能使用,在多人开发项目时,为了防止与他人命名空间的函数重名,可以将函数定义为static

(3)修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员

(4)修饰成员函数,修饰成员函数使不需要生成对象就可以访问该函数,但是在static函数内不能访问非静态成员

  1. this指针

(1)this指针是一个隐含于每一个非静态成员函数中的特殊指针,它指向调用该成员函数的那个对象

(2)当对一个对象调用成员函数时,编译程序先将对象的地址赋值给this指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用this指针

(3)当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针

(4)this指针被隐含地声明为className *const this,这意味着不能给this指针赋值;在ClassName类的const成员函数中,this指针的类型为:const ClassName * const,这说明不能对this指针所指向的这种对象是不可以修改的,即不能对这种对象的数据成员进行赋值操作

(5)this并不是一个常规变量,而是一个右值,所以不能取得this的地址,即不能&this

(6)在这三种情况下需要显式引用this指针:

实现对象的链式引用

为避免对同一对象进行赋值操作

为实现一些数据结构时,如list

  1. inline内联函数

特征:

(1)内联函数里面的内容被写在调用内联函数处

(2)不执行进入函数的步骤,直接执行函数体

(3)比宏多了类型检查,真正具有函数特性

(4)编译器一般不包含循环、递归、switch等复杂操作的内联函数

(5)在类声明中定义的函数,除了虚函数的其他函数都会自动隐式地当成内联函数

编译器对inline函数的处理步骤:

(1)将inline函数体复制到inline函数的调用点处

(2)为所用inline函数中的局部变量分配内存空间

(3)将inline函数的输入参数和返回值映射到调用方法的局部变量空间中

(4)如果inline函数有多个返回点,将其转变为inline函数代码块末尾的分支

优点:

(1)内联函数同宏函数一样将在被调用处进行代码展开,省去了参数压栈、栈帧开辟与回收,结果返回等,从而提高程序运行速度

(2)内联函数相比宏函数来说,在代码展开时,同普通函数比较,会做安全检查或自动类型转换,而宏定义则不会

(3)在类中声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问类的成员变量,宏定义不能

(4)内联函数在运行时可调式,而宏定义不可以

缺点:

(1)内联函数是以代码膨胀为代价,消除函数调用带来的开销。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获就会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间

(2)inline函数无法随着函数库升级而升级,inline函数的改变需要重新编译,不像non-inline可以直接链接

(3)内联函数只是对编译器的建议,是否对函数内联,决定权在于编译器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值