C++11教程引领您快速入门并掌握C++语言的现代特性与改进,包括自动类型推断、缩进风格的代码格式化、范围基础类型如范围for循环,以及智能指针与RAII原则,助力您利用C++的高效与灵活进行高质量编程。
C++11简介
C++11,即C++11标准委员会在2011年发布的C++语言标准版本,是对C++语言的显著增强,引入了多项新特性与改进,旨在提高代码的可读性、可维护性与安全性。相较于C++98标准,C++11带来了更强大的功能,包括资源管理、并行编程支持、函数式编程特性等,使得C++成为一种更加现代、灵活、高效的语言。
基础语法更新
自动类型推断
C++11引入了更简洁的语法,允许编译器推断变量的类型。这种特性称为自动类型推断或Smart Initialization,通过初始化表达式与变量名结合使用,可以省去显式类型声明。
int main() {
auto x = 42; // 编译器将推断出x为int类型
string y = "hello"; // 显式类型声明
return 0;
}
缩进风格的代码格式化
为了提高代码的可读性与维护性,C++11引入了缩进风格的代码格式化,这意味着当代码多行时,使用缩进而非花括号来表示代码块。
int main() {
int x = 10;
if (x > 0) {
std::cout << "x is positive" << std::endl; // 缩进表示代码块
}
}
范围基础类型
范围for循环
C++11引入了范围基础类型(range-based for loop),简化了迭代与遍历容器的操作。
#include <iostream>
#include <vector>
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
for (int num : nums) { // 范围for循环
std::cout << num << std::endl;
}
return 0;
}
智能指针与RAII
智能指针
C++11引入了新的智能指针类型,如std::unique_ptr
和std::shared_ptr
,用于自动管理内存,减少内存泄漏风险。
#include <iostream>
#include <memory>
int main() {
std::unique_ptr<int> ptr(new int(10));
std::cout << *ptr << std::endl; // 输出10
return 0;
}
资源释放即初始化(RAII)
资源释放即初始化(即Resource Acquisition Is Initialization)原则,确保资源在对象的生命周期内得到正确管理。在使用智能指针时,对象的生命周期与资源的生命周期相匹配。
#include <iostream>
#include <mutex>
class Resource {
public:
Resource() {
std::cout << "Resource created" << std::endl;
}
~Resource() {
std::cout << "Resource destroyed" << std::endl;
}
};
int main() {
{
std::unique_ptr<Resource> r = std::make_unique<Resource>();
// 执行需要资源的代码块
}
return 0;
}
初始化列表与构造函数
初始化列表
C++11允许在类声明时通过初始化列表为成员变量指定默认值或自定义初始化顺序。
class MyClass {
public:
int x = 10; // 默认初始化
double y = 20.5; // 默认初始化
public:
MyClass() : x(10), y(20.5) {} // 初始化列表
MyClass(int new_x, double new_y) : x(new_x), y(new_y) {} // 参数化构造函数
};
int main() {
MyClass m1; // 使用默认构造函数
MyClass m2(15, 25.5); // 使用参数化构造函数
return 0;
}
默认参数
构造函数可以通过默认参数简化对象实例化。
class MyClass {
public:
int x = 10; // 默认值为10
double y = 20.5; // 默认值为20.5
public:
MyClass() : x(10), y(20.5) {} // 默认构造函数
MyClass(int x = 5, double y = 10.5) : x(x), y(y) {} // 带有默认参数的构造函数
};
int main() {
MyClass m1; // 使用默认构造函数
MyClass m2(15); // 使用带一个参数的构造函数
MyClass m3(15, 25.5); // 使用带两个参数的构造函数
return 0;
}
函数式编程特性
Lambda表达式
C++11引入了lambda表达式,简化了闭包功能的实现,使得函数可以作为数据处理的参数。
#include <iostream>
#include <vector>
#include <algorithm>
void process_elements(std::vector<int> elements, std::function<void(int)> func) {
for (int i : elements) {
func(i);
}
}
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
process_elements(numbers, [](int num) {
std::cout << "Square: " << num * num << std::endl;
});
return 0;
}
Move语义
C++11引入了move语义,优化了资源移动而非复制,提高了函数的性能与代码的简洁性。
#include <iostream>
#include <utility>
class Resource {
public:
Resource() { std::cout << "Resource created" << std::endl; }
Resource(Resource&& other) {
std::cout << "Moved from resource" << std::endl;
}
~Resource() { std::cout << "Resource destroyed" << std::endl; }
};
void move_resource(Resource&& resource) {
std::cout << "Moved resource" << std::endl;
}
int main() {
Resource r;
move_resource(std::move(r)); // 使用move语义
return 0;
}
总结
通过以上介绍与代码示例,C++11为开发者提供了更强大、更安全、更高效的编程手段。通过学习与实践这些新特性,将有助于提高代码质量,减少错误,提升开发效率。