嵌入式八股-C++面试30题(20240817)

  1. C++中的引用和指针有什么区别?

    • 引用
      • 是变量的别名,一旦绑定就无法更改。
      • 不能为null,必须在定义时初始化。
      • 使用方便,语法类似直接访问变量。
    • 指针
      • 是一个变量,存储另一个变量的内存地址。
      • 可以为null,指向不同对象。
      • 可以进行算术运算,如指针加减。
  2. 什么是RAII(资源获取即初始化)?

    • RAII是一种管理资源(如内存、文件句柄等)的技术。资源在对象创建时获取,并在对象销毁时自动释放。典型的实现方式是使用构造函数和析构函数。
  3. C++中的智能指针有哪些?各自的特点是什么?

    • std::unique_ptr:独占所有权,不允许复制,生命周期结束时自动释放资源。
    • std::shared_ptr:共享所有权,多方可以共享同一资源,引用计数为0时自动释放资源。
    • std::weak_ptr:与std::shared_ptr配合使用,不增加引用计数,用于解决循环引用问题。
  4. 什么是内存对齐?如何影响性能?

    • 内存对齐是指将数据放置在满足特定边界要求的内存地址上。对齐可以提高CPU的访问效率,减少读取和写入的操作次数,提高性能。
  5. C++中的const关键字有什么用?可以修饰哪些内容?

    • 常量修饰:const用于修饰变量,使其不可修改。
    • 指针修饰:可以修饰指针自身或指针指向的内容。
    • 成员函数修饰:const成员函数不能修改成员变量。
    • 函数参数修饰:用于避免函数内部修改参数值。
  6. 解释一下什么是多重继承及其潜在问题。

    • 多重继承指一个类同时继承自多个基类。潜在问题包括:
      • 菱形继承:导致基类的多次拷贝,引发不确定性。
      • 命名冲突:不同基类中同名成员的冲突。
  7. C++中如何实现接口?与Java的接口有什么区别?

    • C++中通过纯虚函数(=0)的抽象类实现接口。
    • 与Java不同,C++中接口可以有数据成员和非虚函数,并支持多重继承。
  8. 什么是模板元编程?

    • 模板元编程(Template Metaprogramming)是在编译期间通过模板进行计算和代码生成的编程技术,常用于实现高效、通用的算法和数据结构。
  9. 解释一下C++中的异常处理机制。

    • C++通过trycatchthrow关键字实现异常处理。try块中放置可能抛出异常的代码,catch块中捕获异常并处理,throw用于抛出异常。
  10. C++中如何防止对象被拷贝?

    • 通过删除拷贝构造函数和拷贝赋值运算符,或将其设为private或protected。
    • 在C++11及更高版本中可以使用=delete来防止拷贝。
  11. 说说C++中的访问控制(public, protected, private)。

    • public:公共成员,类的外部可以访问。
    • protected:保护成员,派生类可以访问,类的外部不能访问。
    • private:私有成员,仅类自身可以访问。
  12. C++中的友元函数和友元类有什么用?

    • 友元函数和友元类可以访问类的私有成员。它们用于实现需要在多个类之间共享访问权限的操作。
  13. 什么是析构函数?它的作用是什么?

    • 析构函数在对象生命周期结束时自动调用,用于释放对象占用的资源,如内存、文件句柄等。
  14. C++中如何实现单例模式?

    • 通过私有化构造函数和拷贝构造函数,提供一个静态方法获取唯一实例。常用的实现方式包括懒汉式和饿汉式单例。
  15. 解释一下C++中的命名空间。

    • 命名空间用于组织代码,避免命名冲突。通过namespace关键字定义,使用时可以通过::访问或使用using声明。
  16. C++中的类型推导有什么用?如何使用?

    • 类型推导允许编译器自动推导变量类型,减少代码冗余,常用关键字是autodecltype
  17. 讲一下C++中的字符串处理(如std::string)。

    • std::string是C++标准库提供的字符串类,支持动态长度管理和丰富的字符串操作,如拼接、查找、替换等。
  18. C++中的虚函数表(vtable)是什么?

    • 虚函数表是实现动态多态的机制。每个含有虚函数的类都有一张虚函数表,存储该类的虚函数指针。对象通过vtable调用实际的虚函数实现。
  19. 解释一下C++中的默认参数。

    • 默认参数是在函数声明中指定的默认值,如果调用时未传递该参数,使用默认值。可以减少函数重载的数量。
  20. C++中的类型转换有哪些方式?

    • static_cast:用于基本类型转换、隐式转换的显式表达、向上转换等。
    • dynamic_cast:用于指针或引用的安全向下转换,需有虚函数。
    • const_cast:用于去掉或添加const属性。
    • reinterpret_cast:用于不安全的强制类型转换,通常在指针之间。
  21. 说说C++中的运算符重载的注意事项。

    • 重载运算符时应保持语义清晰,遵循常规运算符的行为。
    • 避免重载运算符的副作用,以免引起混淆。
    • 不允许重载某些运算符,如::..*?:
  22. C++中的动态多态和静态多态有什么区别?

    • 动态多态:通过虚函数和继承实现,在运行时决定实际调用的函数。
    • 静态多态:通过模板和函数重载实现,在编译时确定调用的函数。
  23. C++中的std::move和std::forward有何区别?

    • std::move:将对象强制转换为右值引用,常用于实现移动语义。
    • std::forward:用于保持参数的左值或右值属性,常用于转发函数模板参数。
  24. 解释一下C++中的lambda表达式的使用场景。

    • Lambda表达式用于定义匿名函数,常用于STL算法、回调函数、并发编程等场景,简化代码、提高可读性。
  25. C++中的std::bind和std::function有什么用?

    • std::bind:将函数及其参数绑定成一个可调用对象。
    • std::function:是一个通用的函数封装器,可以存储任意可调用对象(函数、lambda、bind结果等)。
  26. C++中的范围for循环是如何实现的?

    • 范围for循环使用容器的begin()end()函数遍历元素,其底层是通过迭代器实现的。
  27. C++中的std::optional是什么?有什么用?

    • std::optional是一个模板类,用于表示可能为空的对象,避免使用nullptr或异常来表示无效值。
  28. 讲一下C++11中的线程库的基本使用。

    • C++11提供了标准线程库,包含std::thread用于创建线程,std::mutex用于线程同步,std::futurestd::promise用于线程间通信。
  29. C++中的volatile关键字有什么作用?

    • volatile指示编译器不对变量进行优化,确保每次访问都直接从内存读取。常用于多线程编程和硬件寄存器编程。
  30. C++中的static_assert有什么用?

    • static_assert在编译时检查表达式是否为true,通常用于模板编程中进行类型检查和条件限制。
  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sagima_sdu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值