初学 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++ 中struct和class都能定义自定义类型,核心区别是默认访问权限和默认继承方式。
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默认public,class默认private; - 继承方式:
struct默认公有继承,class默认私有继承; - 用途习惯:
struct多用于单纯的数据聚合,class多用于封装数据和方法的对象。
总结
- 核心基础:C++ 是强类型语言,变量声明必须指定类型,指针和引用是核心特性,指针可空可重定向,引用必须初始化且不可改指向;
- 易混语法:
=是赋值、==是判断,const是类型安全的常量、#define是文本替换,函数重载仅看参数列表不看返回值; - 核心区别:
struct和class的核心差异是默认访问权限,前者默认 public,后者默认 private。
这些要点是初学 C++ 的核心,掌握并区分这些知识点,能帮你避开 80% 的新手错误,为后续学习类、继承、多态等进阶内容打下坚实基础。