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指向同一个空间,在销毁其中一个的时候,会先将该空间数据销毁,再销毁该空间,会使得剩下的一个指针变成野指针

自定义智能指针

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习(生成式模型)——DDIM:Denoising Diffusion Implicit Models

文章目录 前言为什么DDPM的反向过程与前向过程步数绑定DDIM如何减少DDPM反向过程步数DDIM的优化目标DDIM的训练与测试 前言 上一篇博文介绍了DDIM的前身DDPM。DDPM的反向过程与前向过程步数一一对应&#xff0c;例如前向过程有1000步&#xff0c;那么反向过程也需要有1000步&a…

算法通关村第四关-黄金挑战栈的经典问题

括号匹配问题 描述 : 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有…

ZYNQ连载01-ZYNQ介绍

ZYNQ连载01-ZYNQ介绍 1. ZYNQ 参考文档&#xff1a;《ug585-zynq-7000-trm.pdf》 ZYNQ分为PS和PL两大部分&#xff0c;PS即ARM&#xff0c;PL即FPGA&#xff0c;PL作为PS的外设。 2. 方案 ZYNQ7020为双核A9架构&#xff0c;多核处理器常用的运行模式为AMP(非对称多处理)和…

Flume 快速入门【概述、安装、拦截器】

文章目录 什么是 Flume&#xff1f;Flume 组成Flume 安装Flume 配置任务文件应用示例启动 Flume 采集任务 Flume 拦截器编写 Flume 拦截器拦截器应用 什么是 Flume&#xff1f; Flume 是一个开源的数据采集工具&#xff0c;最初由 Apache 软件基金会开发和维护。它的主要目的是…

9、电路综合-基于简化实频的任意幅频响应的微带电路设计

9、电路综合-基于简化实频的任意幅频响应的微带电路设计 网络综合和简化实频理论学习概述中的1-8介绍了SRFT的一些基本概念和实验方法&#xff0c;终于走到了SRFT的究极用途&#xff0c;给定任意响应直接综合出微带电路。 1、任意幅频响应的微带电路设计用途 我们演示了采用…

Python皮卡丘

系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595.blog.csdn.net/article/details/1295031234漂浮爱心https://want…

[C++]命名空间等——喵喵要吃C嘎嘎

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

Python爬虫实战(六)——使用代理IP批量下载高清小姐姐图片(附上完整源码)

文章目录 一、爬取目标二、实现效果三、准备工作四、代理IP4.1 代理IP是什么&#xff1f;4.2 代理IP的好处&#xff1f;4.3 获取代理IP4.4 Python获取代理IP 五、代理实战5.1 导入模块5.2 设置翻页5.3 获取图片链接5.4 下载图片5.5 调用主函数5.6 完整源码5.7 免费代理不够用怎…

C++ 自引用指针this(整理)

使用例子&#xff1a; #include <iostream> #include <Windows.h> using namespace std; class A { public:A(int x1){x x1;}void disp(){cout<<"this"<<this<<" when x"<<this->x<<endl;} private:int x;…

【工具使用】NPS内网穿透工具介绍

文章目录 前言一、内网穿透二、NPS概述三、NPS原理四、NPS服务器搭建(一)云服务器配置 五、NPS内网穿透演示(一)演示案例一(二)演示案例二 六、NPS内网穿透检测建议(一)流量监控(二)流量协议分析(三)网络行为异常检测 七、NPS内网穿透防范建议(一)阻止或隔离流量(二)更新和强化…

14技术太卷我学APEX-RESTful服务全自动Autorest

Oracle REST 数据服务 (ORDS) 的 AutoREST 功能&#xff0c;该功能允许您将表和视图等自动公开为 RESTful Web 服务。这个太好可不用自己费劲巴拉的定义RESTful数据服务了。 1 先准备测试数据表 登录APEX现在开发平台 [https://apex.oracle.com/pls/apex/r/apex/workspace-si…

Unity UniTask【安装】

窗口→包管理器&#xff0c;输入GitURL&#xff1a;https://github.com/Cysharp/UniTask.git?pathsrc/UniTask/Assets/Plugins/UniTask 如果上述方式不行&#xff0c;那就直接导入UniTask包&#xff0c;下载地址&#xff1a;Unity3D异步神器UniTask2.4.1包资源-CSDN文库

DBA笔记(1)

目录 1、rpm yum 命令的使用&#xff0c;参数的含义 rpm命令&#xff1a; yum命令&#xff1a; 2、上传镜像至虚拟机搭建本地yum源 3、chown chomd 命令每一个参数的含义 chown命令&#xff1a; chmod命令&#xff1a; 4、fdisk partd 硬盘分区命令用法 fdisk命令&am…

Seata入门系列【15】@GlobalLock注解使用场景及源码分析

1 前言 在Seata 中提供了一个全局锁注解GlobalLock&#xff0c;字面意思是全局锁&#xff0c;搜索相关文档&#xff0c;发现资料很少&#xff0c;所以分析下它的应用场景和基本原理&#xff0c;首先看下源码中对该注解的说明&#xff1a; // 声明事务仅在单个本地RM中执行 //…

【错误解决方案】ModuleNotFoundError: No module named ‘ngboost‘

1. 错误提示 在python程序&#xff0c;尝试导入一个名为ngboost的模块&#xff0c;但Python提示找不到这个模块。 错误提示&#xff1a;ModuleNotFoundError: No module named ‘ngboost‘ 2. 解决方案 出现上述问题&#xff0c;可能是因为你还没有安装这个模块&#xff0c;…

探索环幕投影系统在沉浸式展厅设计中的应用优势

伴随着数字化时代的快速发展&#xff0c;以往的静态展示方式已经无法满足人们对内容展览展示的需求&#xff0c;因此需要利用先进的多媒体互动技术&#xff0c;来提升观众的参观体验&#xff0c;而其中环幕投影系统便是用于建设沉浸式空间的主流技术之一&#xff0c;其被应用在…

【Linux】Linux的安装以及常见命令

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Linux的相关操作吧 一.Linux的安装 1.创建虚拟机 2.选择linux 3.配置虚拟机 4.开启虚拟机 默认回车即可 5.安装linux 5.登录账户 6.解决网络问题 ①先查看一下…

宇信科技:强势行业加速融入AIGC,同时做深做细

【科技明说 &#xff5c; 重磅专题】 大家可能没有想到&#xff0c;一向对外低调行事的宇信科技&#xff0c;在AIGC方面2023年就已经训练出了适配金融场景的垂直模型&#xff0c;并应用到了各产品线上&#xff0c;同时结合通用大模型预研了宇信金融系统编程大模型。宇信金融系…

IDEA优雅自动生成类注释和快捷键生成方法注释

生成类注释 Preferences->Editor->File and Code Templates-> Includes ->File Header 注释模板&#xff1a; /*** Classname ${NAME}* Description ${description}* Date ${DATE} ${TIME}* Created by ZouLiPing*/生成方法和字段注释 查看IDEA自动配置java快捷…

Qwt QwtScaleDraw自定义坐标轴

1.概述 QwtScaleDraw 是 Qt 绘图库 Qwt 中的一个类&#xff0c;用于绘制坐标轴刻度线和刻度标签。它提供了一些方法和属性来设置刻度线和标签的样式、布局和对齐方式。 以下是类继承关系&#xff1a; 2.常用方法 标签相关方法&#xff1a; setLabelRotation(double angle)&…