《白话C++》第10章 STL和boost,Page84 让MySharedPtr持有一个用户自定义的类,尝试输出更加详细的信息。

本文主要是介绍《白话C++》第10章 STL和boost,Page84 让MySharedPtr持有一个用户自定义的类,尝试输出更加详细的信息。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include <iostream>
//当指针不可用,用户又要强行用时,一死了之
#include <cassert>
using namespace std;///用以记录引用计数
struct MyRefCount
{int count;MyRefCount(): count(1){}
};template <typename T>
class MySharedPtr
{
public:///explicit可以防止赋值式构造explicit MySharedPtr(T* ptr)///这里创建引用计数: _ptr(ptr), _rc(new MyRefCount){}///拷贝构造, 构造一个新的MySharedPtrMySharedPtr(MySharedPtr const& sp) ///构造入参是MySharedPtr引用: _ptr(sp._ptr), _rc(sp._rc){++ _rc->count;}MySharedPtr & operator = (MySharedPtr const& sp) ///赋值运算符重载{if(& sp == this) ///this是个指针{return *this;}_ptr = sp._ptr; ///将参数的裸指针和引用计数指针,赋给当前对象_rc = sp._rc;++ _rc->count; ///引用计数增加1return *this; ///返回当前对象,即一个新的MySharedPtr}~MySharedPtr() ///MySharedPtr析构{--_rc->count;///只有当引用计数为0时,才会删除裸指针,同时删除引用计数指针if(_rc->count == 0){delete _ptr;delete _rc;}}T* operator ->(){if(_rc->count == 0){return nullptr;}return _ptr;}T& operator * (){assert((_rc->count > 0));return * _ptr;}int GetRefCount() const{assert((_rc->count > 0));return _rc->count;}private:T* _ptr;  ///裸指针MyRefCount* _rc; ///引用计数
};struct Student
{int _age;string _name;explicit Student(int age, string name) ///防止赋值式构造: _age(age), _name(name){}
};void test()
{Student* s1 = new Student(10, "张三");cout << s1->_name << endl;
}void testMySharedPtr()
{///产生了一个全新的智能指针sp1,它分配一个整数的内存MySharedPtr <Student> sp1(new Student(10, "张三"));cout << "ref count = " << sp1.GetRefCount() << endl; ///cout << "sp1->_name = " << sp1->_name << endl;{///从sp1拷贝构造出sp2,意味着sp2和sp1各自拥有的裸指针指向同一块内存MySharedPtr <Student> sp2(sp1);cout << "ref count = " << sp2.GetRefCount() << endl;cout << "sp2->_name" << sp2->_name << endl;sp2->_age = 15;sp2->_name = "李四";cout << "sp2->_name" << sp2->_name << endl;} ///sp2生命周期结束,被析构cout << "sp1->_name " << sp1->_name << endl;cout << "ref count = " << sp1.GetRefCount() << endl;
}int main()
{
//    test();testMySharedPtr();return 0;
}

这篇关于《白话C++》第10章 STL和boost,Page84 让MySharedPtr持有一个用户自定义的类,尝试输出更加详细的信息。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll