C++基础::shared_ptr 编程细节(一)

C++基础::shared_ptr 编程细节(二)

C++基础::shared_ptr 编程细节(三)

*sp 与 sp.get()

  • sp.get():返回存储(所持有)的 pointer,也即被持有物的地址
  • *sp:返回拥有的对象

三种初始化的方法

  • 基本的单参构造

    shared_ptr<string> pNico(new string("nico"));

    由于“接受单一 pointer 作为唯一实参”的构造函数是 explicit,

    shared_ptr<string> pNico = new string("nico");// ERROR
    shared_ptr<string> pNico{new string("nico")};
  • 使用便捷函数 make_shared

    shared_ptr<string> pNico = make_shared<string>("nico");
  • 先声明,再 reset

    std::shared_ptr<std::string> pNico;
    pNico = new std::string("nico");// ERROR: no assignment for ordinary pointers(对普通指针而言没)
    pNico.reset(new std::string("nico"));

operator ==(shared_ptr对象的相等性比较)

首先来看 shared_ptr相等操作符(equality operator)的实现形式,

template<class T, class U> inline bool operator==(shared_ptr<T> const & a, shared_ptr<U> const & b)
{return a.get() == b.get();
}

而 shared_ptr<T>的get()成员返回的是所持有物的地址,若不拥有对象则返回 nullptr。

class A
{
public:A(int){}
};int main(int, char**)
{shared_ptr<A> pA = make_shared<A>(5);shared_ptr<A> pA2 = pA;std::cout << std::boolalpha << (pA == pA2) << std::endl;std::cout << (pA.get() == pA2.get()) << std::endl;// true,true// 以上两个判断等价,其实比较的是指针,也即是否指的是同一对象std::cout << (*pA == *pA2) << s;// ERROR// 此时比较的不是指针,而是对象本身,// 两个类实例的operaotr ==,要求必须在类的内部给出operator==的实现return 0;
}

也即:

  • sp1 == sp2

    sp1.get() == sp2.get()比较的是两个指针是否相同,也即两个 shared_ptr 对象是否持有的是对同一个对象的指针,其实这种比较更为严格,因为这里比较的是两者是否是同一件东西

  • *sp1 == *sp2

    比较的是对象是否相等,如果是类类型,类的内部需要给出operator==的实现,否则出错,如果是基本类型,则比较的是其值;

C++基础::shared_ptr 编程细节(二)相关推荐

  1. C++基础::shared_ptr 编程细节(三)

    C++基础::shared_ptr 编程细节(一) C++基础::shared_ptr 编程细节(二) C++基础::shared_ptr 编程细节(三) boost::shared_ptr std: ...

  2. C++基础::shared_ptr 编程细节(一)

    C++基础::shared_ptr 编程细节(一) C++基础::shared_ptr 编程细节(二) C++基础::shared_ptr 编程细节(三) 智能指针是c++ 中管理资源的一种方式,用智 ...

  3. 编程之基础:数据类型(二)

    相关文章连接: 编程之基础:数据类型(一) 高屋建瓴:梳理编程约定 动力之源:代码中的"泵" 完整目录与前言 编程之基础:数据类型(二)    3.1 引用类型与值类型    41 ...

  4. 实体类 接口_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)

    原文:Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口, 视频讲解) 这里分享三道编程题, 下面是我个人的视频讲解 二维数组, 五子棋游戏, 实体类和接口_哔哩哔哩 (゜-゜)つロ ...

  5. C# Revit二次开发基础/核心编程---建筑建模-标高和轴网

    一.本节课程 C# Revit二次开发基础/核心编程---建筑建模-标高和轴网 二.本节要讲解的知识点 1.标高的高度.创建标高 2.轴网曲线.创建轴网 具体内容 1.标高 标高是有限水平平面,大多数 ...

  6. C# Revit二次开发基础/核心编程--- Application\Document\Transaction

    一.本节课程 C# Revit二次开发基础/核心编程--- Application\Document\Transaction 二.本节要讲解的知识点 Application\Document\Tran ...

  7. 【Scheme】Scheme 编程学习 (二) —— 基础

    [Scheme]Scheme 编程学习 (二) -- 基础 文接前一节内容 : [Scheme]Scheme 编程学习(一) -- 概述 本文章可以跟视频课程一起看,做了一些补充说明 原视频地址: B ...

  8. PHP编程基础实验二之php基础语法编程(四)

    实验2-4  PHP基础语法编程(四) 1.实验学时 2学时 2.实验目的 1.进一步熟悉 PHP 基本语法: 2.掌握 PHP 中字符串数据的定义与常用处理方法: 3.掌握 PHP 中数组数据的定义 ...

  9. b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释

    b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释 继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更 ...

最新文章

  1. 一位人工智能总监对AI行业的【实话实说】
  2. java中的抛出异常throws与throw
  3. CF 19D Points 【线段树+平衡树】
  4. 【我的Android进阶之旅】Android自定义Lint实践
  5. android listview ontouchlistener,Android ListView监听滑动事件的方法(详解)
  6. python程序打包成安卓app教程_Python打包方法基本应用方式介绍
  7. oracle 时间加减
  8. JEECG移动方案 - 应用系统转换移动应用的中间件实现方案
  9. python-类的装饰器
  10. Opencv笔记(十八)——轮廓的更多函数及其层次结构
  11. 如何做组间差异检验_买套餐送车险,做维修提供代步车,考拉爱车如何实现差异化竞争?...
  12. Android Native Hook工具
  13. 如何实现一张图片覆盖窗体 - 回复 客栈老人 的问题
  14. 基于SSM的酒水商城系统
  15. hibernate官网文档
  16. Zemax操作38--POP(物理光学传播)的用法
  17. springboot 自定义starter
  18. 中国大学慕课python答案 北京理工大学_中国大学MOOC慕课_Python语言程序设计_慕课答案...
  19. Java - Certificate has been revoked
  20. vmware linux dns,vmware环境下在linux中创建dns服务器

热门文章

  1. Navicat加载缓慢
  2. Spark Streaming之Window Operations操作和解析
  3. python set_Python的set集合详解
  4. iostream stdlib fstream io.h 头文件的作用
  5. OpenCV实现立体视觉的案例
  6. python 设计模式之装饰器模式 Decorator Pattern
  7. VMware ESXi 虚拟机硬盘格式:精简置备、厚置备延迟置零、厚置备置零
  8. [文摘20071008]全国软考相关-计算机技术与软件专业资格(水平)考试
  9. UVA1363 LA3521 POJ2800 ZOJ2646 Joseph‘s Problem【约瑟夫环+数学】
  10. HDU2049 不容易系列之(4)——考新郎【递推】