C/C++ 程序开发参考手册
目录
- C/C++ 核心基础
- 程序结构
- 基本语法
- 数据类型
- 变量与常量
- 运算符
- 控制流
- 函数
- C++ 面向对象编程
- 类与对象
- 封装
- 继承
- 多态
- 抽象类与接口
- C/C++ 标准库详解
- 输入/输出
- 字符串处理
- 容器
- 迭代器
- 算法
- 智能指针
- 时间与日期
- 错误处理
- 内存管理
- C 风格内存管理
- C++ 智能指针 (
std::unique_ptr,std::shared_ptr,std::weak_ptr) - RAII (Resource Acquisition Is Initialization) 原则
- 现代 C++ (C++11/14/17/20) 特性
auto关键字与范围for循环- Lambda 表达式
- 右值引用与移动语义
nullptr和constexpr- 结构化绑定
- 开发工具与环境
- 编译器
- 构建工具
- 调试器
- IDE 与编辑器
- 编程最佳实践与设计模式
- 命名规范
- 代码风格
- 常用设计模式简介
- C 与 C++ 的核心区别
- 学习资源与社区
C/C++ 核心基础
1 程序结构
一个典型的 C/C++ 程序由以下部分组成:
#include <iostream> // 预处理器指令,包含头文件
// using namespace std; // 不推荐在头文件中使用,可能导致命名冲突
// 函数声明 (可选)
int add(int a, int b);
// 主函数,程序入口点
int main() {
// 变量定义
int num1 = 5;
int num2 = 10;
// 函数调用
int sum = add(num1, num2);
// 输出到控制台
std::cout << "The sum is: " << sum << std::endl;
return 0; // 返回 0 表示程序成功执行
}
// 函数定义
int add(int a, int b) {
return a + b;
}
2 基本语法
- 注释:
- 单行:
// 这是注释 - 多行:
/* 这是多行注释 */
- 单行:
- 语句: 以分号
- 代码块: 用花括号 包围。
3 数据类型
| 类型 | 描述 | 大小 (典型) |
|---|---|---|
int |
整型 | 4 字节 |
char |
字符型 | 1 字节 |
float |
单精度浮点型 | 4 字节 |
double |
双精度浮点型 | 8 字节 |
bool |
布尔型 (true/false) |
1 字节 |
void |
无类型 | - |
short |
短整型 | 2 字节 |
long |
长整型 | 4 或 8 字节 |
long long |
双长整型 | 8 字节 |
unsigned |
无符号类型 (如 unsigned int) |
- |
4 变量与常量
- 变量: 存储数据的命名位置。
int age = 30; double price = 99.99; char grade = 'A';
- 常量: 值不能被修改。
const关键字 (C/C++ 推荐):const int MAX_SPEED = 200;
#define预处理器指令 (C 风格):#define PI 3.14159
5 运算符
- 算术: , , , , (取模)
- 关系: , ,
>,<,>=,<= - 逻辑:
&&(与), (或), (非) - 位:
&, ,^, ,<<,>> - 赋值: , , , ,
- 其他:
sizeof()(获取类型大小), (三元运算符), (成员访问),->(指针成员访问)
6 控制流
if-else语句:if (age >= 18) { std::cout << "Adult" << std::endl; } else { std::cout << "Minor" << std::endl; }switch语句:switch (grade) { case 'A': std::cout << "Excellent"; break; case 'B': std::cout << "Good"; break; default: std::cout << "Needs improvement"; }for循环:for (int i = 0; i < 5; ++i) { std::cout << i << " "; }while循环:int count = 0; while (count < 5) { std::cout << count << " "; count++; }do-while循环:int num = 0; do { std::cout << num << " "; num++; } while (num < 5);
7 函数
- 定义: 返回类型 函数名(参数列表) { 函数体 }
- 声明: 返回类型 函数名(参数列表);
- 参数传递:
- 值传递: 传递副本,不影响原变量。
- 指针传递: 传递地址,可以修改原变量。
- 引用传递 (C++): 传递变量的别名,语法更简洁,可修改原变量。
C++ 面向对象编程
1 类与对象
-
类: 创建对象的蓝图或模板,包含属性(成员变量)和行为(成员函数)。
-
对象: 类的实例。
class Dog { private: // 私有成员,外部不可访问 std::string name; int age; public: // 公有成员,外部可访问 // 构造函数 Dog(std::string n, int a) : name(n), age(a) {} // 成员函数 void bark() { std::cout << name << " says: Woof!" << std::endl; } void setAge(int newAge) { age = newAge; } }; int main() { Dog myDog("Buddy", 3); // 创建对象 myDog.bark(); // 调用成员函数 myDog.setAge(4); return 0; }
2 封装
将数据(成员变量)和操作数据的方法(成员函数)捆绑在一起,并隐藏对象的内部细节,只暴露必要的接口,通过 public, private, protected 访问修饰符实现。
3 继承
允许一个类(子类/派生类)继承另一个类(父类/基类)的属性和方法,支持代码复用。
class Animal {
public:
void eat() {
std::cout << "This animal is eating." << std::endl;
}
};
class Cat : public Animal { // Cat 继承自 Animal
public:
void meow() {
std::cout << "Meow!" << std::endl;
}
};
4 多态
"一个接口,多种方法",通过虚函数 (virtual) 实现,允许使用基类指针或引用来调用派生类的重写方法。
class Animal {
public:
virtual void makeSound() { // 虚函数
std::cout << "Some animal sound" << std::endl;
}
};
class Dog : public Animal {
public:
void makeSound() override { // override 关键字 (C11+) 明确表示重写
std::cout << "Woof!" << std::endl;
}
};
int main() {
Animal* myAnimal = new Dog();
myAnimal->makeSound(); // 输出 "Woof!",体现多态
delete myAnimal;
return 0;
}
5 抽象类与接口
- 抽象类: 包含至少一个纯虚函数 (
= 0) 的类,不能被实例化,用于定义派生类的共同接口。 - 接口 (C++): 在 C++ 中,通常使用只包含纯虚函数的抽象类来实现接口。
C/C++ 标准库详解
1 输入/输出
- 头文件:
<iostream> std::cout: 标准输出 (控制台)。std::cin: 标准输入 (键盘)。std::cerr: 标准错误输出。std::fstream: 文件流,用于文件读写。
2 字符串处理
- C 风格字符串: 以
'\0'结尾的字符数组,函数在<cstring>中 (如strcpy,strlen,strcmp)。 - C++
std::string: 更安全、更方便的字符串类,在<string>中。#include <string> std::string s1 = "Hello"; std::string s2 = " World"; std::string s3 = s1 + s2; // "Hello World"
3 容器
- 序列式容器:
std::vector: 动态数组,元素在内存中连续。std::list: 双向链表,高效插入/删除。std::deque: 双端队列。
- 关联式容器:
std::map: 键值对,按键排序。std::unordered_map: 哈希表,按键快速查找。std::set: 唯一键的集合,自动排序。std::unordered_set: 唯一键的哈希集合。
4 迭代器
提供一种统一的方法来顺序访问容器中的元素,类似于指针。
std::vector<int> v = {1, 2, 3};
// 使用迭代器遍历
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " ";
}
// 现代C++风格 (范围for循环)
for (int num : v) {
std::cout << num << " ";
}
5 算法
在 <algorithm> 头文件中,提供大量不操作容器本身、只通过迭代器操作的算法。
std::sort: 排序。std::find: 查找元素。std::for_each: 对每个元素执行操作。std::transform: 转换元素。
6 智能指针 (C++)
自动管理内存,防止内存泄漏。
std::unique_ptr: 独占所有权,不可复制,只能移动。std::shared_ptr: 共享所有权,引用计数,最后一个shared_ptr被销毁时释放内存。std::weak_ptr:shared_ptr的观察者,不增加引用计数,用于解决循环引用问题。
7 时间与日期
- C 风格:
<ctime>(如time(),ctime()) - C++11 风格:
<chrono>和<ctime>结合,更强大灵活。#include <chrono> #include <ctime> auto now = std::chrono::system_clock::now(); std::time_t now_time = std::chrono::system_clock::to_time_t(now); std::cout << std::ctime(&now_time);
8 错误处理
- C 风格: 通过函数返回值(如
-1,NULL)或全局变量errno来表示错误。 - C++ 异常: 使用
try,catch,throw机制,可以将错误处理逻辑与正常业务逻辑分离。try { // 可能抛出异常的代码 int result = 10 / 0; } catch (const std::exception& e) { // 捕获并处理异常 std::cerr << "Error: " << e.what() << std::endl; }
内存管理
1 C 风格内存管理
malloc(size_t size): 在堆上分配内存,不调用构造函数。- *`free(void ptr)`**: 释放内存。
new/delete: C++ 中用于单个对象的动态分配和释放,会调用构造/析构函数。new[]/delete[]: 用于数组的动态分配和释放。
2 C++ 智能指针
std::unique_ptr:std::unique_ptr<int> p1(new int(10)); // std::unique_ptr<int> p2 = p1; // 编译错误!不能复制 std::unique_ptr<int> p2 = std::move(p1); // 所有权转移
std::shared_ptr:std::shared_ptr<int> p1(new int(10)); std::shared_ptr<int> p2 = p1; // p1 和 p2 共享所有权
3 RAII (Resource Acquisition Is Initialization)
核心思想: 将资源的生命周期与对象的生命周期绑定,在构造函数中获取资源,在析构函数中释放资源,智能指针、文件流 (std::ifstream) 都是 RAII 的典范,这确保了即使在发生异常时,资源也能被正确释放。
现代 C++ (C++11/14/17/20) 特性
1 auto 与范围 for 循环
auto: 让编译器自动推导变量类型。auto x = 42; // x is int auto y = 3.14; // y is double auto z = "hello"; // z is const char*
- 范围
for循环:std::vector<int> nums = {1, 2, 3}; for (const auto& num : nums) { std::cout << num << " "; }
2 Lambda 表达式
创建匿名函数,方便地在需要时定义一小段可执行的代码。
// 语法: [capture_list](parameter_list) -> return_type { function_body }
int a = 5, b = 10;
auto add = [](int x, int y) { return x + y; };
int sum = add(a, b);
// 捕获外部变量
auto multiply_by_a = [a](int x) { return x * a; };
3 右值引用与移动语义
- 右值: 临时对象,如
42,x + y,std::string("temp")。 - 右值引用 (
&&): 可以绑定到右值。 - 移动语义: 允许“窃取”临时资源的所有权,避免不必要的深拷贝,极大提高性能。
std::move将左值转换为右值引用。
4 nullptr 和 constexpr
nullptr: 替代NULL,是安全的空指针字面量。constexpr: 告诉编译器,这个表达式的值可以在编译期计算出来,用于创建编译期常量函数和变量。
5 结构化绑定 (C++17)
可以方便地从 std::pair, std::tuple 或结构体中解构出成员。
std::pair<int, std::string> p(1, "one"); auto [id, name] = p; // id = 1, name = "one"
开发工具与环境
- 编译器:
- GCC (GNU Compiler Collection): Linux/Unix/macOS 默认,命令行为
g++。 - Clang: LLVM 项目,速度快,诊断信息好。
- MSVC (Microsoft Visual C++): Windows 平台,Visual Studio 内置。
- GCC (GNU Compiler Collection): Linux/Unix/macOS 默认,命令行为
- 构建工具:
- Make/CMake: CMake 是现代跨平台构建系统,推荐使用。
- Ninja: 快速的小型构建系统。
- 调试器:
- GDB: Linux/Unix/macOS 下强大的命令行调试器。
- LLDB: Clang 的调试器。
- Visual Studio Debugger: Windows 下功能强大的图形化调试器。
- IDE 与编辑器:
- Visual Studio: Windows 下功能最全的 IDE。
- VS Code: 轻量级,通过插件支持 C/C++。
- CLion: JetBrains 出品的跨平台 C/C++ IDE。
- Qt Creator: 跨平台,尤其适合 Qt 开发。
编程最佳实践与设计模式
- 命名规范:
- 类名:
PascalCase(如MyClass) - 函数/变量名:
camelCase(如myFunction,myVariable) - 常量:
UPPER_CASE_WITH_UNDERSCORES(如MAX_BUFFER_SIZE)
- 类名:
- 代码风格: 保持一致性,可以使用
clang-format等工具自动格式化。 - 常用设计模式:
- 单例模式: 确保一个类只有一个实例。
- 工厂模式: 定义一个用于创建对象的接口。
- 观察者模式: 定义对象间一对多的依赖关系。
- RAII: 最重要的 C++ 编程模式。
C 与 C++ 的核心区别
| 特性 | C | C++ |
|---|---|---|
| 编程范式 | 过程式 | 过程式 + 面向对象 + 泛型 |
| 类型检查 | 相对宽松 | 更严格,支持函数重载 |
| 内存管理 | malloc/free |
new/delete + 智能指针 |
| 标准库 | 较小 (如 stdio.h, stdlib.h) |
庞大 (STL: 容器、算法、迭代器等) |
| 错误处理 | 返回值, errno |
异常 (try-catch) |
| 输入/输出 | printf, scanf |
std::cout, std::cin (类型安全) |
| 其他特性 | - | 类、继承、多态、模板、Lambda、RAII |
学习资源与社区
- 官方文档:
- ISO C++ Standard Committee
- cppreference.com (最权威、最全面的 C++ 参考网站)
- 书籍:
- 入门: 《C++ Primer》, 《C++ Primer Plus》
- 进阶: 《Effective C++》, 《More Effective C++》, 《Effective Modern C++》, 《The C++ Programming Language》 (Bjarne Stroustrup 著)
- 在线教程:
- LearnCpp.com (免费,质量高)
- Tutorialspoint C++
- 社区:
- Stack Overflow: 解决编程问题的首选。
- Reddit: r/cpp, r/C++_Begins
- Discord: 许多 C++ 社区服务器。
这份手册涵盖了 C/C++ 开发的核心知识,C++ 是 C 的超集,并在此基础上增加了强大的面向对象和泛型编程能力,掌握现代 C++ 特性(如智能指针、RAII、Lambda)是写出高质量、高性能、可维护代码的关键,祝您编程愉快!
