C++11新特性

发布于:2025-05-14 ⋅ 阅读:(14) ⋅ 点赞:(0)

一、背景简介

在讨论C++11的特性之前,可以简单提一下:

C++98/03是传统标准,已使用多年。而C++11(之前叫C++0x)是为了应对现代硬件多核、多任务的需求,加入了许多新功能,提升了语言的性能、表达力和安全性。


二、C++11的主要新特性

我会分类讲解,方便理解。


1. 自动类型推导

  • auto关键字:让编译器自行推导变量类型,减少冗余。

复制代码

auto n = 10;          // int
auto p = new int(20); // int*
auto lambda = [](int x){ return x + 1; }; // lambda表达式自动推导

// 作用:让代码更简洁、更易维护
  • decltype:获取表达式的类型,支持复杂类型推导。

2. 智能指针

引入标准库的智能指针,大大提升内存管理的安全性。

  • std::shared_ptr:引用计数共享所有权。
  • std::unique_ptr:唯一所有权,轻量级。

复制代码

std::shared_ptr<int> sp1 = std::make_shared<int>(5);
auto up = std::make_unique<int>(10);

**作用:**避免手工调用delete,减少内存泄漏。


3. 不可复制的对象:= delete 和 = default

  • 删除函数(= delete:让某些函数不可用,常用在防止复制。

复制代码

class NonCopyable {
public:
    NonCopyable() = default;
    NonCopyable(const NonCopyable&) = delete; // 禁止拷贝
    NonCopyable& operator=(const NonCopyable&) = delete;
};
  • 默认函数(= default:显式声明编译器生成的默认实现。

复制代码

class Foo {
public:
    Foo() = default; // 使用编译器默认构造函数
};

4. 移动语义(rvalue、移动构造和移动赋值)

  • rvalue引用(&&:支持“资源转移”,显著提升性能(尤其在容器中)。
  • 移动构造函数 和 移动赋值运算符:实现“资源的转移”。

复制代码

class String {
public:
    String(String&& other); // 移动构造
    String& operator=(String&& other); // 移动赋值
};

**作用:**在返回临时对象、容器和资源管理方面大大提高效率。


5. Lambda表达式

匿名函数,简化回调和算法。

复制代码

auto add = [](int a, int b) { return a + b; };
int sum = add(3, 4); // 7

支持捕获外部变量(值或引用)、可变(mutable)、参数和返回值。


6. 智能成员初始化(非静态成员初始化)

复制代码

class Person {
public:
    std::string name = "Jane";
    int age = 20;
};

不用在构造函数里重复初始化。


7. constexpr

用于编译时常量和函数,提升程序的计算能力。

复制代码

constexpr int square(int x) {
    return x * x;
}
static_assert(square(5) == 25, "Error");

8. thread支持(多线程)

加入标准库的多线程支持,是面向多核时代的重大升级。

  • std::thread
  • 互斥锁(std::mutex
  • 条件变量(std::condition_variable

复制代码

std::thread t([]{ std::cout << "Hello from thread\n"; });
t.join();

9. enum class(强类型枚举)

解决传统枚举的命名污染和类型安全问题。

复制代码

enum class Color { Red, Green, Blue };
Color c = Color::Red;

避免命名冲突,也更易调试。


10. 初始化列表(initializer_list

方便统一初始化对象。

复制代码

class MyClass {
public:
    MyClass(std::initializer_list<int> list) {
        for (auto it = list.begin(); it != list.end(); ++it)
            // 处理
    }
};
MyClass obj = {1, 2, 3};

11. static_assert

在编译期进行断言,提前捕获错误。

复制代码

static_assert(sizeof(int) == 4, "int must be 4 bytes");

12. explicit的扩展

支持explicit构造函数只在单参数时可以隐式调用。


三、总结:C++11的核心亮点

特性类别 关键点 作用/意义
语法简化 autodecltypenullptrconstexpr 提升代码简洁性和表达力
内存安全 智能指针(shared_ptrunique_ptr 避免内存泄漏,管理动态资源
性能优化 移动语义(rvalue引用、移动构造/赋值) 资源转移,避免不必要的复制
多线程支持 threadmutexcondition_variable 搭建多核多任务环境的基础
类型安全 enum classdelete / default 强类型枚举,禁止部分函数,安全性提升
编译期优化 static_assertconstexpr 提升编译时检查能力
其他增强 lambda表达式、初始化列表、explicit 提升表达能力,写出更漂亮、更健壮的代码

四、总结一句话版本

C++11带来了更简洁、更安全、更高效的表达能力,包括自动类型推导、智能指针、移动语义、lambda表达式、多线程支持、强类型枚举和编译时优化等一系列革命性特性,是现代C++编程不可或缺的基础。


网站公告

今日签到

点亮在社区的每一天
去签到