自C++11标准发布以来,C++语言经历了革命性的变化。现代C++(通常指C++11及之后的版本)引入了一系列新特性,极大地改变了我们编写C++代码的方式。本文旨在系统性地介绍现代C++的基础写法和重要注意事项,帮助开发者从传统的C++98风格顺利过渡到现代C++编程范式。
1. 资源管理:拥抱RAII和智能指针
1.1 RAII原则
RAII(Resource Acquisition Is Initialization)是C++最重要的设计理念。现代C++强烈推荐将资源生命周期与对象生命周期绑定:
// 传统写法(不推荐)
void old_style() {
File* file = fopen("data.txt", "r");
if (file) {
// 使用文件
fclose(file); // 容易忘记关闭
}
}
// 现代写法(推荐)
void modern_style() {
std::ifstream file("data.txt");
if (file.is_open()) {
// 使用文件
} // 自动关闭,无需手动调用
}
1.2 智能指针的使用
永远使用智能指针管理动态内存,避免原始`new`和`delete`:
#include <memory>
// 独占所有权 - std::unique_ptr
auto createResource() {
return std::make_unique<MyResource>(); // C++14
}
void processResource(std::unique_ptr<MyResource> res) {
// 使用资源
} // 资源自动释放
// 共享所有权 - std::shared_ptr
class Manager {
private:
std::vector<std::shared_ptr<MyResource>> resources;
public:
void addResource(std::shared_ptr<MyResource> res) {
resources.push_back(std::move(res));
}
};
重要注意事项:
优先使用`std::make_unique`和`std::make_shared`,它们更安全且更高效
使用`std::move`传递`std::unique_ptr`所有权
`std::weak_ptr`用于打破`std::shared_ptr`的循环引用
2. 类型安全与表达意图
2.1 const正确性
所有不应被修改的变量、参数和成员函数都应声明为`const`:
class DataProcessor {
public:
// const引用传递不希望修改的参数
void process(const std::string& input, const std::vector<int>& data) const {
// 成员函数不会修改对象状态
for (const auto& value : data) { // const引用避免拷贝
// 处理数据
}
}
const std::string& getName() const { return name; }
private:
std::string name;
};
2.2 类型推导(auto)
在编译器已知类型或类型名冗长时使用`auto`:

最低0.47元/天 解锁文章
854

被折叠的 条评论
为什么被折叠?



