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)); // 强制转右值→移动构造
  1. 函数返回值:局部对象自动转右值,触发移动构造
string addStrings(string num1, string num2) {
    string str;
    // 字符串拼接逻辑...
    return str; // 右值,直接移动,不拷贝
}

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值