记录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;
相关推荐
Lzg_na16 分钟前
堆和堆排序
算法
努力努力再努力wz17 分钟前
【Lua入门系列】从动态类型到变量作用域:彻底理解 local、全局变量与跨文件访问
开发语言·junit·lua
TK泰妞23 分钟前
TikTok 带货视频如何做多语言本地化?从翻译脚本到重做场景的实用方法
算法·音视频
程序猿乐锅24 分钟前
面向对象练习:图书借阅系统里的封装、抽象类与多态
开发语言·前端·数据库·后端·python·学习·1024程序员节
房开民26 分钟前
DDPM 完整原理 + 全套公式串联
算法
lunar_coder31 分钟前
哈希扩展 -- 位图思想
c++·算法·哈希算法
秋天的怀念_David40 分钟前
听故事学语言 · 数据结构篇 · 序章一 算法之问
数据结构·程序人生·算法
沐晓时光41 分钟前
C语言入门,深入理解指针(6)
c语言·开发语言
略略略咯咯1 小时前
33333
开发语言·windows·python
LG.YDX1 小时前
基于中心的3D目标检测和探索追踪-笔记
笔记·算法·目标检测