记录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;
相关推荐
码行山野赴时序归途19 分钟前
从暴力到最优:三道 C 语言入门题的解法思路
c语言·开发语言·数据结构·算法·leetcode·排序算法
土司大王20 分钟前
LeetCode hot100——随机链表的复制
算法·leetcode·链表
叠层归一研究院21 分钟前
螺旋时空:E框架的整合宇宙论
人工智能·经验分享·算法·机器学习·agi
磁场转动100万匹32 分钟前
线性回归算法实现训练数据集、测试数据集的缺失值填充
算法·机器学习·线性回归
郑州光合科技余经理1 小时前
本地生活平台搭建:统一订单表与多后台切换怎么拆
java·开发语言·前端·系统架构·uni-app·php·ai编程
天下无敌笨笨熊1 小时前
C#视频开发心得
开发语言·c#·音视频
开心大爆炸1 小时前
ubuntu20.4 安装ros1 noetic版本流程
c++
乐迪信息1 小时前
防爆AI摄像机实时监测船舶异常姿态
大数据·人工智能·算法·安全·目标跟踪
淼澄研学1 小时前
基于Docker与iptables的AI智能体网络隔离实操指南
开发语言·python