《白话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

相关文章

Python中Tkinter GUI编程详细教程

《Python中TkinterGUI编程详细教程》Tkinter作为Python编程语言中构建GUI的一个重要组件,其教程对于任何希望将Python应用到实际编程中的开发者来说都是宝贵的资源,这篇文... 目录前言1. Tkinter 简介2. 第一个 Tkinter 程序3. 窗口和基础组件3.1 创建窗

利用c++判断水仙花数并输出示例代码

《利用c++判断水仙花数并输出示例代码》水仙花数是指一个三位数,其各位数字的立方和恰好等于该数本身,:本文主要介绍利用c++判断水仙花数并输出的相关资料,文中通过代码介绍的非常详细,需要的朋友可以... 以下是使用C++实现的相同逻辑代码:#include <IOStream>#include <vec

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

自定义注解SpringBoot防重复提交AOP方法详解

《自定义注解SpringBoot防重复提交AOP方法详解》该文章描述了一个防止重复提交的流程,通过HttpServletRequest对象获取请求信息,生成唯一标识,使用Redis分布式锁判断请求是否... 目录防重复提交流程引入依赖properties配置自定义注解切面Redis工具类controller

C++ 右值引用(rvalue references)与移动语义(move semantics)深度解析

《C++右值引用(rvaluereferences)与移动语义(movesemantics)深度解析》文章主要介绍了C++右值引用和移动语义的设计动机、基本概念、实现方式以及在实际编程中的应用,... 目录一、右值引用(rvalue references)与移动语义(move semantics)设计动机1

C#如何在Excel文档中获取分页信息

《C#如何在Excel文档中获取分页信息》在日常工作中,我们经常需要处理大量的Excel数据,本文将深入探讨如何利用Spire.XLSfor.NET,高效准确地获取Excel文档中的分页信息,包括水平... 目录理解Excel中的分页机制借助 Spire.XLS for .NET 获取分页信息为什么选择 S

springboot3.x使用@NacosValue无法获取配置信息的解决过程

《springboot3.x使用@NacosValue无法获取配置信息的解决过程》在SpringBoot3.x中升级Nacos依赖后,使用@NacosValue无法动态获取配置,通过引入SpringC... 目录一、python问题描述二、解决方案总结一、问题描述springboot从2android.x

Nginx服务器部署详细代码实例

《Nginx服务器部署详细代码实例》Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,:本文主要介绍Nginx服务器部署的相关资料,文中通过代码... 目录Nginx 服务器SSL/TLS 配置动态脚本反向代理总结Nginx 服务器Nginx是一个‌高性

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++