C++基础学习路径(针对蓝桥杯和ROS2)

学习C++需要从基础语法开始,逐步过渡到高级特性和应用场景。以下内容适合有C语言基础的学习者,并兼顾蓝桥杯竞赛和ROS2开发需求。


基础语法强化

C++兼容C语言的绝大部分语法,但需要特别注意以下新增特性:

  • 引用类型:int& ref = var; 是变量的别名
  • 函数重载:同名函数通过参数类型/数量区分
  • 默认参数:void func(int x = 10);
  • 命名空间:namespace N { ... } 避免命名冲突

示例代码:

#include <iostream>
using namespace std;

void swap(int& a, int& b) { // 引用传递
    int tmp = a;
    a = b;
    b = tmp;
}

int main() {
    int x = 5, y = 10;
    swap(x, y);
    cout << x << " " << y << endl; // 输出:10 5
    return 0;
}


面向对象编程

C++的核心特性,必须掌握以下概念:

  • 类与对象:class MyClass { ... }; MyClass obj;
  • 构造函数/析构函数
  • 继承与多态:virtual函数和override关键字
  • 运算符重载:Vector operator+(Vector& v)

典型应用场景:

class Shape {
public:
    virtual double area() = 0; // 纯虚函数
};

class Circle : public Shape {
    double r;
public:
    Circle(double radius) : r(radius) {}
    double area() override { return 3.14*r*r; }
};


STL标准模板库

蓝桥杯高频考点,包含以下组件:

  • 容器:vector, map, set, queue
  • 算法:sort(), find(), binary_search()
  • 迭代器:vector<int>::iterator it

竞赛常用技巧:

#include <algorithm>
vector<int> v = {3,1,4,2};
sort(v.begin(), v.end()); // 快速排序
auto it = lower_bound(v.begin(), v.end(), 2); // 二分查找


内存管理

区别于C的关键能力:

  • new/delete动态内存管理
  • 智能指针:unique_ptr, shared_ptr
  • 移动语义:std::move()减少拷贝开销

ROS2相关示例:

auto node = std::make_shared<rclcpp::Node>("my_node"); // 智能指针创建ROS节点


现代C++特性(C++11/14/17)

提升开发效率的重要特性:

  • auto类型推导:auto x = 5.0;
  • Lambda表达式:[](){ /* code */ }
  • 范围for循环:for(auto& item : container)

ROS2回调函数示例:

auto callback = [](const std_msgs::msg::String::SharedPtr msg) {
    RCLCPP_INFO(node->get_logger(), "Received: %s", msg->data.c_str());
};


蓝桥杯专项训练

竞赛常见题型需要专项突破:

  • 贪心算法:区间调度、背包问题
  • DFS/BFS:迷宫问题、树形DP
  • 动态规划:最长公共子序列、01背包
  • 大数处理:高精度加减乘除

典型例题代码框架:

int dp[N][M]; // DP数组声明
memset(dp, 0, sizeof(dp)); // 初始化
for(int i=1; i<=n; i++) {
    for(int j=1; j<=m; j++) {
        dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + val[i][j];
    }
}


ROS2开发衔接

将C++应用于机器人开发的关键点:

  • 理解节点(Node)、话题(Topic)、服务(Service)概念
  • 掌握rclcpp库的基本接口
  • 熟悉消息类型定义与使用

最小ROS2节点示例:

#include "rclcpp/rclcpp.hpp"

class MyNode : public rclcpp::Node {
public:
    MyNode() : Node("minimal_node") {
        timer_ = create_wall_timer(
            std::chrono::seconds(1),
            [this]() { RCLCPP_INFO(this->get_logger(), "Hello"); });
    }
private:
    rclcpp::TimerBase::SharedPtr timer_;
};

int main(int argc, char** argv) {
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<MyNode>());
    rclcpp::shutdown();
    return 0;
}


推荐学习资源

  1. 书籍

    • 《C++ Primer》全面语法参考
    • 《算法竞赛入门经典》蓝桥杯必备
    • 《ROS2高效编程》机器人开发实战
  2. 在线平台

    • 洛谷/LeetCode算法题库
    • ROS2官方文档(https://docs.ros.org/)
    • 蓝桥杯历年真题库
  3. 开发环境

    • VSCode + C++插件
    • Ubuntu 22.04 + ROS2 Humble
    • CLion(调试竞赛代码)
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐