C++11为C++语言引入了许多令人兴奋的新特性,这些特性使得编程变得更加现代化、高效和方便。让我们一起来探索其中一些引人注目的变化。
C++11引入了auto
关键字,使得变量的类型声明变得更加简洁。通过使用auto
,编译器能够自动推断变量的类型,从而减少了冗长的类型声明,提高了代码的可读性。
// 以前的方式
std::vector<int> oldVec;
std::vector<int>::iterator it = oldVec.begin();
// 使用auto
std::vector<int> newVec;
auto newIt = newVec.begin();
C++11引入了范围-based for 循环,简化了对容器的遍历。这种循环方式不仅更加简洁,而且避免了迭代器的使用。
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 以前的方式
for (std::vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
// 使用范围-based for 循环
for (auto num : numbers) {
std::cout << num << " ";
}
C++11引入了std::shared_ptr
和std::unique_ptr
,这两种智能指针提供了更安全、更方便的内存管理方式,减少了内存泄漏的风险。
// 使用 shared_ptr
std::shared_ptr<int> sharedInt = std::make_shared<int>(42);
// 使用 unique_ptr
std::unique_ptr<int> uniqueInt = std::make_unique<int>(24);
Lambda 表达式是一个强大的特性,允许我们在需要函数对象的地方提供一个匿名函数。它简化了代码,并在一些情况下提高了性能。
// 以前的方式
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::for_each(numbers.begin(), numbers.end(), [](int num) {
std::cout << num << " ";
});
// 使用 Lambda 表达式
std::for_each(numbers.begin(), numbers.end(), [](int num) {
std::cout << num << " ";
});
nullptr
空指针常量C++11引入了nullptr
,用于表示空指针,替代了以前使用的NULL
或0
。这样可以避免一些由于不同类型的指针混用而引发的问题。
// 以前的方式
int* oldPtr = NULL;
// 使用 nullptr
int* newPtr = nullptr;
C++11引入了右值引用和移动语义,通过&&
标记右值引用,允许将资源的所有权从一个对象转移到另一个对象,从而提高了性能。
// 移动语义
std::vector<int> oldVec = getVector();
// 假设getVector()返回一个临时对象
std::vector<int> newVec = std::move(oldVec);
// 使用 std::move 转移资源
constexpr
关键字constexpr
关键字用于声明变量或函数为常量表达式,这样在编译时就能够进行计算,提高了程序的性能。
// 常量表达式
constexpr int square(int x) {
return x * x;
}
int result = square(5); // 在编译时计算,而不是运行时
C++11引入了对多线程的支持,包括std::thread
、std::mutex
等,使得并发编程变得更加方便。这为处理复杂的并发任务提供了更好的工具。
#include <iostream>
#include <thread>
// 多线程示例
void printNumbers() {
for (int i = 0; i < 5; ++i) {
std::cout << i << " ";
}
}
int main() {
std::thread t(printNumbers);
t.join(); // 等待线程结束
return 0;
}