C++八股

1 在main执行之前和之后执行的代码可能是什么?

2 结构体内存对齐问题

3 指针和引用的区别

  • 指针是一个变量,存储地址;引用跟原来的变量实质上是同一个东西,是原变量的别名
  • 指针可以有多级,引用只有一级
  • 指针可以为空,引用不能为NULL,且在定义时必须初始化
  • 指针可以改变指向,而引用在初始化之后不可再改变
  • sizeof指针得到的是本指针的大小,sizeof引用得到的是引用所指向变量的大小
  • 引用一旦初始化之后就不可以再改变;指针变量可以重新指向别的变量。
  • 当把指针作为参数进行传递时,是拷贝传参,形参和实参指向的地址相同,但不是同一个变量
  • 在汇编层面,一些编译器将引用当成指针操作,因此引用会占用空间。是否占用空间,应该结合编译器分析。

4 在传递函数参数时,什么时候该使用指针,什么时候该使用引用?

  • 需要返回函数内局部变量的内存的时候用指针,而返回局部变量的引用是没有意义的

  • 对栈空间大小比较敏感(比如递归)的时候使用引用。使用引用传递不需要创建临时变量,开销要更小

  • 类对象作为参数传递的时候使用引用,这是C++类对象传递的标准方式

5 区分指针

cpp 复制代码
int *p[10]        p是int*类型的数组
int (*p)[10]      p指向int类型的数组
int *p(int)       函数声明
int (*p)(int)     函数指针

6 宏定义和函数有何区别?

cpp 复制代码
#define MAX(a, b) ((a) > (b) ? (a) : (b))
  • 宏在预处理阶段 完成替换,之后被替换的文本参与编译,相当于直接插入了代码,运行时不存在函数调用,执行起来更快;函数调用在运行时需要跳转到具体调用函数。
  • 宏定义参数没有类型,不进行类型检查;函数参数具有类型,需要检查类型。

7 宏定义和typedef区别?

  • 宏主要用于定义常量 及书写复杂的内容;typedef主要用于定义类型别名

  • 宏替换发生在编译阶段 之前,属于文本插入替换;typedef是编译的一部分

  • 不进行类型检查 ;typedef会检查数据类型

  • typedef char * p: p是char *的别名,可用于声明变量 (p c) ,作为函数返回值;

  • #define p char *: 仅仅是在预处理时将char* 替换成p,不可用于声明变量

8 变量声明和定义区别

  • 声明仅仅是把变量的声明的位置及类型提供给编译器,并不分配内存空间;定义要在定义的地方为其分配存储空间。

  • 相同变量可以在多处声明 (外部变量extern),但只能在一处定义

  • int x; 是声明。如果x是全局或静态变量,会被默认初始化,x=0,会分配内存空间。但是, int x; 并没有显示分配内存空间,仍是声明

相关推荐
老四啊laosi10 小时前
[C++进阶] 24. 哈希表封装unordered_map && unordered_set
c++·哈希表·封装·unordered_map·unordered_set
妙为10 小时前
银河麒麟V4下编译Qt5.12.12源码
c++·qt·国产化·osg3.6.5·osgearth3.2·银河麒麟v4
java1234_小锋11 小时前
Java高频面试题:Springboot的自动配置原理?
java·spring boot·面试
xiaoye370812 小时前
Spring 中高级面试题
spring·面试
史迪仔011214 小时前
[QML] QML IMage图像处理
开发语言·前端·javascript·c++·qt
前端大波14 小时前
前端面试通关包(2026版,完整版)
前端·面试·职场和发展
会编程的土豆15 小时前
【数据结构与算法】再次全面了解LCS底层
开发语言·数据结构·c++·算法
低频电磁之道15 小时前
解决 Windows C++ DLL 导出类不可见的编译错误
c++·windows
walking95715 小时前
Vue3 日历组件选型指南:五大主流方案深度解析
前端·vue.js·面试
君义_noip17 小时前
信息学奥赛一本通 4150:【GESP2509七级】⾦币收集 | 洛谷 P14078 [GESP202509 七级] 金币收集
c++·算法·gesp·信息学奥赛·csp-s