C++ 指针

*放在哪里?

如果声明一个变量:int* b;

如果声明多个变量:int a,*b,*c;

nullptr

c++11中NULL的变形,是一个特殊值,可以赋给任意类型的指针,代表该指针指向为空。

this指针

this指针不是一个const Test*(常量指针),而是一个Test *const(指针常量/常指针)

类的成员函数尾部出现const,修饰的是this指针,形如返回值类型 函数名() const

成员函数隐含定义this指针,接受调用对象的地址

1.若类成员函数的形参和类的属性名字相同,通过this指针来解决,this可以指向对象本身。

类中成员变量叫做属性,类中成员函数叫做方法。

2.类的成员函数可通过const修饰

函数指针

指向函数的指针

函数指针用于指向一个函数,函数名是函数体的入口地址

声明定义

定义

通过函数类型定义函数指针

FuncType* pointer;

直接定义

type(*pointer)(parameter list);

pointer函数指针变量名

type指向函数的返回值类型

parameter list指向函数的参数类型列表

函数指针做函数参数

当函数指针作为函数的参数,传递给一个被调用函数,被调用函数就可以通过这个指针调用外部的函数,这就形成了回调。

回调函数的优点

1.函数的调用和函数的实现有效的分离
2.类似C++的多态,可扩展
现在这几个函数是在同一个文件当中
int libfun(int (*pDis)(int a,int b))
是一个库中的函数,就只有使用回调了,通过函数指针参数将外部函数地址传入来实现调用。
函数 add 的代码作了修改,也不必改动库的代码,就可以正常实现调用便于程序的维护和升级。

回调函数的本质

提前做了一个协议的约定(把函数的参数、函数返回值提前约定)。

解引用与智能指针

常规意义上讲,new和malloc出来的堆上的空间,都需要手动delete和free的。但在其它高级语言中,只需要申请不需要释放的功能是存在的。

常规引用

广义智能指针

生命周期结束的时候,自动销毁指向的数据,然后释放空间

优点

1.不用手动释放空间

狭义智能指针

shared_ptr

shard_ptr<int> p1(new int(2));

shard_ptr<int> p2=p1;

p2->use_count();//计数有多少个智能指针指向该空间

当计数为0时,该空间销毁。先进行减少计数,计数减少之后判断计数是否为0,若为0,则销毁该shard_ptr<int>空间,先销毁数据,再销毁空间

int *p=new int;//该操作会引发一个大的问题,销毁时出现问题

shared_ptr<int> it(p);

shared_ptr<int> it2(p);//分别是两个计数,计数钧为1,it销毁的时候,该空间销毁,it2销毁的时候,该空间再次销毁

shared_ptr<int> it3(it3);//计数变为2,若只有it2,it3(无it)销毁遵循先减少后判断

不可作为返回值,因为他会销毁自身数据,然后销毁空间,那么都销毁数据了,还返回什么呢?借助一下操作可解决该问题

class A :public std::enable_shared_from_this<A> {

shared_ptr<A> self() {

return shared_from_this();

}

};

class A{

shard_ptr<B> i;

};

class B{

shard_ptr<A> i;

};

int main(){
A a;

B b;

a.i=b;

b.i=a;

}

错误操作,不能相互指向,这样的话,在销毁a的时候会先销毁b;在销毁b的时候会先销毁a。

不能指向动态数组,写一个函数(删除器),用于指定怎样进行析构,即析构的时候调用该函数,作为第二个参数

shared_ptr <int[]> p(new int[10]);

auto it=make_shared<int>(100);

模板

void p(){}

shared_ptr<int> a(new int,p)//p类型是函数指针

weak_ptr

与shared_ptr配套使用,相当于一个普通指针,不会引发计数增加,本身与shared_ptr无关

只能用shared_ptr与weak_ptr初始化

指向的对象不会被销毁,只是自己被销毁

使用的时候会和一个shared_ptr有关系

use_count计数的是shared_ptr

expired返回weak_ptr指向的对象是否被释放

不能进行解引用/->,lock()返回shared_ptr类型的指针,其指向的对象与weak_ptr指向的对象相同

unique_ptr

类似于auto,但是,一个指针只能指向一个空间,多个指针指向同一个空间会报错

可以指向一个数组,并且将其析构

unique_ptr <int[]> p(new int[10]);

模板

void p(){}

unique_ptr<int,void(*)()> p(new int,p)//p使用第二个模板参数作为类型

auto_ptr

auto_ptr<int> p1(new int(2));

auto_ptr<int> p2=p1;

//p1和p2指向同一个空间,在销毁其中一个的时候,会先将该空间数据销毁,再销毁该空间,会使得剩下的一个指针变成野指针

自定义智能指针

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/124775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于ABB 机器人多任务的建立

关于ABB 机器人多任务的建立.需要实时监控某一区域&#xff0c;或者某一信号&#xff0c;或者计件到达某一数量机器人自动停止报警&#xff0c;显示到示教器上&#xff0c;多任务可以实现&#xff0c;类似发那科机器人后台逻辑指令 当软件选项漏选或者少选可以选择修改选项&…

新恶意软件使用 MSIX 软件包来感染 Windows

人们发现&#xff0c;一种新的网络攻击活动正在使用 MSIX&#xff08;一种 Windows 应用程序打包格式&#xff09;来感染 Windows PC&#xff0c;并通过将隐秘的恶意软件加载程序放入受害者的 PC 中来逃避检测。 Elastic Security Labs 的研究人员发现&#xff0c;开发人员通常…

pycharm使用ssh连接远程jupyter

1. 安装jupyter pip install jupyter2. 生成jupyter_notebook_config.py文件 jupyter notebook --generate-config3. 设置命令参数 jupyter notebook --no-browser --allow-root --port 8900配置Jupyter服务器 将上面的代码复制到命令行实参中&#xff1a;

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割7(数据预处理)

在上一节&#xff1a;【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6&#xff08;数据预处理&#xff09; 中&#xff0c;我们已经得到了与mhd图像同seriesUID名称的mask nrrd数据文件了&#xff0c;可以说是一一对应了。 并且&#xff0c;mask的文件&#xff0c;还根据结…

设计模式_状态模式

状态模式 介绍 设计模式定义案例问题堆积在哪里解决办法状态模式一个对象 状态可以发生改变 不同的状态又有不同的行为逻辑游戏角色 加载不同的技能 每个技能有不同的&#xff1a;攻击逻辑 攻击范围 动作等等1 状态很多 2 每个状态有自己的属性和逻辑每种状态单独写一个类 角色…

git本地搭建服务器[Vmware虚拟机访问window的git服务器]

先按照https://zhuanlan.zhihu.com/p/494988089说明下载好Gitblit然后复制到tomcat的webapps目录下,如下: 双击"startup.bat"启动tomcat: 然后访问"http://127.0.0.1:8080/gitblit/"即可看到git的界面: 说明git服务器已经能够成功运行了! Vmware虚拟机…

k8s基本操作命令

目录 1、//查看资源对象简写 2、//查看集群信息 3、//配置kubectl自动补全 4、//node节点查看日志 5、//查看 master 节点状态 6、//查看命令空间 7、//查看default命名空间的所有资源 8、//创建命名空间app 9、//删除命名空间app 10、//在命名空间kube-public 创建…

Java电商平台 - API 接口设计之 token、timestamp、sign 具体架构与实现|电商API接口接入

一&#xff1a;token 简介 Token&#xff1a;访问令牌access token, 用于接口中, 用于标识接口调用者的身份、凭证&#xff0c;减少用户名和密码的传输次数。一般情况下客户端(接口调用方)需要先向服务器端申请一个接口调用的账号&#xff0c;服务器会给出一个appId和一个key, …

anaconda+tensorflow安装完整步骤【亲测可用】

anacondatensorflow安装完整步骤 anaconda安装tensorflow1.安装anaconda2.下载windows版本进行下载并安装3.打开Anaconda Prompt4. 安装tensorflow PyCharm下载与安装1.官网下载pycharm社区版2.PyCharm环境配置3.测试 anaconda安装tensorflow 1.安装anaconda 官网下载anacond…

常用排序算法的理解

1.插入排序 插入排序的思想是将一个记录插入到已经排好序的有序表中&#xff0c;从而形成一个新的、记录数加1的有序表。在其实现过程使用双层循环&#xff0c;外层循环是进行插入的次数&#xff08;也可以理解为比较的轮数&#xff09;&#xff0c;内层循环是当前记录查找插入…

centos部署tomcat

Java Downloads | Oracle 上面是下载网址 Tomcat是由Apache开发的一个Servlet容器&#xff0c;实现了对Servlet和JSP的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台&#xff0c;安全域管理和Tomcat阀 简单来说&#xff1a;Tomcat…

Django之登录注册

最近在准备上线一个网站&#xff08;基于django的编程技术学习与外包服务网站&#xff09;&#xff0c;所以会将自己的在做这个项目的过程中遇到的模块业务以及所涉及到的部分技术记录在CSDN平台里&#xff0c;一是希望可以帮到有需要的同学&#xff0c;二十以供自己后续回顾学…

RabbitMQ生产者的可靠性

目录 MQ使用时会出现的问题 生产者的可靠性 1、生产者重连 2、生产者确认 3、数据持久化 交换机持久化 队列持久化 消息持久化 LazyQueue懒加载 MQ使用时会出现的问题 发送消息时丢失&#xff1a; 生产者发送消息时连接MQ失败生产者发送消息到达MQ后未找到Exchange生…

Jetson Xavier NX FFmpeg支持硬件编解码

最近在用Jetson Xavier NX板子做视频处理&#xff0c;但是CPU进行视频编解码&#xff0c;效率比较地下。 于是便考虑用硬解码来对视频进行处理。 通过jtop查看&#xff0c;发现板子是支持 NVENC硬件编解码的。 1、下载源码 因为需要对ffmpeg进行打补丁修改&#xff0c;因此需…

【c++|opencv】一、基础操作---2.图像信息获取

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 图像信息获取&#xff0c;roi 1. 图像信息获取 // 获取图像信息#include <iostream> #include <opencv2/opencv.hpp>using namespace cv; …

JVM与Java体系结构

目录 一、Java虚拟机整体架构祥图 二、Java代码执行过程详图 三、汇编语言、机器语言、高级语言关系 四、JVM的架构模型 五、JVM的生命周期 &#xff08;一&#xff09;虚拟机的启动 &#xff08;二&#xff09;虚拟机的执行 &#xff08;三&#xff09;虚拟机的退出 …

使用示例和应用程序全面了解高效数据管理的Golang MySQL数据库

Golang&#xff0c;也被称为Go&#xff0c;已经成为构建强大高性能应用程序的首选语言。在处理MySQL数据库时&#xff0c;Golang提供了一系列强大的库&#xff0c;简化了数据库交互并提高了效率。在本文中&#xff0c;我们将深入探讨一些最流行的Golang MySQL数据库库&#xff…

数据库管理-第113期 Oracle Exadata 04-硬件选择(20231020)

数据库管理-第113期 Oracle Exadata 04-硬件选择&#xff08;2023010290&#xff09; 本周没写文章&#xff0c;主要是因为到上海参加了Oracle CAB/PAB会议&#xff0c;这个放在后面再讲&#xff0c;本期讲一讲Exadata&#xff0c;尤其是存储节点的硬件选择及其对应的一些通用…

mac安装并使用wireshark

mac安装并使用wireshark 1 介绍 我们在日常开发过程中&#xff0c;遇到了棘手的问题时&#xff0c;免不了查看具体网络请求情况&#xff0c;这个时候就需要用到抓包工具。比较著名的抓包工具就属&#xff1a;wireshark、fildder。我这里主要介绍wireshark。 2 安装 以mac安装为…

C#,数值计算——分类与推理Svmpolykernel的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Svmpolykernel : Svmgenkernel { public int n { get; set; } public double a { get; set; } public double b { get; set; } public double d { get; set; …