C++的智能指针如何赋值

2023-11-04

随着C++语言的发展,出现了一个新的功能,那便是:智能指针。而智能指针如何赋值,我来在此探讨一下。

目录

1.如何给新创建的智能指针赋值

2.将普通指针赋值给智能指针

3.智能指针赋值给智能指针

shared_ptr互相之间赋值

unique_ptr互相之间赋值


1.如何给新创建的智能指针赋值

智能指针初始化的方法如下所示:

//shared_ptr智能指针初始化方法如下:
shared_ptr<类型名>=make_shared<类型名>();
//unique_ptr智能指针初始化方法如下:
unique_ptr<类型名>=make_unique<类型名>();

这实质上是在通过构造函数赋值。其中最末尾的括号中填的是构造函数参数。比方说你建了一个类名为Position,构造函数为两个double函数x和y,你想声明一个Position类的智能指针,可以按如下方式赋值:

unique_ptr<Position> position=make_unique<Position>(1.0,2.0);

而这相当于给普通指针这样赋值:

Position *pos=new Position(1.0,2.0);

总之,最后的括号里写的参数,相当于普通指针初始化时,new xxx后边的括号里写的参数。

2.将普通指针赋值给智能指针

将普通指针赋值给智能指针的方法如下:

//定义一个Position类的普通指针
Position* pos=new Position(1.0,2.0);
//定义一个Position类的智能指针名为pos1,并将pos的值赋给该智能指针
unique_ptr<Position> pos1(pos);

shared_ptr也是同理。

值得一提的是,如果你要赋值给智能指针的普通指针,不是新new出来的,而是像从变量里取的指针,或者从其他智能指针里get出来的话,那么用这种方法有可能会失败。解决方法是,可以再新建一个普通指针并初始化,然后用memcpy函数将原先普通指针里的内容拷贝到新建的普通指针里,然后再用以上方式,将新建的普通指针赋值给智能指针。

示例如下:

Position pos(1.0, 2.0);
Position* pos2=new Position();
std::memcpy(pos2, &pos, sizeof(pos));
std::unique_ptr<Position> pos1(pos2);//shared_ptr也同理

memcpy函数的用法是这样的:

memcpy(目标地址,源地址,数据大小)

前两个参数是指针类型,表示要将第二个参数所指向的地址里的值赋值给第一个参数所指向的地址。第三个参数是所要复制的内存空间大小。

值得一提的是,在使用memcpy进行拷贝之前,目标指针也是要先初始化的。

3.智能指针赋值给智能指针

shared_ptr互相之间赋值

将一个shared_ptr的值赋值给另一个shared_ptr,只需要用=号直接赋值就可以了。

std::shared_ptr<Position> position = std::make_shared<Position>(1.0, 2.0);
std::shared_ptr<Position> position2 = position;

unique_ptr互相之间赋值

unique_ptr互相之间赋值不能使用=直接赋值。将一个unique_ptr中的变量值传给另一个unique_ptr可参考如下代码:

std::unique_ptr<Position> position = std::make_unique<Position>(1.0, 2.0);
std::unique_ptr<Position> position2(std::move(position));

注:文中的Position是我自己写的测试用类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++的智能指针如何赋值 的相关文章

  • 在c++中定义一堆静态方法

    哪个是合适的 class xyz static int xyzOp1 static int xyzOp2 OR namespace xyz static int xyzOp1 static int xyzOp2 当我们使用类标签与命名空间标
  • 在 XML 中,带问号的节点叫什么?在 C# 中如何添加它们?

    以下是在 InfoPath 中创建的 XML 文件的示例
  • asp:repeater 折叠表行 - 已更新

    我想知道是否有人对我的问题有创造性的解决方案 我有一个从我的数据库填充的转发器 如下所示
  • -ffast-math 可以安全地用于典型项目吗?

    在回答我建议的问题时 ffast math 有评论指出这是危险的 我个人的感觉是 在科学计算之外 是可以的 我还假设严肃的金融应用程序使用定点而不是浮点 当然 如果你想在你的项目中使用它 最终的答案是在你的项目上测试它 看看它有多大影响 但
  • 如何配置 Ninject 来注入 NodaTime IClock

    在我的 NinjectConfigurator 中我有 container Bind
  • 如何在 Google Mock 中使用可选参数来模拟方法?

    如何使用可选参数模拟方法谷歌模拟 例如 class A public void set enable bool enabled true class MockA public A MOCK METHOD1 set enable void b
  • 图片框、双击和单击事件

    我有一个奇怪的问题 我有一个图片框双击事件以及单击事件 问题是即使我双击该控件 也会引发单击事件 如果我禁用单击事件 则双击事件正在工作 这个问题已经在这里讨论过 https stackoverflow com questions 1830
  • 如何在 Windows 上的 GCC 中链接 CS50 C 库

    我是 编程新手 一直在尝试使用以下命令编译我的代码MinGW https en wikipedia org wiki MinGW GCC 但我尝试包括CS50 https en wikipedia org wiki CS50 cs50 c
  • 我应该使用字节还是int?

    我记得曾在某处读到 即使您只需要字节 使用 Int32 更好 就性能而言 它 据说 仅适用于您不关心存储的情况 这是有效的吗 例如 我需要一个保存一周中某一天的变量 我是吗 int dayOfWeek or byte dayOfWeek E
  • .Net 支持柯里化泛型吗?

    假设我们有一个嵌套的泛型类 public class A
  • 将两个垂直滚动条相互绑定

    我在控件中有两个 TextBox 并且它们都有两个 VerticalScrollBar 我想在它们之间绑定 VerticalScrollBars 如果一个向上 第二个也会向上等等 如果可以的话我该怎么做 Thanks 不是真正的绑定 但它有
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com
  • 对象变空似乎是 Hangfire 中的反序列化问题

    Hangfire 似乎无法反序列化我的原始版本Scheduler对象及其所有状态 我正在调用其 Execute 方法BackgroundJob Enqueue 如下所示 Scheduler new FileInFileOut FileIn
  • Qt - 添加超链接到对话框

    有没有办法在 Qt 对话框中添加可点击的超链接 IE 它应该看起来像一个超链接 蓝色文本 当您单击它时 它应该在浏览器中打开该超链接 像这样的东西 Use QLabel setOpenExternalLinks bool 并在标签上设置文本
  • 用 std::generate_n 填充 std::map

    我想填写一个std map using std generate n但无法让它发挥作用 我尝试过的是这样的事情 unsigned number of pairs 5 std map
  • 在 C 中运行 setuid 程序的正确方法

    我有一个权限为4750的进程 我的Linux系统中存在两个用户 root 用户和 appz 用户 该进程继承以 appz 用户身份运行的进程管理器的权限 我有两个基本惯例 void do root void int status statu
  • C 中的等效 plpgsql 触发器

    我有一个 PostgreSQL 9 0 服务器 并且在某些表上使用继承 因此我必须通过如下触发器模拟外键 CREATE OR REPLACE FUNCTION othertable before update trigger RETURNS
  • 如何正确处置注入的DLL线程?

    我将一个 DLL 注入到目标进程中 以在玩 MMORPG 时充当助手 当前功能将按键转换为鼠标点击 因为 MMORPG 要求用户移动鼠标才能实现某些功能 这是我所鄙视的 假设我出于某种原因想要取消注入 DLL 我该怎么做呢 这个方法干净吗
  • Web 和 winforms 的 .Net 身份验证

    我有一个为客户端构建的 ASP NET Web 应用程序 它使用默认的 ASP NET 表单身份验证 他们现在请求一个能够 与 Web 应用程序一起工作的桌面 WinForms 应用程序 我已经创建了 Web 服务来访问他们想要从 Web
  • 在派生类中访问基类变量

    class Program static void Main string args baseClass obj new baseClass obj intF 5 obj intS 4 child obj1 new child Consol

随机推荐

  • 海南省工业学校计算机,直播预告丨特色职教育英才!7日下午邀你“云”探访海南省工业学校...

    新海南客户端 南海网 南国都市报7月6日消息 记者 杜倬荷 你想知道电工电子与自动化实训基地究竟长什么样吗 汽车运用与维修实训都有哪些内容 由新海南客户端 南海网 南国都市报联合推出的 建设自贸港 我们一起来 海南中职院校直播探校系列活动
  • [源码和文档分享]Python实现基于AdaBoost算法的微博情感分类系统

    摘 要 随着互联网的快速发展 各类社交媒体平台如微信 QQ等也与日俱增 而微博更是集成了传统网站 论坛 博客等的优点 并加上了人与人之间的互动性 关系亲密程度等多种智能算法 并以简练的形式让数据爆发性的传播 促进了人与人之间的交流 网民可以
  • for循环作用域问题(var和let)

    看这个 var arr for var i 0 i lt 10 i arr i function console log i arr 0 10 arr 1 10 arr 2 10 arr 3 10 还有这个 ul li 1 li li 2
  • 华为服务器格式化系统,服务器操作系统格式化

    服务器操作系统格式化 内容精选 换一换 本文以云服务器的操作系统为 Windows Server 2008 R2 Standard 64bit 磁盘容量为3 TB举例 提供容量大于2 TB的Windows数据盘的初始化操作指导 MBR格式分
  • Microsoft 365的密钥

    Microsoft 365 的密钥是一个字符串 用于激活 Microsoft 365 订阅 它是唯一的 并且需要在订阅期间进行激活 以便可以使用所订阅的服务 如果您没有密钥 或者密钥无效 您将无法使用 Microsoft 365 服务
  • 高并发之API接口限流

    在开发高并发系统时有三把利器用来保护系统 缓存 降级和限流 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时 需要暂时屏蔽掉 待高峰或者问题解决后再打开 限流 限流的目的是通过对并发访问
  • cadence allegro 封装焊盘编号修改 (引脚编号修改)

    1 打开dra文件在find里面 off all 然后只点击text 2 点击需要更改的焊盘 3 菜单栏edit text 4 弹出窗口修改即可 注意 按照网上的其他操作并没有执行步骤1操作 我尝试过不好使 由于项目需要应用多年的AD软件转
  • 【面试】linux && gdb

    Linux Linux开发你们怎么上传文件的 gdb linux断点所有线程都会停住吗 GDB查看所有线程栈命令 当程序在gdb下因任何原因停止时 例如达到断点 所有执行线程都将停止 而不仅仅是当前线程 Linux上传文件的方法 mac s
  • C# NPOI 创建Excel

    C NPOI 创建Excel NPOI是一个供给C 操作导入或导出Excel的开源工具 NET版本 NET 5 NPOI版本 2 6 0 基本使用思路 创建工作薄 Workbook 工作薄 Workbook 中创建工作表 WorkSheet
  • MySQL 深度分页性能急剧下降,该如何优化?

    1 背景 mysql使用select limit offset rows分页在深度分页的情况下 性能急剧下降 例如 select 的情况下直接 limit 600000 10 扫描的是约60万条数据 并且是需要回表60W次 也就是说 部分性
  • 《Effective C++》学习笔记——区分接口继承和实现继承

    派生类public继承自基类 其中函数均是接口继承 实现继承又分为缺省继承与强制继承 对应着虚函数与非虚函数 我们在做项目时 对于任何事物都要抱有先描述再组织的心态 因此 当描述事物为其构建框架尤其是存在继承 is a 关系时 一定要搞清楚
  • centos配置telnet

    安装telnet yum install xinetd y yum install telnet server y yum install telnet y 2 启动xinetd服务和telnet服务 systemctl start xin
  • Vue双向数据绑定指令——v-mode

    前面我讲了V bind指令 该指令只能实现数据的单向绑定 从M自动绑定到V 无法实现数据的双向绑定 不能将数据传回mv控制的m中 也就是不能将数据传回逻辑层 这样前端和逻辑层便不能进行数据交互 为解决此问题 v model指令应运而生 v
  • 用生成数据做好隐私保护|Betterdata

    近年来 数据隐私保护正成为人们高度关注的问题 而匿名性并不能够从根本上解决数据泄露的困扰 此时 合成数据集 的方式正在成为数据保护的有效方法 Betterdata Betterdata 是一款生成合成数据的工具 在不影响准确度和隐私安全的前
  • SAR动目标检测系列:【2】多通道动目标检测

    在SAR的动目标检测应用中 要到达更好的检测性能 必须依赖于多通道检测方案 前文讲了单通道MTI的方法 与单通道系统相比 多通道SAR系统增加了系统自由度 可以通过杂波抑制提高运动目标的图像信杂噪比 改善系统的最小可检测速度和定位能力 同时
  • 将DataFrame某列中的空值填充为0

    客户需求 将空值填充为0 数据存储情况如下 python代码如下 import pandas as pd 获取数据 df pd read excel test xlsx sheet name test print 查看数据 print df
  • 十大程序员最实用的技术社区网站

    今天给大家整理一份国内程序员最实用的开源社区网站清单 希望可以给大家带来一点帮助 第一名 CSDN 中国专业IT社区CSDN Chinese Software Developer Network 创立于1999年 致力于为中国软件开发者提供
  • 【C语言链表实现】学生成绩管理系统(功能全面,通俗易懂)

    学生成绩管理系统 1 问题描述 2 概要设计 2 1 系统主要执行逻辑 2 2 函数调用关系 3 函数实现 3 1 头文件 3 2 核心数据结构设计 3 3 密码登录 3 4 界面菜单 3 5 保存学生信息 3 6 读取学生信息 3 7 录
  • pydantic学习与使用-13.Field 定制字段使用别名alias

    前言 pydantic 里面json是一个内置属性 我想定义一个字段名称是json 这就会引起报错 Field name json shadows a BaseModel attribute use a different field na
  • C++的智能指针如何赋值

    随着C 语言的发展 出现了一个新的功能 那便是 智能指针 而智能指针如何赋值 我来在此探讨一下 目录 1 如何给新创建的智能指针赋值 2 将普通指针赋值给智能指针 3 智能指针赋值给智能指针 shared ptr互相之间赋值 unique