初学 C++ 必须掌握的核心重点

1. 变量与数据类型:强类型语言的基础

C++ 是强类型语言,变量在使用前必须声明类型,且类型转换需要显式处理(除非是隐式安全转换)。

#include <iostream> using namespace std; int main() { // 1. 基础数据类型声明 int age = 20; // 整型,4字节(多数系统) double height = 175.5; // 浮点型,8字节 char gender = 'M'; // 字符型,1字节 bool isStudent = true; // 布尔型,1字节 // 2. 易错点:类型不匹配的隐式转换(可能丢失精度) int num1 = 10; double num2 = 3.14; int result = num1 + num2; // 隐式转换:double→int,结果为13(丢失小数部分) cout << "隐式转换结果:" << result << endl; // 正确做法:显式转换 double correctResult = (double)num1 + num2; // 显式转换int→double,结果为13.14 cout << "显式转换结果:" << correctResult << endl; return 0; } 

关键说明

  • 声明变量时必须指定类型,如int a;而非a;
  • 浮点型(float/double)转整型会直接截断小数,而非四舍五入;
  • 优先使用double而非float,精度更高且计算更稳定。
2. 指针与引用:C++ 的核心特性(新手最易懵)

指针是存储变量内存地址的变量,引用是变量的 “别名”,二者语法和用途差异极大,是初学重点也是难点。

cpp

运行

#include <iostream> using namespace std; int main() { int a = 10; // 1. 指针:用*定义,&取地址,*解引用 int* p = &a; // p存储a的地址 cout << "a的地址:" << &a << endl; cout << "指针p的值(a的地址):" << p << endl; cout << "指针解引用(a的值):" << *p << endl; *p = 20; // 修改指针指向的变量值 cout << "修改后a的值:" << a << endl; // 2. 引用:用&定义,必须初始化,不能更改指向 int& ref = a; // ref是a的别名 ref = 30; // 修改引用等价于修改a cout << "修改引用后a的值:" << a << endl; // 错误示例:引用不能空初始化,也不能重新指向 // int& ref2; // 编译报错:引用必须初始化 // int b = 50; // ref = b; // 不是更改指向,而是把b的值赋给a return 0; } 

关键说明

  • 指针声明:类型* 变量名(如int* p),引用声明:类型& 变量名(如int& ref);
  • 指针可以为空(int* p = nullptr;),引用必须绑定有效变量;
  • 指针可以重新指向其他变量,引用一旦绑定则终身指向该变量。
3. 函数重载:C++ 与 C 的核心区别之一

函数重载允许定义同名函数,只要参数列表(个数 / 类型 / 顺序)不同,返回值不同不构成重载。

cpp

运行

#include <iostream> using namespace std; // 函数重载:同名,参数类型不同 int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } // 函数重载:同名,参数个数不同 int add(int a, int b, int c) { return a + b + c; } // 错误示例:仅返回值不同,不构成重载(编译报错) // double add(int a, int b) { // return (double)a + b; // } int main() { cout << "int加法:" << add(10, 20) << endl; // 调用int版本 cout << "double加法:" << add(3.14, 2.86) << endl; // 调用double版本 cout << "三数加法:" << add(1,2,3) << endl; // 调用三参数版本 return 0; } 

关键说明

  • 函数重载的核心是 “参数列表不同”,返回值不参与重载判断;
  • 重载函数的调用由编译器根据实参类型 / 个数自动匹配;
  • C 语言不支持函数重载,C++ 通过 “名字修饰” 实现重载。

二、易混淆相似知识点的区分

1. = 赋值 vs == 相等判断

新手最易把赋值运算符=当成相等判断==,导致逻辑错误。

cpp

运行

#include <iostream> using namespace std; int main() { int a = 5; // 错误示例:if条件中用=(赋值)而非==(判断) if (a = 10) { // 实际是把a赋值为10,非0值为true,条件永远成立 cout << "错误:条件中用了赋值运算符,a=" << a << endl; } // 正确示例:用==判断相等 if (a == 10) { // 此时a已经被赋值为10,条件成立 cout << "正确:条件中用了相等判断,a=" << a << endl; } return 0; } 

区分要点

  • =:赋值运算符,作用是把右侧值赋给左侧变量,有返回值(赋值后变量的值);
  • ==:关系运算符,作用是判断左右两侧是否相等,返回布尔值(true/false);
  • 避坑技巧:把常量写在左边,如if (10 == a),若误写为if (10 = a)会直接编译报错。
2. const 常量 vs #define 宏定义

二者都能定义 “常量”,但const是编译期类型安全的,#define是预处理阶段的文本替换,无类型检查。

cpp

运行

#include <iostream> using namespace std; // 宏定义:预处理阶段替换,无类型,无作用域 #define PI 3.14 #define MAX(a,b) (a)>(b)?(a):(b) // const常量:编译期处理,有类型,有作用域 const double PI_CONST = 3.1415926; const int MAX_NUM = 100; int main() { // 1. 类型检查差异 // #define无类型:PI可以赋给任意类型变量,无警告 int pi_int = PI; // const有类型:若类型不匹配,编译器会警告 // int pi_const = PI_CONST; // 编译器警告:double转int丢失精度 // 2. 宏替换的坑(文本替换,可能导致非预期结果) int a = 3, b = 2; int res = MAX(a++, b++); // 展开为(a++)>(b++)?(a++):(b++),a和b会被多次自增 cout << "宏定义MAX结果:" << res << ",a=" << a << ",b=" << b << endl; // res=4, a=5, b=3 // 3. const作用域:仅在当前作用域有效,宏全局有效 { const int local_const = 5; cout << "局部const:" << local_const << endl; } // cout << local_const; // 编译报错:未定义的标识符 return 0; } 

区分要点

  • const:有数据类型,编译器会做类型检查,作用域受 {} 限制,占用内存;
  • #define:无数据类型,预处理阶段直接文本替换,无作用域,不占用内存;
  • 初学建议:优先使用const定义常量,避免宏替换的坑。
3. 结构体(struct)vs 类(class)

C++ 中structclass都能定义自定义类型,核心区别是默认访问权限默认继承方式

cpp

运行

#include <iostream> using namespace std; // struct:默认访问权限public struct Student { string name; // public int age; // public void showInfo() { // public cout << "Struct:姓名=" << name << ",年龄=" << age << endl; } }; // class:默认访问权限private class Teacher { string name; // private int age; // private public: // 必须显式声明public才能外部访问 void setInfo(string n, int a) { name = n; age = a; } void showInfo() { cout << "Class:姓名=" << name << ",年龄=" << age << endl; } }; int main() { // struct:成员可直接访问 Student s; s.name = "小明"; s.age = 18; s.showInfo(); // class:private成员不可直接访问,需通过public方法 Teacher t; // t.name = "李老师"; // 编译报错:private成员不可访问 t.setInfo("李老师", 35); t.showInfo(); return 0; } 

区分要点

  • 访问权限:struct默认publicclass默认private
  • 继承方式:struct默认公有继承,class默认私有继承;
  • 用途习惯:struct多用于单纯的数据聚合,class多用于封装数据和方法的对象。

总结

  1. 核心基础:C++ 是强类型语言,变量声明必须指定类型,指针和引用是核心特性,指针可空可重定向,引用必须初始化且不可改指向;
  2. 易混语法=是赋值、==是判断,const是类型安全的常量、#define是文本替换,函数重载仅看参数列表不看返回值;
  3. 核心区别structclass的核心差异是默认访问权限,前者默认 public,后者默认 private。

这些要点是初学 C++ 的核心,掌握并区分这些知识点,能帮你避开 80% 的新手错误,为后续学习类、继承、多态等进阶内容打下坚实基础。

Read more

全网最全!Python、PyTorch、CUDA 与显卡版本对应关系速查表

全网最全!Python、PyTorch、CUDA 与显卡版本对应关系速查表

摘要:搞深度学习,最痛苦的不是写代码,而是配环境! “为什么我的 PyTorch 认不出显卡?” “新买的显卡装了旧版 CUDA 为什么报错?” 本文提供一份保姆级的版本对应关系速查表,涵盖从 RTX 50 系列 (Blackwell) 到经典老卡的软硬件兼容信息。建议收藏保存,每次配环境前查一下,能省下大量的排坑时间! 🗺️ 核心逻辑图解 在看表格前,先理清显卡架构的代际关系与 CUDA 版本的强绑定逻辑。 📊 一、PyTorch 版本对照表 (推荐) PyTorch 是目前兼容性最好的框架,只要 CUDA 驱动版本 足高,通常都能向下兼容。对于使用最新硬件(如 RTX 50 系)的用户,请务必使用 2.4 或更高版本。 PyTorch 版本Python 版本推荐 CUDA适用显卡建议2.

By Ne0inhk

ROS1基础入门:从零搭建机器人通信系统(Python/C++)

文章目录 * 前言 * 一、ROS核心概念:5分钟理解机器人通信架构 * 1. 节点(Node):功能最小单元 * 2. 主节点(Master):通信调度中心 * 3. 话题(Topic):异步消息总线 * 4. 服务(Service):同步请求-响应 * 5. 参数服务器(Parameter Server):全局配置仓库 * 二、实战第一步:创建ROS工作空间 * 1. 创建目录结构 * 2. 编译空工作空间 * 3. 配置环境变量 * 4.工作空间组成 * 三、实战2:话题通信(Python/C++) * 1. Python实现(ros-noetic默认python版本为Python3,18.04的系统安装的是melodic,默认版本为Python2) * (1)发布者节点(

By Ne0inhk