C++11 核心特性实战博客

C++11 作为 C++ 语言的里程碑版本,用简洁语法解决了 C++98 的诸多痛点。我们此次聚焦两大核心:列表初始化统一语法,右值引用 + 移动语义提升性能,这俩特性是现代 C++ 编程的基石,下面结合实例干货讲解。

一、列表初始化:一句话搞定所有对象初始化

C++98 的初始化规则太混乱:数组用{}, 自定义类型用构造函数,写起来又麻烦又容易出错。C++11 的列表初始化({})直接统一所有场景,还能省掉多余代码。

核心用法:怎么用都顺手

  • 内置类型和自定义类型通吃,=号可直接省略

    // C++98老写法
    int arr[] = {1,2,3};
    Point p = {1,2};

    // C++11新写法
    int x {2}; // 省略=,简洁直观
    Date d1 {2025, 1, 1}; // 自定义类型直接用{}
    const Date& d2 {2024, 7, 25}; // 绑定临时对象,自动延长生命周期

  • 容器初始化不用反复 push,直接传值就行

    vector<int> v = {1,2,3,4,5};
    map<string, string> dict = {{"sort", "排序"}, {"string", "字符串"}};
    v = {10,20,30}; // 赋值也支持,灵活度拉满

关键原理:std::initializer_list

容器能直接用{}初始化,全靠std::initializer_list这个 "桥梁"。它本质是栈上数组的轻量包装,内部就两个指针(指向数组首尾),STL 容器都新增了对应的构造函数,所以能直接接收多个值。

二、右值引用与移动语义:告别没必要的拷贝

C++98 的左值引用解决不了临时对象的拷贝浪费 ------ 比如函数返回字符串时,要拷贝两次才能到目标对象。C++11 的右值引用(&&)+ 移动语义,直接 "偷" 走临时对象的资源,效率直接翻倍。

先搞懂:左值和右值的核心区别

  • 左值:有持久状态、能取地址(比如变量int a=1、字符串s="abc"
  • 右值:临时对象、不能取地址(比如字面量10、表达式x+y、临时对象string("temp")

核心语法:引用规则 + 移动构造

  • 左值引用(Type&)绑左值,const左值引用能绑右值

  • 右值引用(Type&&)绑右值,用std::move能强制把左值转成右值

  • 移动构造 / 赋值:接收右值引用参数,直接 "偷" 源对象的资源(比如指针、内存),不用重新拷贝

    // 移动构造核心示例(string类)
    class string {
    public:
    // 移动构造:窃取s的资源,不做深拷贝
    string(string&& s) noexcept {
    _str = s._str;
    _size = s._size;
    s._str = nullptr; // 源对象置空,避免析构时重复释放
    }

    复制代码
      // 移动赋值:逻辑和移动构造一致
      string& operator=(string&& s) noexcept {
          if (this != &s) {
              delete[] _str; // 释放当前资源
              _str = s._str;
              _size = s._size;
              s._str = nullptr;
          }
          return *this;
      }

    private:
    char* _str;
    size_t _size;
    };

实战场景:哪里用最香

  1. 容器插入:左值拷贝,右值移动,自动匹配

    list<string> lt;
    string s1("hello");
    lt.push_back(s1); // 左值→拷贝构造
    lt.push_back(string("world")); // 右值→移动构造(无拷贝)
    lt.push_back(move(s1)); // 强制转右值→移动构造

  2. 函数返回值:局部对象自动转右值,触发移动构造

    string addStrings(string num1, string num2) {
    string str;
    // 字符串拼接逻辑...
    return str; // 右值,直接移动,不拷贝
    }

列表初始化让所有对象的初始化语法一致,不用记多种规则;右值引用 + 移动语义直击拷贝浪费的痛点,尤其适合字符串、容器这些大对象。

掌握这两个特性,既能让代码更简洁易读,又能大幅提升程序性能,是 C++11 最值得优先掌握的技能。

相关推荐
Yang-Never几秒前
Android 内存泄漏 -> ViewModel持有Activity/Fragment导致的内存泄漏
android·java·开发语言·kotlin·android studio
剑之所向1 分钟前
c# 中间表
开发语言·c#
fanruitian2 分钟前
SpringBoot 调用springai ollama
java·spring boot·后端
蓝影铁哥4 分钟前
浅谈5款Java微服务开发框架
java·linux·运维·开发语言·数据库·微服务·架构
程芯带你刷C语言简单算法题8 分钟前
Day39~实现一个算法确定将一个二进制整数翻转为另一个二进制整数,需要翻转的位数
c语言·开发语言·学习·算法·c
Lv11770089 分钟前
初识Visual Studio中的 WinForm
开发语言·ide·笔记·c#·visual studio
superman超哥12 分钟前
Rust Cargo Build 编译流程:从源码到二进制的完整旅程
开发语言·后端·rust·编译流程·cargo build·从源码到二进制
sheji341615 分钟前
【开题答辩全过程】以 小说阅读平台的设计为例,包含答辩的问题和答案
java
永远前进不waiting18 分钟前
C语言复习——2
c语言·开发语言
better_liang21 分钟前
每日Java面试场景题知识点之-JVM
java·jvm·面试题·内存管理·性能调优·垃圾回收