ROS 机器人工程师30 天突击学习计划(超详细・日更版)第二天--C++
ROS 工程师30 天突击学习计划(超详细・日更版)第二天C++
·
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. 基础语法
- 变量与类型:
int、float、double、char、bool、const、unsigned - 运算符:算术、逻辑、关系、位运算
- 流程控制:
if-else、switch、for、while、break/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_back、pop_back、size、[]、at - 适用:存储路径点、传感器帧序列
- 操作:
- map(键值对,有序):
- 操作:
insert、find、[] - 适用:参数服务器映射、话题名与回调映射
- 操作:
- set(有序唯一集合):
- 操作:
insert、find、erase - 适用:管理唯一 ID、已访问节点
- 操作:
- ROS 场景:用
vector存点云,map存参数,set去重目标 ID
实战练习(建议每天必做)
-
写一个 Point3D 类
- 含 x, y, z 坐标(double)
- 构造函数(默认、带参)、拷贝构造
- 成员函数:计算与另一点距离、输出坐标
- 使用
const成员函数保证不修改对象
-
指针/引用改写函数
- 写一个函数交换两个整数,用指针实现一次,用引用实现一次
-
智能指针管理对象
- 用
shared_ptr创建多个对象共享同一资源,观察use_count变化
- 用
-
STL 操作
- 用
vector存 10 个随机整数并排序输出 - 用
map建立名字到年龄的映射并查询 - 用
set插入若干数字,自动去重并遍历
- 用
-
ROS 思维迁移
- 想象
vector<sensor_msgs::LaserScan>存多帧激光数据 - 用
map<string, ros::Publisher>管理不同话题的发布器
- 想象
今日重点总结(面试可背)
- C++ 是 ROS 的主力语言:高性能、直接操作内存,适合实时控制与算法(SLAM、路径规划)。
- 指针 vs 引用:指针灵活但危险,引用安全简洁;ROS 中常用引用传大消息。
- shared_ptr:自动管理内存,ROS 节点/消息管理中避免泄漏与悬空指针。
- STL 容器选型:
vector→ 顺序存储、频繁尾部增删map→ 键值映射、快速查找set→ 唯一性保证、自动排序
- 类与对象是 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_; } |
🔹 常考问题
-
C++ 与 ROS 的关系?为什么 ROS 主力语言是 C++?
- 答:
- ROS 最初用 C++ 实现核心通信机制(roscpp),性能高、可直接操作内存和硬件,适合实时控制、SLAM、路径规划等高计算任务。
- Python(rospy)更多用于快速原型、脚本调试,但 C++ 更适合部署到嵌入式或计算资源有限的机器人平台。
- 答:
-
类与对象在 ROS 中的应用举例
- 答:
ros::NodeHandle、ros::Publisher、ros::Subscriber都是类。- 消息类型(如
geometry_msgs::Twist)也是类,包含成员变量和方法。 - 节点本质是一个类的实例,在构造函数中初始化句柄、订阅器、发布器。
- 答:
-
构造函数与析构函数的作用
- 答:
- 构造函数:对象创建时初始化资源(如打开串口、分配内存)。
- 析构函数:对象销毁时释放资源(关闭文件、断开网络连接)。
- ROS 中析构要注意注销订阅/发布,防止段错误。
- 答:
-
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; |
🔹 常考问题
-
指针和引用的区别
- 答:
特性 指针 引用 可否为空 ✅ ❌(必须初始化) 可否改指向 ✅ ❌ 语法 需解引用 *p直接用别名 安全性 易野指针 更安全 内存开销 有地址存储 通常无额外开销 - ROS 场景:大消息(如
sensor_msgs::PointCloud2)用引用传参,避免拷贝开销。
- 答:
-
函数参数为什么用引用或指针
- 答:避免值传递拷贝,提高效率;指针可传递 NULL 表示可选参数;引用可读性强。
-
野指针与如何避免
- 答:指针指向已释放的内存。避免方法:初始化为空指针、释放后置 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; |
常考问题
-
shared_ptr 原理
- 答:基于引用计数,多个
shared_ptr可共享对象,计数为 0 时自动释放内存。
- 答:基于引用计数,多个
-
创建与常用方法
auto ptr = std::make_shared<int>(10); ptr.use_count(); // 获取引用计数 ptr.reset(); // 放弃所有权make_shared比new更高效(一次分配内存)。
-
在 ROS 中的应用场景
- 答:
- 节点中动态创建的消息对象可用
shared_ptr管理,防止回调中悬空。 - 管理外部资源(如相机驱动、串口对象)的生命周期,减少内存泄漏风险。
- 节点中动态创建的消息对象可用
- 答:
-
循环引用问题(拓展)
- 答:两个
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 | — |
🔹 常考问题
-
vector 特点与使用场景
- 答:动态数组,连续内存,随机访问快,尾部增删 O(1)。
- ROS 场景:存储路径点序列、激光雷达帧序列。
-
map 特点与使用场景
- 答:键值对、自动按键排序、查找 O(log n)。
- ROS 场景:参数服务器键值映射、话题名 ↔ 回调函数映射。
-
set 特点与使用场景
- 答:元素唯一且自动排序,查找 O(log n)。
- ROS 场景:管理唯一 ID(如已访问的 waypoint ID)。
-
vector 与 map 的性能差异及选型
- 答:
- 顺序访问多用 vector;键值查找多用 map。
- vector 内存连续,cache 友好;map 红黑树实现,插入删除更快(无序时)。
- 答:
面试答题套路(四步法)
- 概念:一句话定义(如“shared_ptr 是 C++ 智能指针,基于引用计数”)。
- 原理:内部机制(如“多个 shared_ptr 指向同一对象,计数器减到 0 释放内存”)。
- ROS 场景:结合机器人开发举例(如“节点中管理相机对象生命周期”)。
- 代码:写 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
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)