1. C++基础语法精要
在掌握上篇的变量、运算符和流程控制后,我们继续深入C++的核心语法体系。指针作为C++的灵魂特性,其本质是存储内存地址的变量。理解指针的关键在于区分:
cpp复制int* ptr; // 指针声明
*ptr = 10; // 解引用操作
指针运算遵循"类型宽度"规则,例如int类型指针+1实际移动4字节(32位系统)。常见误区包括:
- 未初始化的野指针
- 指针类型不匹配导致的截断
- 数组越界访问
引用则是变量的别名,必须在声明时初始化:
cpp复制int val = 5;
int& ref = val; // 引用必须绑定实体
引用常用于函数参数传递,避免拷贝开销。与指针相比,引用更安全但灵活性较低。
2. 函数深度解析
C++函数支持多种参数传递方式:
cpp复制void func(int a); // 值传递
void func(int* a); // 指针传递
void func(int& a); // 引用传递
void func(const int& a); // 常量引用
函数重载的底层原理是"名称修饰"(name mangling),编译器会根据参数类型生成唯一符号。例如:
cpp复制void print(int) // _Z5printi
void print(float) // _Z5printf
内联函数通过inline关键字建议编译器展开代码,适合小型频繁调用的函数:
cpp复制inline int max(int a, int b) {
return a > b ? a : b;
}
注意:递归函数和虚函数不能内联。
3. 面向对象编程
类与对象是OOP的核心。构造函数有以下特殊形式:
cpp复制class MyClass {
public:
MyClass(); // 默认构造
MyClass(int a); // 参数化构造
MyClass(const MyClass&); // 拷贝构造
~MyClass(); // 析构函数
};
继承中的访问控制:
- public继承:基类权限不变
- protected继承:基类public降级
- private继承:所有成员私有化
多态通过虚函数实现,注意虚函数表(vtable)的内存布局。纯虚函数构成抽象类:
cpp复制virtual void draw() = 0; // 纯虚函数
4. 模板与泛型编程
函数模板示例:
cpp复制template<typename T>
T max(T a, T b) {
return a > b ? a : b;
}
类模板需要单独实现成员函数:
cpp复制template<class T>
class Stack {
void push(T val);
//...
};
template<class T>
void Stack<T>::push(T val) { /*...*/ }
模板特化允许为特定类型定制实现:
cpp复制template<>
class Stack<bool> { /*...*/ };
5. 标准库核心组件
容器分类:
- 序列容器:vector/list/deque
- 关联容器:set/map
- 无序容器:unordered_set
智能指针使用要点:
cpp复制std::unique_ptr<MyClass> ptr(new MyClass());
std::shared_ptr<MyClass> ptr2 = std::make_shared<MyClass>();
文件操作示例:
cpp复制std::fstream file;
file.open("test.txt", std::ios::out);
file << "Hello";
file.close();
6. 异常处理机制
try-catch块结构:
cpp复制try {
throw std::runtime_error("error");
}
catch(const std::exception& e) {
std::cerr << e.what();
}
自定义异常类:
cpp复制class MyException : public std::exception {
const char* what() const noexcept override {
return "My error";
}
};
7. 现代C++特性
auto类型推导:
cpp复制auto x = 5; // int
auto y = 3.14; // double
lambda表达式:
cpp复制auto func = [](int a) { return a*a; };
std::sort(v.begin(), v.end(),
[](int a, int b){ return a>b; });
移动语义:
cpp复制std::vector<std::string> v;
v.push_back(std::move(str)); // 转移资源
8. 性能优化技巧
内存管理建议:
- 预分配vector空间 reserve()
- 使用emplace_back替代push_back
- 避免不必要的拷贝
编译器优化选项:
- -O1 基础优化
- -O2 推荐优化级别
- -O3 激进优化
多线程编程基础:
cpp复制#include <thread>
void task() { /*...*/ }
std::thread t(task);
t.join();
9. 调试与测试
GDB常用命令:
code复制break 行号
run
next/step
print 变量
backtrace
单元测试框架示例:
cpp复制#define CATCH_CONFIG_MAIN
#include "catch.hpp"
TEST_CASE("Vector test") {
std::vector<int> v;
REQUIRE(v.empty());
}
10. 工程实践建议
头文件规范:
cpp复制#ifndef MYHEADER_H
#define MYHEADER_H
// 内容
#endif
Makefile基础:
makefile复制CXX = g++
TARGET = app
OBJS = main.o util.o
$(TARGET): $(OBJS)
$(CXX) -o $@ $^
代码规范检查工具:
- clang-format
- cppcheck
- clang-tidy
