LeetCode C++基础面试题汇总附答案(一)

目录

前言

面试题及答案

1. 请简述智能指针原理

2. 引用和指针有什么区别?

3. const 和 define 有什么区别?

4. define 和 inline 有什么区别?

5. malloc 和 new 有什么区别?

6. C++ 中 static 关键字作用有哪些?

7. C++ 中 const 关键字作用有哪些?

8. C++ 中成员函数能够同时用 static 和 const 进行修饰?

9. C++ 中包含哪几种强制类型转换?他们有什么区别和联系?

10. 简述 C++ 虚函数作用及底层实现原理

11. 一个对象访问普通成员函数和虚函数哪个更快?


前言

        这里整理了leetCode C++的基础面试第一部分,希望对大家有所帮助


面试题及答案

1. 请简述智能指针原理


智能指针是一种资源管理类,通过对原始指针进行封装,在资源管理对象进行析构时对指针指向的内存进行释放;通常使用引用计数方式进行管理


2. 引用和指针有什么区别?


本质:引用是别名,指针是地址
具体的:
• 指针可以在运行时改变其所指向的值,引用一旦和某个对象绑定就不再改变
• 从内存上看,指针会分配内存区域,而引用不会,它仅仅是一个别名
• 在参数传递时,引⽤用会做类型检查,而指针不会
• 引用不能为空,指针可以为空


3. const 和 define 有什么区别?


本质:define只是字符串替换,const参与编译运行
具体的:
• define不会做类型检查,const拥有类型,会执行相应的类型检查
• define仅仅是宏替换,不占⽤用内存,⽽而const会占用内存
• const内存效率更高,编译器通常将const变量保存在符号表中,而不会分配存储空间,这使得它成 为一个编译期间的常量,没有存储和读取的操作



4. define 和 inline 有什么区别?


本质:define只是字符串替换,inline由编译器控制
具体的:
• define只是简单的宏替换,通常会产生二义性;而inline会真正地编译到代码中
• inline函数是否展开由编译器决定,有时候当函数太大时,编译器可能选择不展开相应的函数


5. malloc 和 new 有什么区别?


答案参考:基础面试题:C++中new和malloc的区别


6. C++ 中 static 关键字作用有哪些?


1. 隐藏:当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏.
2. static的第二个作用是保持变量内容的持久:存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围, 说到底static还是用来隐藏的。虽然这种用法不常见
3. static的第三个作用是默认初始化为0(static变量)
4. C++中的作用
1)不能将静态成员函数定义为虚函数。
2)静态数据成员是静态存储的,所以必须对它进行初始化。 (程序员手动初始化,否则编译时一般不会报错,但是在Link时会报错误)
3)静态数据成员在<定义或说明>时前面加关键字static。


7. C++ 中 const 关键字作用有哪些?


- 修饰变量
- 修饰成员函数,表示该成员函数不会修改成员变量


8. C++ 中成员函数能够同时用 static 和 const 进行修饰?


否,因为static表示该函数为静态成员函数,为类所有;而const是用于修饰成员函数的,两者相矛盾


9. C++ 中包含哪几种强制类型转换?他们有什么区别和联系?


- reinterpret_cast: 转换一个指针为其它类型的指针。它也允许从一个指针转换为整数类型,反之亦 然. 这个操作符能够在非相关的类型之间转换. 操作结果只是简单的从一个指针到别的指针的值的 二进制拷贝. 在类型之间指向的内容不做任何类型的检查和转换?
class A{};
class B{};
A* a = new A;
B* b = reinterpret_cast(a);
• static_cast: 允许执行任意的隐式转换和相反转换动作(即使它是不允许隐式的),例如:应用到类 的指针上, 意思是说它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换), 同 时, 也能够执行相反动作: 转换父类为它的子类 class Base {};
class Derive:public Base{};
Base* a = new Base;
Derive *b = static_cast(a);*
*• dynamic_cast: 只用于对象的指针和引用. 当用于多态类型时,它允许任意的隐式类型转换以及相 反过程. 不过,与static_cast不同,在后一种情况里(注:即隐式转换的相反过程),dynamic_cast 会检查操作是否有效. 也就是说, 它会检查转换是否会返回一个被请求的有效的完整对象。检测在 运行时进行. 如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL. 对于引用 类型,会抛出bad_cast异常*
*• const_cast: 这个转换类型操纵传递对象的const属性,或者是设置或者是移除,例如:*
*class C{};*
*const C* a = new C;
C *b = const_cast(a);


10. 简述 C++ 虚函数作用及底层实现原理


要点是要答出虚函数表和虚函数表指针的作用。C++中虚函数使用虚函数表和 虚函数表指针实现,虚函数表是一个类的虚函数的地址表,用于索引类本身以及父类的虚函数的地 址,假如子类的虚函数重写了父类的虚函数,则对应在虚函数表中会把对应的虚函数替换为子类的 虚函数的地址;虚函数表指针存在于每个对象中(通常出于效率考虑,会放在对象的开始地址处), 它指向对象所在类的虚函数表的地址;在多继承环境下,会存在多个虚函数表指针,分别指向对应 不同基类的虚函数表。


11. 一个对象访问普通成员函数和虚函数哪个更快?


访问普通成员函数更快,因为普通成员函数的地址在编译阶段就已确定,因此在访问时直接调 用对应地址的函数,而虚函数在调用时,需要首先在虚函数表中寻找虚函数所在地址,因此相比普 通成员函数速度要慢一些

参考:链接:https://leetcode.cn/leetbook/read/da-han-hou-duan-gang-ti-mu-he-ji-shang/nlfox5/

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值