C++进阶的“实用突破点”,内容选取高频用到的智能指针、右值引用、lambda表达式三大核心,用生活化类比+精简代码拆解。

一、智能指针:自动收拾烂摊子的“管家”

核心痛点

手动管理 new/delete 容易漏删内存(内存泄漏)、重复删除(野指针崩溃),智能指针能自动释放资源,比裸指针安全10倍。

关键知识点(3种常用类型)

类型 用途 核心特性

 unique_ptr  独占资源(不共享) 不能拷贝,只能移动

 shared_ptr  共享资源(多指针访问) 引用计数,计数为0时释放

 weak_ptr  解决循环引用 不增加引用计数,需锁验证

include <memory>
#include <iostream>
using namespace std;

int main() {
    // 1. unique_ptr:独占所有权
    unique_ptr<int> uptr = make_unique<int>(10); // 推荐用make_unique创建
    cout << *uptr << endl; // 输出10
    // unique_ptr<int> uptr2 = uptr; // 报错:不能拷贝
    unique_ptr<int> uptr2 = move(uptr); // 正确:移动所有权

    // 2. shared_ptr:共享所有权
    shared_ptr<int> sptr = make_shared<int>(20);
    shared_ptr<int> sptr2 = sptr; // 允许拷贝,引用计数变为2
    cout << sptr.use_count() << endl; // 输出2(查看引用计数)

    // 3. 无需手动delete!作用域结束自动释放
    return 0;
}

 

二、右值引用:给代码“提速”的传送门

核心痛点

传统拷贝(如 vector.push_back(大对象) )会复制整个数据,耗时耗内存;右值引用直接“偷”数据,零拷贝提速。

关键概念

  • 左值:能取地址、有名字的变量(如 int a = 5 中的 a )
  • 右值:临时变量、字面量(如 5 、 a+b 的结果)
  • 右值引用符号: && ,专门绑定右值
#include <iostream>
#include <string>
using namespace std;

// 移动构造函数(右值引用实现)
class MyString {
private:
    char* data;
public:
    // 普通构造
    MyString(const char* str) {
        data = new char[strlen(str)+1];
        strcpy(data, str);
        cout << "普通构造:拷贝数据" << endl;
    }

    // 移动构造(&&表示右值引用)
    MyString(MyString&& other) {
        data = other.data; // 直接偷对方的资源
        other.data = nullptr; // 对方置空,避免重复释放
        cout << "移动构造:零拷贝偷数据" << endl;
    }

    ~MyString() { delete[] data; }
};

int main() {
    MyString s1("hello"); // 普通构造:拷贝数据
    // 临时对象是右值,触发移动构造
    MyString s2 = MyString("world"); // 移动构造:零拷贝偷数据
    return 0;
}
 

三、lambda表达式:一行搞定简单函数

核心痛点

写短小的函数(如排序规则、回调函数)时,无需单独定义函数,lambda直接内嵌,代码更简洁。

[捕获列表](参数列表) -> 返回值类型 { 函数体 }
// 捕获列表:获取外部变量([]空捕获,[=]值捕获,[&]引用捕获)
// 返回值类型可省略(编译器自动推导)
  
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<int> nums = {3, 1, 4, 1, 5};

    // 1. 排序:用lambda代替单独写比较函数
    sort(nums.begin(), nums.end(), [](int a, int b) {
        return a > b; // 降序排序(捕获列表为空,无需外部变量)
    });

    // 2. 遍历:捕获外部变量cout,输出结果
    for_each(nums.begin(), nums.end(), [](int x) {
        cout << x << " "; // 输出:5 4 3 1 1
    });

    return 0;
}

 

总结:3个技巧的核心价值

1. 智能指针:告别内存泄漏,新手也能写安全代码;

2. 右值引用:提升性能,尤其处理大对象/容器时;

3. lambda表达式:简化代码,短小逻辑不用单独定义函数。

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:[email protected]