c++面试技术点整理

本文详细探讨了C++中的关键概念和技术,包括命名空间、指针与引用的区别、内联函数的理解、函数重载条件、C与C++中struct的不同点、C++的密封性、构造和析构函数、浅拷贝与深拷贝的区别,以及static成员变量和函数、this指针、友元的理解。此外,还讨论了内存管理、多态、动态绑定、虚函数表和析构函数的重要性,以及如何避免内存泄漏。文章深入浅出,旨在帮助读者掌握C++面试中的核心知识点。
摘要由CSDN通过智能技术生成

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++ 为了给我们提供这种问题的解决方案,构造函数和析构函数,这两个函数会将被编译器自动调用,完成对象初始化和对象的清理工作。
  • 无论你是否喜欢,对象的初始化和清理工作是编译器强制我们要做的事情,即使你不提供初始化操作和清理操作,编译器也会给你增加默认的操作,只是这个默认初始化不会做任何事,所以编写类就应该顺便提供初始化函数。
  • 构造函数主要作用在于创建对象时为对象的成员属性赋值。析构函数由编译器自动调用,无须手动调用。主要用于对象销毁前系统自动调用,执行一些清理工作。

8. 构造函数的分类

  • 按参数类型:分为无参构造函数和有参构造函数
  • 按类型分类:普通构造函数和拷贝构造函数(复制构造函数)

9. 构造函数的调用规则

  • 默认情况下,C++ 编译器至少为我们写的类增加 3 个函数:默认构造函数(无参,函数体为空)、默认析构函数(无参,函数体为空)、默认拷贝构造函数,对类中非静态成员属性简单拷贝
  • 如果用户定义构造函数, C++ 不会再提供任何默认构造函数;如果用户定义了普通构造(非拷贝), C++ 不再提供默认无参构造,但是会提供默认拷贝构造。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值