《白话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#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT