面试真题 | C++技术点
C++ 技术点
1. 谈谈你对命名空间的理解
- namespace 是一个关键字:随着工程量的增加,变量命名上不可避免出现重名,防止名称冲突(在不同的命名空间中,即使 2 个变量名相同,也是 2 个不同的变量),在实际工作中,基本都使用标准命名空间
- 命名空间只能 全局范围内 定义,不能定义在函数内部
- 命名空间内, 可以存放 变量、函数、结构体、类;也可以嵌套其他的命名空间
- 命名空间可以 匿名(一般不这样使用),类似静态全局变量
- 命名空间是可以 起别名 的。
2. 谈谈指针与引用的区别
- 引用是给变量起别名,内部实现是指针常量 (int* const ref = &a), 其可以简单的理解为本体指针存放的是变量的地址
- 引用的本质是指针常量,其指向不可修改,而指针可以改变指向
- 引用创建的同时 必须初始化 ,指针创建的时候可以不必初始化
- 引用不能为空,指针可以为 NULL
- “引用变量 ref“的内存单元保存的是"被引用变量 a "的地址
- sizeof(引用) = 指向变量的大小;sizeof(指针) = 指针本身大大小
- 引用使用的时候无需解引用,指针需要解引用
- 指针和引用“自增/自减运算“意义不一样
- 在同等需求下,函数传参,引用可以将一级指针
3. 谈谈你对内联函数的理解
- 宏函数缺陷 1:需要将实现“加 括号”,以保证优先级的完整性
- 宏函数缺陷 2:即使加了括号,有些情况,依然有缺陷
- 内联函数本身是一个真正的函数,但宏函数不是函数
- 内联函数具有普通函数的所有行为唯一不同处:内联函数会在适当的地方像定义宏一样展开,可以以空间换时间。因此,内联函数既可以避免宏函数的缺陷,也可以避免普通函数入栈的时间浪费
- 在普通函数函数面前加上 inline 关键字,否则视为普通函数
- 如果有函数声明,函数本身和声明必须同时加 inline 关键字,否则视为普通函数
- 任何在“类”内部定义的函数会自动成为内联函数
- 下列情况,普通函数即使指定为内联函数,编译器也可能考虑不按内联编译:
- (1) 存在任何形式的循环语句
- (2) 存在过多的条件判断语句
- (3) 函数体过于庞大
- (4) 对函数进行取址操作
- 使用方法建议:
- (1) 内联仅仅只是给编译器一个建议,编译器不一定或接受这种建议
- (2) 如果你没有将函数声明为内联函数,那么编译器也可能将此函数作内联编译(一个好的编译器将会内联小的,简单的函数)。因此,不用可以使用内联函数,可以交给编译器去自行处理。
4. 谈谈函数的重载条件
- 函数重载:在 C 语言中,函数名必须是唯一的,程序中不允许出现同名的函数。在 C++ 中是允许出现同名的函数,即在同一作用域内,具有相同函数名,不同参数列表的一组函数,称为函数重载
- 函数重载实现的原理:
- 编译器为了实现函数重载,是做了一些幕后的工作,编译器用不同的参数类型来修饰不同的函数名,比如 void func(); 编译器可能会将函数名修饰成 func ,当编译器碰到 void func(int x), 编译器可能将函数名修饰为 func_int, 当编译器碰到 void func(int x,char c), 编译器可能会将函数名修饰为 func_int_char ,这里使用“可能”这个字眼是因为编译器如何修饰重载的函数名称并没有一个统一的标准,所以不同的编译器可能会产生不同的内部名。
- 函数重载实现的条件:
- 统一个作用域,参数的个数不同,参数的类型不同,参数的顺序不同
5. 谈谈 C 与 C++ 中 struct 的不同点
- C 语言中的 struct 只有数据
- C++ 中的 struct 不止有数据,还有函数
6. 如何理解 C++ 的密封性
- 封装特性主要包含两个方面,一个是属性和变量合成一个整体,一个是给属性和函数增加一个访问权限
7. 谈谈你对 C++ 构造和析构的理解
- 对象的初始化和清理也是两个非常重要的安全问题,一个对象或者变量没有初始化,对其使用后果是未知,同样的使用完一个变量,没有及时清理,也会造成一定的安全问题。 C++ 为了给我们提供这种问题的解决方案,构造函数和析构函数,这两个函数会将被编译器自动调用,完成对象初始化和对象的清理工作。
- 无论你是否喜欢,对象的初始化和清理工作是编译器强制我们要做的事情,
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
ARM/Linux嵌入式真题 文章被收录于专栏
让实战与真题助你offer满天飞!!! 每周更新!!! 励志做最全ARM/Linux嵌入式面试必考必会的题库。 励志讲清每一个知识点,找到每个问题最好的答案。 让你学懂,掌握,融会贯通,因为技术知识工作中也会用到,所以踏实学习哦!!!