归纳总结 C++ 的核心语法体系,掌握 C++ 编程的基础,建立清晰的语法框架,区分不同版本的特性,并理解各语法点的适用场景。以下是从基础到进阶的 C++ 语法完整归纳,兼顾实用性和系统性。
一、C++ 语法核心体系(按学习逻辑划分)
1. 基础语法(C++98/03 核心)
1.1 程序结构与基本要素
cpp
运行
#include <iostream> // 头文件引入
using namespace std; // 命名空间使用(避免重复写std::)
// 主函数:程序入口,返回int类型
int main() {
// 输出语句(分号结束)
cout << "Hello, C++" << endl;
return 0; // 程序正常退出返回0
}
- 核心规则 :
- 语句以
;结尾,代码块用{}包裹; - 大小写敏感(
int a和int A是不同变量); - 注释:单行
//,多行/* ... */。
- 语句以
1.2 数据类型
表格
| 类别 | 具体类型 | 说明 |
|---|---|---|
| 基本类型 | int/float/double |
整型 / 单精度浮点 / 双精度浮点 |
char/bool |
字符型(1 字节)/ 布尔型 | |
| 修饰符 | short/long/long long |
短整型 / 长整型 / 超长整型 |
unsigned/signed |
无符号 / 有符号(默认 signed) | |
| 复合类型 | 数组、指针、引用 | 基于基本类型扩展 |
| 自定义类型 | 结构体 (struct)、枚举 (enum) |
用户自定义类型 |
示例:
cpp
运行
// 基本类型
int age = 20;
double score = 95.5;
char ch = 'A';
bool isOk = true;
// 数组
int arr[5] = {1, 2, 3, 4, 5}; // 固定长度数组
// 指针(存储内存地址)
int* p = &age; // p指向age的地址
*p = 21; // 解引用,修改age的值为21
// 引用(变量的别名,必须初始化)
int& ref = age;
ref = 22; // age也变为22
1.3 控制流语句
-
条件语句:
cpp
运行
// if-else if (age > 18) { cout << "成年" << endl; } else if (age == 18) { cout << "刚成年" << endl; } else { cout << "未成年" << endl; } // switch(适合多分支等值判断) switch (score / 10) { case 10: case 9: cout << "优秀"; break; // break避免穿透 case 8: cout << "良好"; break; default: cout << "及格/不及格"; } -
循环语句:
cpp
运行
// for循环(适合已知循环次数) for (int i = 0; i < 5; i++) { cout << i << " "; // 输出:0 1 2 3 4 } // while循环(适合未知循环次数) int num = 10; while (num > 0) { num--; } // do-while(至少执行一次) do { cout << "至少执行一次" << endl; } while (false); // 循环控制:break(终止循环)、continue(跳过本次) for (int i = 0; i < 5; i++) { if (i == 2) continue; // 跳过i=2 if (i == 4) break; // 终止循环 cout << i << " "; // 输出:0 1 3 }
1.4 函数
cpp
运行
// 函数声明(原型):返回值 函数名(参数列表)
int add(int a, int b);
// 函数定义:实现逻辑
int add(int a, int b) {
return a + b;
}
// 函数调用
int result = add(3, 5); // result=8
// 重载函数:同名不同参数(参数个数/类型/顺序不同)
double add(double a, double b) {
return a + b;
}
// 带默认参数的函数(默认参数放最后)
int multiply(int a, int b = 2) {
return a * b;
}
multiply(3); // 3*2=6
multiply(3, 4); // 3*4=12
2. 面向对象(OOP)核心语法(C++ 核心特性)
2.1 类与对象
cpp
运行
// 类定义:封装属性和方法
class Person {
private: // 私有(仅类内部访问,默认private)
string name;
int age;
public: // 公有(对外暴露的接口)
// 构造函数:创建对象时初始化,无返回值,与类同名
Person(string n, int a) : name(n), age(a) {} // 初始化列表(推荐)
// 析构函数:销毁对象时调用,释放资源,~+类名,无参数无返回值
~Person() {
cout << "对象销毁" << endl;
}
// 成员方法
void showInfo() {
cout << "姓名:" << name << " 年龄:" << age << endl;
}
// 友元函数:突破封装,可访问私有成员(全局函数)
friend void printPerson(Person p);
};
// 友元函数实现
void printPerson(Person p) {
cout << "友元访问:" << p.name << " " << p.age << endl;
}
// 对象创建与使用
Person p1("张三", 20); // 栈对象
p1.showInfo();
printPerson(p1);
Person* p2 = new Person("李四", 25); // 堆对象(需手动释放)
p2->showInfo();
delete p2; // 释放堆内存,调用析构函数
2.2 继承与多态
cpp
运行
// 继承:子类复用父类代码,语法:class 子类 : 继承方式 父类
// 继承方式:public(公有的继承)、protected(保护的)、private(私有的,默认)
class Student : public Person {
private:
int score;
public:
// 子类构造函数:先调用父类构造
Student(string n, int a, int s) : Person(n, a), score(s) {}
// 重写父类方法(多态基础)
void showInfo() override { // override关键字:显式重写,编译器检查
cout << "姓名:" << name << " 年龄:" << age << " 分数:" << score << endl;
}
// 静态成员:属于类,所有对象共享
static int count; // 声明
};
// 静态成员初始化(类外)
int Student::count = 0;
// 多态:父类指针/引用指向子类对象,调用子类重写的方法
// 前提:父类方法加virtual(虚函数)
// 修改Person类的showInfo为虚函数:
// virtual void showInfo() { ... }
Person* ptr = new Student("王五", 18, 90);
ptr->showInfo(); // 调用Student的showInfo(多态效果)
delete ptr;
// 纯虚函数与抽象类:纯虚函数=0,抽象类不能实例化,子类必须重写
class Shape {
public:
virtual double getArea() = 0; // 纯虚函数
};
class Circle : public Shape {
private:
double r;
public:
Circle(double r) : r(r) {}
double getArea() override {
return 3.14 * r * r;
}
};
3. 进阶语法(C++11 及以上)
3.1 智能指针(解决内存泄漏)
cpp
运行
#include <memory> // 头文件
// unique_ptr:独占所有权,不能拷贝
unique_ptr<int> up(new int(10));
// unique_ptr<int> up2 = up; // 错误:不能拷贝
up.reset(); // 释放资源
// shared_ptr:共享所有权,引用计数
shared_ptr<int> sp1(new int(20));
shared_ptr<int> sp2 = sp1; // 引用计数=2
cout << sp1.use_count() << endl; // 输出2
sp1.reset(); // 引用计数=1
sp2.reset(); // 引用计数=0,释放资源
// make_shared(推荐:更高效)
auto sp3 = make_shared<int>(30);
3.2 自动类型推导
cpp
运行
// auto:编译器推导类型(必须初始化)
auto a = 10; // int
auto b = 3.14; // double
auto c = make_shared<int>(5); // shared_ptr<int>
// decltype:推导表达式类型
int x = 10;
decltype(x) y = 20; // y是int
3.3 范围 for 循环
cpp
运行
vector<int> vec = {1, 2, 3, 4, 5};
// 遍历容器,无需关心下标
for (auto num : vec) {
cout << num << " ";
}
// 引用遍历(修改元素)
for (auto& num : vec) {
num *= 2;
}
3.4 Lambda 表达式(匿名函数)
cpp
运行
// 语法:[捕获列表](参数列表) -> 返回值类型 { 函数体 }
// 捕获列表:[]无捕获、[=]值捕获、[&]引用捕获、[this]捕获当前对象
auto add = [](int a, int b) -> int {
return a + b;
};
cout << add(3, 5) << endl; // 8
// 捕获外部变量
int base = 10;
auto addBase = [base](int a) {
return a + base;
};
cout << addBase(5) << endl; // 15
3.5 空指针与 nullptr
cpp
运行
// C++11前用NULL(本质是0),易混淆
int* p = NULL;
// C++11用nullptr(专门的空指针类型)
int* q = nullptr;
4. 容器与算法(STL 核心)
cpp
运行
#include <vector> // 动态数组
#include <map> // 键值对
#include <algorithm> // 算法
// vector:动态数组,自动扩容
vector<int> vec;
vec.push_back(1); // 添加元素
vec.push_back(2);
vec.pop_back(); // 删除最后一个元素
cout << vec[0] << endl; // 访问元素
// map:有序键值对,基于红黑树
map<string, int> mp;
mp["张三"] = 20;
mp["李四"] = 25;
// 遍历map
for (auto& pair : mp) {
cout << pair.first << " : " << pair.second << endl;
}
// 算法:排序、查找等
vector<int> nums = {3, 1, 4, 2, 5};
sort(nums.begin(), nums.end()); // 升序排序
// 查找元素
auto it = find(nums.begin(), nums.end(), 3);
if (it != nums.end()) {
cout << "找到:" << *it << endl;
}
二、C++ 语法关键注意事项
- 内存管理 :
- 栈对象自动销毁,堆对象(
new)必须用delete释放,否则内存泄漏; - 优先使用智能指针(
unique_ptr/shared_ptr)替代裸指针。
- 栈对象自动销毁,堆对象(
- const 关键字 :
const int a:常量,值不可改;int const* p:指针指向的内容不可改;int* const p:指针本身不可改;const成员函数:void show() const,不能修改成员变量。
- 重载与重写区别 :
- 重载:同一作用域、同名、参数不同;
- 重写:父子类、同名、参数相同、父类方法加
virtual。
- C++11 + 特性兼容 :
- 编译时需指定标准(如
g++ -std=c++11 test.cpp); - 优先使用现代特性(智能指针、auto、Lambda)提升代码安全性和简洁性。
- 编译时需指定标准(如
总结
- 基础层:掌握数据类型、控制流、函数是 C++ 的入门核心,需注意语法规范(分号、作用域);
- 核心层:面向对象(类、继承、多态)是 C++ 的灵魂,重点理解封装、继承、多态三大特性,以及构造 / 析构函数的生命周期;
- 进阶层:C++11 及以上的现代特性(智能指针、Lambda、auto)能大幅提升代码质量,STL 容器与算法是实际开发的核心工具;
- 关键原则:内存管理是 C++ 的重点和难点,优先使用 RAII(资源获取即初始化)思想(如智能指针)避免内存泄漏。
掌握以上语法体系,你可以覆盖绝大多数 C++ 开发场景,后续可针对具体方向(如高性能编程、嵌入式开发)深化相关语法的应用。