2024/9/8 c++ smart

2024-09-09 07:52
文章标签 c++ 2024 smart

本文主要是介绍2024/9/8 c++ smart,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.通过自己编写的class来实现unique_ptr指针的功能

#include <iostream>

using namespace std;
template<class T>
class unique_ptr
{
public:
        //无参构造函数
        unique_ptr();
        //有参构造函数
        unique_ptr(T* ptr = nullptr):ptr(ptr){}
        //移动构造函数
        unique_ptr(unique_ptr&& Right):ptr(Right.ptr) {}         
        unique_ptr operator=(unique_ptr<T>&& p)
        {
            ptr=p.release();
        }
 
        //使用delete关键字强行禁止拷贝构造函数和赋值函数的生成
        unique_ptr(const unique_ptr<T>& up) = delete;
        unique_ptr<T>& operator=(const unique_ptr<T>& up) = delete;
         unique_ptr operator=(T*)=delete;//不支持指针赋值

        T* get() const
        {
            return ptr;
        }
        T* release()
        {
            T* tr=ptr;
            ptr=nullptr;
            return tr;
        }

        void reset(T* rt)
        {
            delete ptr;
            ptr=rt;
        }
        void reset()
        {
            delete ptr;
            ptr=nullptr;
        }
    
        template <class U>
        void reset(U p) =delete;

        void swap(unique_ptr& u)
        {
            using std::swap;
            swap(ptr,u.ptr);
        }
        
        
        operator bool() const
        {
            return ptr;
        }

        T& operator[](size_t i) const
        {
            return *(ptr+i);
        }

        T& operator*()
        {
            return *ptr;
        }
 
        T* operator->()
        {
            return ptr;
        }

        //析构函数
        ~unique_ptr()
        {
            delete ptr;
        }
 
    private:
        T*     ptr;
    };


class Test
{
    public:
        Test(){};   //使用系统默认提供的无参构造函数
        Test(int a):a(a){
            cout << "Test的有参构造函数" << endl;
        }

        virtual ~Test()
        {
            cout << "Test的析构函数" << endl;
        }

        void show()
        {
            cout << "Test::a=" << a << endl;
        }
                                                                                           
    private:
        int a;
};

int main(int argc, const char *argv[])
{
    Test* pt1 = new Test(10);       //pt1是裸指针

    unique_ptr<Test> up(pt1);   //将裸指针pt1交给up智能指针维护
    up->show();
    (*up).show();

    //unique_ptr<Test> up2(up);     //调用拷贝构造函数,错误的,该函数已经被禁用

    //unique_ptr<Test> up2;
    //up2 = up;                         //调用拷贝赋值函数,错误的,该函数已经被禁用

    unique_ptr<Test> up2(move(up));     //调用移动构造函数,move函数将up从左值修改为右值
                                        //将up中的数据移动给up2,自己空间中的指针置为NULL

    //up->show();       //错误的,up已经将自己的数据移交给up2了
                        //up中的裸指针权限已经移交给up2

    up2->show();        //up2->show():通过pt1访问类pt1的show


    Test* pt2 = new Test(20);
    unique_ptr<Test> up3(pt2);      //up3维护的是pt2裸指针
    up3->show();                    //通过pt2访问了pt2的show

    up3.swap(up2);                  //将up2的裸指针与up3的裸指针交换

    up2->show();        //20    通过pt2访问show
    up3->show();        //10    通过pt1访问show
    //因为up将他的值给了up2,此时up经过move值不确定所以会出现段核心报错
    return 0;
}

这篇关于2024/9/8 c++ smart的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150583

相关文章

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业