首页 > 其他分享 >智能指针可以使用的删除器

智能指针可以使用的删除器

时间:2023-08-14 15:03:27浏览次数:39  
标签:调用 函数 删除 int 智能 函数指针 Lambda 指针

智能指针有unique_ptr(独占指针),shared_ptr(共享指针)。

unique_ptr独占式指针,只能由一个智能指针拥有管理指针资源。

shared_ptr则是共享式指针,多个指针对象可以共享同一个指针资源。


C++中,智能指针本质上就是类模板,可以通过定义一个自定义的删除器(Deleter)来指定智能指针在析构时释放资源的方式。智能指针中的删除器可以是一个函数对象(函数指针),函数符或者是Lambda表达式。

函数指针:

函数指针是指向函数的指针变量,可以存储一个函数的入口地址,通过调用该指针变量就可以实现对被指向函数的调用。使用函数指针最常用的场景是作为回调函数,也可以用于实现函数指针数组、函数指针作为函数参数等特殊功能。

// 声明一个返回值为int,带两个int类型参数的函数指针
int (*pfunc)(int, int);

在这个例子中,`int (*pfunc)(int, int)`表示定义了一个指向返回值为int类型、带两个int类型参数的函数指针。我们可以将pfunc指向符合这个函数类型的函数,调用该函数指针时,实际上就是调用被指向函数。

函数符:

函数符是一个重载调用运算符 operator() 的对象或模板类实例,通常称为仿函数(Functor)。函数符可以像函数一样被调用,可以接受参数并返回结果,具有更大的灵活性和自定义性。函数符常用于算法、容器、迭代器等STL模板中。

// 一个返回值为int类型的函数符
struct MyFunc {
    int operator() (int a, int b) const { return a + b; } 
};

在这个例子中,定义了一个名为MyFunc的函数符,重载了函数调用运算符operator()。当函数符对象被调用时,实际上就是在调用这个运算符重载函数。

Lambda表达式

Lambda函数是一种匿名函数,它的定义方式类似于一个函数,但没有名字,可以使用[]包围的捕获列表来捕获外部变量,在()中指定函数参数,在{}中定义函数体。Lambda函数的特点是在定义时生成一个可调用对象,可以将这个对象赋值给一个变量,也可以作为其他函数的参数或返回值,实现了代码更加简洁、易读的目的。


auto func = [](int a, int b) { return a + b; };

在这个例子中,定义了一个匿名函数,通过[]捕获列表捕获外部变量,()中定义函数参数列表,{}中定义函数体,赋值给了一个变量func。可以像调用函数一样使用func(1, 2)来调用Lambda函数。

总之,函数指针、函数符、Lambda函数都是实现函数调用的方法,它们在应用场景和使用方式上有所区别,在具体编程中可以根据需要进行选择。



标签:调用,函数,删除,int,智能,函数指针,Lambda,指针
From: https://blog.51cto.com/u_14834110/7077303

相关文章

  • Socks5代理:跨界电商中的智能抓取利器与全球化安全守护
    一、背景介绍跨界电商已成为企业全球化发展的关键路径。然而,全球市场的多元性使得数据抓取变得复杂且具有挑战性。同时,网络安全问题也不容忽视,尤其是在全球范围内运营时。Socks5代理作为一项强大的技术工具,能够在这些方面发挥关键作用。二、Socks5代理的基础知识Socks5代理概述:Soc......
  • 用del删除类后对象仍然能使用的原因
    classGirl:sex='男'girl=Girl()Girl.sex='人妖'#此行删除Girl类delGirlprint(girl.sex)#仍然能打印出结果“人妖”原因:即使删除了Girl类,由于已经实例化的girl对象仍然存在,所以可以通过girl对象访问类属性sex。删除类只会阻止通过类名访问类......
  • 2018年【计算机视觉+机器学习+人工智能】领域重要会议汇总
    AAAI2018(美国新奥尔良)全称:theAssociationfortheAdvancementofArtificialIntelligence时间:2018.02.02-07地点:HiltonNewOrleansRiverside,NewOrleans,Lousiana,USA介绍:人工智能领域顶级会议官网:https://aaai.org/Conferences/AAAI-18/MMM2018(泰国曼谷)全称:the24rd......
  • 第16周项目2-用指针玩字符串(1)
    问题及代码:/**Copyright(c)2014,烟台大学计算机学院*Allrightsreserved.*文件名称:MADE69.cpp*作者:孙化龙*完成日期:2014年12月11日*版本号:v1.0**问题描述:字符串连接*输入描述:无*输出描述:链接后的字符串*/#include<iostream>usingnamespacest......
  • 第16周项目2用指针玩字符串(2)
    问题及代码:/**Copyright(c)2014,烟台大学计算机学院*Allrightsreserved.*文件名称:MADE70.cpp*作者:孙化龙*完成日期:2014年12月11日*版本号:v1.0**问题描述:去除字符串str中特定的字符,结果仍保存在字符串str中*输入描述:无*输出描述:去除特定字符后的字......
  • 传统企业的智能化IPD(产品集成开发)转型
    我国传统企业在完成建立与市场经济体制相适应的现代企业制度改革后,随着近几十年来的不懈努力,我国综合国力和经济实力不断提升,不少国内传统企业近些年在国内外地位、行业声望、企业利润方面均有大幅增长,呈现出发展速度快、经济效益好的良好局面。但我们同时也清醒地认识到,一直以来国......
  • 人工智能 AI
     人工智能是计算机科学的重要分支,是研究如何利用计算机来模拟人脑所从事的感知、推理、学习、思考、规划等人类智能活动,来解决需要用人类智能才能解决的问题,以延伸人工智能的科学。监督学习是从标记的训练数据来推断一个功能的机器学习任务。训练数据包括一套训练示例。在监督学......
  • CodeGeeX vscode代码提示,智能问答
    CodeGeeX官网https://codegeex.cn/zh-CN/CodeGeeXvscode代码提示,智能问答......
  • C++使用new来初始化指向类的指针
    C++使用new来初始化类的指针1.ClassName*p=newClassName;调用默认构造函数。如果类里没有写默认构造函数,会使用编译器帮我们生成的,但不会初始化成员变量,如classNoConstructor//没写构造函数的类{public:~NoConstructor(){}voidprintVal(){......
  • 196. 删除重复的电子邮箱
    196.删除重复的电子邮箱2023年8月13日19:16:12196.删除重复的电子邮箱简单SQLSchemaPandasSchema表:Person+-------------+---------+|ColumnName|Type|+-------------+---------+|id|int||email|varchar|+-------------+-......