Day2:C++ 核心(ROS 主力语言)

今日目标

  • 掌握 C++ 基础语法(变量、流程控制、函数、数组与字符串)
  • 理解并熟练使用 类与对象(构造/析构、访问控制、this 指针、静态成员)
  • 突破面试必考点:指针与引用智能指针 shared_ptr
  • 熟练使用 STL 三大容器:vector、map、set
  • 初步建立 C++ 与 ROS 开发的联系(为何 C++ 是 ROS 主力语言)

时间段 内容 目标
09:00–10:30 基础语法复习与练习 能默写变量定义、流程控制、函数定义与调用
10:45–12:00 类与对象深入 能独立写出带构造/析构的类,理解访问控制
13:30–15:00 指针与引用 能解释区别,正确使用指针/引用传参
15:15–16:30 智能指针 shared_ptr 会用 make_shared,理解引用计数机制
16:45–18:00 STL:vector / map / set 熟练增删查改,理解适用场景
19:30–21:30 综合练习 & ROS 关联案例 写一个 C++ 类模拟 ROS 节点管理资源

上午:基础语法 + 类与对象

1. 基础语法
  • 变量与类型intfloatdoublecharboolconstunsigned
  • 运算符:算术、逻辑、关系、位运算
  • 流程控制if-elseswitchforwhilebreak/continue
  • 函数
    • 声明与定义
    • 参数传递:值传递、引用传递、指针传递
    • 返回值类型(值、引用、指针)
  • 数组与字符串
    • 静态数组 int a[10];
    • C 风格字符串 char s[] = "abc";
    • std::string(推荐,ROS 中广泛使用)
2. 类与对象
  • 类定义class 关键字,public/private/protected
  • 构造/析构ClassName() 与 ~ClassName()
  • 成员函数:普通函数、const 函数
  • this 指针:指向当前对象
  • 静态成员:类级别数据共享
  • 对象创建
    • 栈对象 Obj o;
    • 堆对象 Obj* o = new Obj(); delete o;
  • ROS 联系:节点句柄、消息对象都基于类封装

下午:面试必考

1. 指针 / 引用
  • 指针
    • 定义 int* p;
    • 取地址 p = &x;
    • 解引用 *p
    • 空指针 nullptr
  • 引用
    • 定义 int& r = x;
    • 必须初始化,不能改指向
  • 区别
    • 指针可空、可改指向;引用必须绑定且不能改指向
    • 引用更安全简洁,指针更灵活
  • ROS 场景:传递大尺寸消息(激光雷达点云)时用引用避免拷贝
2. 智能指针 shared_ptr
  • 作用:自动释放内存,防止泄漏
  • 定义
    
      
    #include <memory>
    std::shared_ptr<int> p = std::make_shared<int>(100);
    
  • 引用计数use_count()
  • reset():放弃所有权
  • ROS 场景:节点中管理动态创建的消息或资源,防止回调中悬空
3. STL 容器
  • vector(动态数组):
    • 操作:push_backpop_backsize[]at
    • 适用:存储路径点、传感器帧序列
  • map(键值对,有序):
    • 操作:insertfind[]
    • 适用:参数服务器映射、话题名与回调映射
  • set(有序唯一集合):
    • 操作:insertfinderase
    • 适用:管理唯一 ID、已访问节点
  • ROS 场景:用 vector 存点云,map 存参数,set 去重目标 ID

实战练习(建议每天必做)

  1. 写一个 Point3D 类

    • 含 x, y, z 坐标(double)
    • 构造函数(默认、带参)、拷贝构造
    • 成员函数:计算与另一点距离、输出坐标
    • 使用 const 成员函数保证不修改对象
  2. 指针/引用改写函数

    • 写一个函数交换两个整数,用指针实现一次,用引用实现一次
  3. 智能指针管理对象

    • 用 shared_ptr 创建多个对象共享同一资源,观察 use_count 变化
  4. STL 操作

    • 用 vector 存 10 个随机整数并排序输出
    • 用 map 建立名字到年龄的映射并查询
    • 用 set 插入若干数字,自动去重并遍历
  5. ROS 思维迁移

    • 想象 vector<sensor_msgs::LaserScan> 存多帧激光数据
    • 用 map<string, ros::Publisher> 管理不同话题的发布器

 今日重点总结(面试可背)

  1. C++ 是 ROS 的主力语言:高性能、直接操作内存,适合实时控制与算法(SLAM、路径规划)。
  2. 指针 vs 引用:指针灵活但危险,引用安全简洁;ROS 中常用引用传大消息。
  3. shared_ptr:自动管理内存,ROS 节点/消息管理中避免泄漏与悬空指针。
  4. STL 容器选型
    • vector → 顺序存储、频繁尾部增删
    • map → 键值映射、快速查找
    • set → 唯一性保证、自动排序
  5. 类与对象是 ROS 节点与消息的基石:节点句柄、发布器、订阅器本质都是类实例。

C++ 面试题库 + 参考答案速查表

主题:基础语法 + 类与对象、指针/引用、智能指针 shared_ptr、STL(vector / map / set)
目标:10 分钟过一遍,面试对答如流


基础语法 & 类与对象

问题 概念 原理 ROS 场景 代码示例
C++ 与 ROS 的关系?为何 C++ 是主力语言? C++ 是 ROS 的核心实现语言之一(roscpp) 高性能、直接内存操作、实时性好 节点、Publisher、Subscriber、消息类型都是 C++ 类实现;适合实时控制、SLAM、路径规划 ros::NodeHandle nh; 是 C++ 类实例
类与对象在 ROS 中的应用 类封装数据与行为,对象是类的实例 构造时初始化资源,析构时释放资源 ROS 节点句柄、消息、服务都是类;节点即对象 geometry_msgs::Twist cmd; 是消息类实例
构造函数/析构函数作用 构造:初始化;析构:清理资源 C++ 对象生命周期管理 节点构造函数中初始化 Publisher;析构中注销订阅防段错误 MyNode() { pub = nh.advertise(...); } ~MyNode() { ... }
const 成员函数意义 保证函数不修改成员变量 编译器只读检查 ROS 中获取状态的 getter 函数加 const double getX() const { return x_; }

🔹 常考问题

  1. C++ 与 ROS 的关系?为什么 ROS 主力语言是 C++?

      • ROS 最初用 C++ 实现核心通信机制(roscpp),性能高、可直接操作内存和硬件,适合实时控制、SLAM、路径规划等高计算任务。
      • Python(rospy)更多用于快速原型、脚本调试,但 C++ 更适合部署到嵌入式或计算资源有限的机器人平台。
  2. 类与对象在 ROS 中的应用举例

      • ros::NodeHandleros::Publisherros::Subscriber 都是类。
      • 消息类型(如 geometry_msgs::Twist)也是类,包含成员变量和方法。
      • 节点本质是一个类的实例,在构造函数中初始化句柄、订阅器、发布器。
  3. 构造函数与析构函数的作用

      • 构造函数:对象创建时初始化资源(如打开串口、分配内存)。
      • 析构函数:对象销毁时释放资源(关闭文件、断开网络连接)。
      • ROS 中析构要注意注销订阅/发布,防止段错误。
  4. const 成员函数的意义

      • 承诺不会修改对象成员变量,保证只读安全。
      • 在 ROS 中,有些 getter 函数会加 const,比如获取当前位置坐标。

 指针 & 引用

问题 概念 原理 ROS 场景 代码示例
指针与引用的区别 指针是地址变量,引用是别名 指针可空、可改指向;引用必须初始化且不可改指向 ROS 中大消息用引用传参避免拷贝 void cb(const Msg& msg);(引用)
void cb(Msg* msg);(指针)
为何用引用传参 避免值拷贝,提高效率 直接操作原对象 激光雷达点云、图像等大消息 void process(const sensor_msgs::Image& img);
野指针与避免方法 指向已释放内存的指针 初始化为 nullptr,释放后置空,用智能指针 ROS 中裸指针管理消息易崩溃 int* p = nullptr; ... delete p; p = nullptr;

🔹 常考问题

  1. 指针和引用的区别

    • 特性 指针 引用
      可否为空 ❌(必须初始化)
      可否改指向
      语法 需解引用 *p 直接用别名
      安全性 易野指针 更安全
      内存开销 有地址存储 通常无额外开销
    • ROS 场景:大消息(如 sensor_msgs::PointCloud2)用引用传参,避免拷贝开销。
  2. 函数参数为什么用引用或指针

    • :避免值传递拷贝,提高效率;指针可传递 NULL 表示可选参数;引用可读性强。
  3. 野指针与如何避免

    • :指针指向已释放的内存。避免方法:初始化为空指针、释放后置 NULL、尽量用智能指针。

 智能指针 shared_ptr

问题 概念 原理 ROS 场景 代码示例
shared_ptr 原理 引用计数管理对象生命周期 多个 shared_ptr 共享对象,计数 0 时释放 节点中动态创建消息或资源管理 auto ptr = std::make_shared<Msg>();
常用方法 use_count()reset() use_count 查看引用数,reset 放弃所有权 多回调共享数据时保证安全 ptr.use_count(); ptr.reset();
ROS 应用 自动释放资源,防泄漏 动态消息对象、外部设备句柄管理 相机驱动对象、串口对象生命周期管理 std::shared_ptr<Camera> cam = std::make_shared<Camera>();
循环引用问题 两个 shared_ptr 互相引用 → 内存泄漏 用 weak_ptr 打破循环 复杂节点资源图需注意 std::weak_ptr<T> weak = ptr;

  常考问题

  1. shared_ptr 原理

    • :基于引用计数,多个 shared_ptr 可共享对象,计数为 0 时自动释放内存。
  2. 创建与常用方法

    
      
    auto ptr = std::make_shared<int>(10);
    ptr.use_count();  // 获取引用计数
    ptr.reset();      // 放弃所有权
    
    • make_shared 比 new 更高效(一次分配内存)。
  3. 在 ROS 中的应用场景

      • 节点中动态创建的消息对象可用 shared_ptr 管理,防止回调中悬空。
      • 管理外部资源(如相机驱动、串口对象)的生命周期,减少内存泄漏风险。
  4. 循环引用问题(拓展)

    • :两个 shared_ptr 互相引用会导致计数无法归零 → 内存泄漏。解决办法:用 weak_ptr 打破循环。

 STL(vector / map / set)

问题 概念 原理 ROS 场景 代码示例
vector 特点 动态数组、连续内存 随机访问 O(1),尾部增删 O(1) 存储路径点、激光雷达帧序列 std::vector<geometry_msgs::Point> path;
map 特点 键值对、自动排序 查找 O(log n),按键访问 参数服务器映射、话题名 ↔ 回调 std::map<std::string, ros::Publisher> pubs;
set 特点 唯一元素、自动排序 插入/查找 O(log n) 管理唯一 ID(waypoint、目标) std::set<int> visited_ids;
vector vs map 选型 顺序访问 vs 键值查找 vector cache 友好;map 插入删除快 路径点用 vector;参数映射用 map

🔹 常考问题

  1. vector 特点与使用场景

    • :动态数组,连续内存,随机访问快,尾部增删 O(1)。
    • ROS 场景:存储路径点序列、激光雷达帧序列。
  2. map 特点与使用场景

    • :键值对、自动按键排序、查找 O(log n)。
    • ROS 场景:参数服务器键值映射、话题名 ↔ 回调函数映射。
  3. set 特点与使用场景

    • :元素唯一且自动排序,查找 O(log n)。
    • ROS 场景:管理唯一 ID(如已访问的 waypoint ID)。
  4. vector 与 map 的性能差异及选型

      • 顺序访问多用 vector;键值查找多用 map。
      • vector 内存连续,cache 友好;map 红黑树实现,插入删除更快(无序时)。

 面试答题套路(四步法)

  1. 概念:一句话定义(如“shared_ptr 是 C++ 智能指针,基于引用计数”)。
  2. 原理:内部机制(如“多个 shared_ptr 指向同一对象,计数器减到 0 释放内存”)。
  3. ROS 场景:结合机器人开发举例(如“节点中管理相机对象生命周期”)。
  4. 代码:写 1~2 行关键代码证明你会用(如 auto p = std::make_shared<Msg>();)。

 速记金句(面试开场/收尾可用)

  • “C++ 在 ROS 中负责高性能实时任务,Python 更适合快速验证。”
  • “引用传参可以避免大消息拷贝,提高节点间通信效率。”
  • “shared_ptr 的引用计数机制让资源管理更安全,尤其适合 ROS 节点的动态对象。”
  • “vector、map、set 是 ROS 开发中最常用的 STL 容器,选型依据是访问模式与性能需求。”

 面试答题技巧

  • 结构化回答:先说概念 → 再说区别/原理 → 举 ROS 应用例子。
  • 结合工程:ROS 是分布式机器人系统,C++ 性能至关重要,资源管理(指针/智能指针)直接影响系统稳定性。
  • 代码演示:如果允许写代码,可现场写 shared_ptr 管理节点资源的小例子,体现实战能力。
  • 常见陷阱
    • 析构函数没注销 ROS 句柄 → 段错误
    • 用裸指针管理消息 → 悬空指针崩溃
    • vector 频繁中间插入 → 性能差,建议用 list 或 deque

    Logo

    DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

    更多推荐