记录C++ 13

万能引用

C++11里面的概念可以同时绑定左值和右值,右值引用与自动类型推导的结合,定义时候必须初始化,根据初始值是左值还是右值,自动推导为左值引用或右值引用

引用折叠

2个右值引用会被折叠成一个右值引用,其他情况下都是左值引用

完美转发

完美转发的主要目的是解决函数模板中参数传递的类型推导问题。当我们在函数模板中接收参数并将其传递给其他函数时,我们希望保留原始参数的类型(左值引用、右值引用或值类型)和常量性(const)。这样可以确保传递的参数在接收函数中得到正确的处理。
cpp 复制代码
#include <iostream>
#include <string>
#include <utility> 
using namespace std;
class xiaotangTest
{
    private:
    string name;
    int age;

    public:
    xiaotangTest(): name("xiaotang"),age(30){
        cout <<"构造函数"<<endl;
    }
    xiaotangTest(const xiaotangTest& other):name(other.name),age(other.age){
        cout <<"拷贝构造函数"<<endl;
    }
    xiaotangTest(xiaotangTest&& other):name(move(other.name)),age(other.age){
        cout <<"移动构造函数"<<endl;
    }
};
template<typename T>
void apply(T &&a)
{
    xiaotangTest dudu(forward<T>(a));
}
int main()
{
    xiaotangTest src;
    apply(move(src));//强制转换为右值引用xiaotangTest&&
    return 0;
}

使用场景

泛型函数模板:在实现泛型函数时,有时需要将参数原封不动地传递给其他函数。使用万能引用和 forward,我们可以将传入的参数完美转发到其他函数,保留其原始值类别。
实现容器类:当实现自己的容器类时,例如 vector 或 tuple,需要正确处理元素的构造和销毁。完美转发可以用于在容器内部处理元素的构造和销毁,确保元素的移动构造函数或复制构造函数被正确调用。
封装其他函数:有时我们需要封装其他函数并将参数传递给封装的函数。通过完美转发,可以保留封装函数的调用方式,将参数正确传递给内部的被封装函数。
转发成员函数:在某些情况下,需要在类中编写转发函数,将调用转发给类成员的其他函数。完美转发可以在类中实现这样的转发,确保传递参数的准确性。

智能指针

自能自动化的管理指针所指向的动态资源的释放,它是一个类有类似指针的功能,能*和->运算符进行了重载
unique_ptr:不允许拷贝构造和赋值操作,允许函数返回unique_ptr类型指针,支持对象数组
cpp 复制代码
void UniquePtrtest()
{
    unique_ptr<Test> up(new Test);
    up->Show();

    //void unique_ptr<Test> up2=up;   //  禁止拷贝构造和运算符重载
    unique_ptr<Test[]> up3(new Test[5]);//可以管理数组
}

shared_ptr:智能指针A拷贝构造产生智能指针B时,AB共享同样一个对象

智能指针A赋值给智能指针B时,AB共享同样一个对象

shared_ptr指针实现的时候,内部使用了引用计数的技术

cpp 复制代码
void SharedPtrTest()
{
    shared_ptr<Test> sp(new Test);
    sp->Show();

    shared_ptr<Test> sp2=sp;
    sp2->Show();
    sp->Show();

    cout <<sp2.use_count()<<endl;
    cout <<sp2.get()<<endl;
    shared_ptr<Test> sp3(new Test("world"));
    sp3=sp;
相关推荐
怕浪猫4 小时前
RAG 面试 6 连问,从原理到优化全部覆盖
python·算法·面试
无线通信科研笔记5 小时前
IEEE TVT 2026 论文精读与完整复现|相位误差如何重塑近场 RIS 的幅相响应
论文阅读·人工智能·python·算法·论文笔记
2601_962885726 小时前
如何用 Python 自动识别股票的支撑位与压力位?
开发语言·python
mmmmath_36 小时前
二叉树の递归遍历
算法
爱吃奥利奥_wen6 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
All for pursuit.6 小时前
【位运算-1】338.比特位计数
数据结构·c++·算法·leetcode
我可能是个假开发6 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
小师兄吃牛肉7 小时前
C语言中的nullptr有必要吗
c语言·c++·算法
WL学习笔记7 小时前
日期类(C++)
开发语言·c++·日期类实现
谢亮_vipxieliang8 小时前
Go map与结构体的正确使用
开发语言·golang·哈希算法