探索C++11的新特性!

发布时间:2024年01月19日

C++11为C++语言引入了许多令人兴奋的新特性,这些特性使得编程变得更加现代化、高效和方便。让我们一起来探索其中一些引人注目的变化。

1. 自动类型推断(Auto)

C++11引入了auto关键字,使得变量的类型声明变得更加简洁。通过使用auto,编译器能够自动推断变量的类型,从而减少了冗长的类型声明,提高了代码的可读性。

// 以前的方式
std::vector<int> oldVec;
std::vector<int>::iterator it = oldVec.begin();

// 使用auto
std::vector<int> newVec;
auto newIt = newVec.begin();

2. 范围-based for 循环

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 << " ";
}

3. 智能指针

C++11引入了std::shared_ptrstd::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);

4. Lambda 表达式

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 << " ";
});

5. nullptr 空指针常量

C++11引入了nullptr,用于表示空指针,替代了以前使用的NULL0。这样可以避免一些由于不同类型的指针混用而引发的问题。

// 以前的方式 
int* oldPtr = NULL; 
// 使用 nullptr
 int* newPtr = nullptr;

6. 移动语义和右值引用

C++11引入了右值引用和移动语义,通过&&标记右值引用,允许将资源的所有权从一个对象转移到另一个对象,从而提高了性能。

// 移动语义 
std::vector<int> oldVec = getVector(); 
// 假设getVector()返回一个临时对象
 std::vector<int> newVec = std::move(oldVec);
 // 使用 std::move 转移资源

7. constexpr 关键字

constexpr关键字用于声明变量或函数为常量表达式,这样在编译时就能够进行计算,提高了程序的性能。

// 常量表达式
constexpr int square(int x) {
    return x * x;
}

int result = square(5);  // 在编译时计算,而不是运行时

8. 多线程支持

C++11引入了对多线程的支持,包括std::threadstd::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;
}

文章来源:https://blog.csdn.net/wuxiaoyu0806/article/details/135611286
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。