析构和友元函数

1. 类的析构函数

析构函数的作用,用于释放该类所占用的资源(或者说释放对象)在类的对象使用完时(当类的对象超出了作用域),会自动调用析构函数;如果是在堆区实例化的对象,那么当手动释放对象时,会自动调用析构函数

析构函数的原型:~类名()  //析构函数{}
例如:
~People() {//释放指针占用的空间delete p;}

2. 友元

C++提供友元目的是给类的外部提供一个访问类的私有成员的接口,即可以通过友元访问类的私有成员

友:friend

2.1 友元函数

将一个类的成员函数可不可以声明为另外一个类的友元?一个类的成员函数声明为另外一个类的友元,可不可以访问另外一个类的私有成员?

编译器提示错误:不可访问

关键字:friend
格式:friend  函数返回值   函数名(参数列表); //声明一个友元函数
例如:friend  void  function();//function函数是一个友元函数

注意:

友元函数属不属于类的成员?友元函数不是类的成员函数

friend_main.cpp

//友元函数
class People {
public://将function函数声明为People的友元//注意:友元函数不是类的成员函数friend void function(People& people);private:int a=10;//普通类型变量
};//定义一个函数去访问a,因为a是类中私有,一般是访问不到的
//所以我们需要将此函数在类中声明为友元函数
void function(People& people) {cout << "友元函数访问到a = " << people.a << endl;
}int main()
{People people1;function(people1);return 0;
}

2.1.2  练习

使用类和对象以及友元实现算数表达式的求值

例如:2+5+6 -4+4-40的和

main5.cpp
#include "iostream"
using namespace std;//使用类和对象以及友元实现算数表达式的求值
//例如:
//2 + 5 + 6 - 4 + 4 - 40的和class Jia
{
public://构造函数,给属性赋值Jia(int m, int n){a = m;b = n;}//声明友元函数friend void jiaFa(int a1, Jia& jia);void print(){cout << "temp=" << temp << endl;}//声明友元函数friend void update_a(Jia& jia, int a1);int temp;//临时存储结果,方便减法加法之间传递private:int a;int b;
};//加法
void jiaFa(int a1, Jia& jia)
{jia.b = a1;jia.a = jia.a + jia.b;//我们使用a来临时存储结果jia.temp = jia.a; //因为a是私有的在做减法时,需要将之前的结果传递给减法所以我们取出a的值给tmp,时tmp为公有方可传递给减法
}//更新a的值
void update_a(Jia& jia, int a1)
{jia.a = a1;
}class Jian
{
public://声明友元函数friend void jianFa(int a1, int b1, Jian& jian);int temp;//临时存储结果,方便减法加法之间传递
};//减法
void  jianFa(int a1, int b1, Jian& jian)
{jian.temp = a1 - b1;
}int main()
{Jia jia(2, 5);jiaFa(5, jia);jiaFa(6, jia);jia.print();Jian jian;jianFa(jia.temp, 4, jian);//jian.temp=9update_a(jia, jian.temp);//更新a的值,使a中的临时结果,保持最新jiaFa(4, jia);jianFa(jia.temp, 40, jian);cout << "最终的结果:" << jian.temp << endl;return 0;
}

2.2 友元类

关键字:friend
格式:friend  class   类名;   //将类声明为友元
例如:friend class People; 

friend_main.cpp

//友元类
class People {
public://将function函数声明为People的友元//注意:友元函数不是类的成员函数friend void function(People& people);//将Animal声明为友元类friend class Animal;private:int a = 10;//普通类型变量
};class Animal {
public:void print(const People& people) {cout << "animal类中访问到a = " << people.a << endl;}
};//定义一个函数去访问a,因为a是类中私有,一般是访问不到的
//所以我们需要将此函数在类中声明为友元函数
void function(People& people) {cout << "友元函数访问到a = " << people.a << endl;
}int main()
{People people1;function(people1);//友元函数访问Animal animal;animal.print(people1);//友元类访问return 0;
}

3. 经典问题

3.1 构造函数和普通函数的区别:

(1)目的:

构造函数用于在对象被创建时初始化对象的成员变量。它确保对象在被使用之前处于一个合适的状态。

普通函数用于执行一般的任务和操作,它们不关心对象的创建和销毁。

(2)调用时机:

构造函数在对象创建时自动调用,无需显式调用。它们确保对象在被使用前处于有效状态。

普通函数需要在代码中显式调用。

(3)返回类型:

构造函数没有返回类型,包括没有 void。它们只是在对象创建时执行,初始化对象的状态。

普通函数有返回类型,可以返回一个值。

(4)命名:

构造函数的名称与类的名称相同。

普通函数有自定义的名称。

(5)用法:

构造函数主要用于初始化对象的状态,通常包括分配资源、设置默认值等。

普通函数可以执行各种任务,而不涉及对象的创建和销毁。

3.2 析构函数和普通函数的区别:

(1)目的:

析构函数用于在对象被销毁时释放资源、清理对象状态。

普通函数执行一般任务,通常不涉及对象的销毁。

(2)调用时机:

析构函数在对象生命周期结束时自动调用,无需显式调用。

普通函数需要在代码中显式调用。

(3)返回类型:

析构函数没有返回类型,包括没有 void。它们只是在对象销毁时执行清理操作。

普通函数有返回类型,可以返回一个值。

(4)命名:

析构函数的名称与类的名称相同,但前面有一个波浪线 ~。

普通函数有自定义的名称。

(5)用法:

析构函数主要用于释放对象在其生命周期中分配的资源,如动态分配的内存、打开的文件等。

普通函数可以执行各种任务,而不涉及对象的销毁。

3.3 malloc/new和free/delete的区别

    malloc: 

是一个函数。

用于分配一块指定大小的内存块。

返回 void* 类型的指针,因此在使用时通常需要显式地进行类型转换。(需要手动进行类 型转换

不会调用对象的构造函数或析构函数,因为它主要用于分配原始内存。

    new: 

只是一个操作符。

用于在堆上创建一个对象,并调用对象的构造函数。

返回具体类型的指针,不需要显式类型转换。

用于在堆上创建一个对象,并调用对象的构造函数。

    free: 

是一个函数。

用于释放先前由 malloc 分配的内存。

    delete: 

是一个操作符。

用于释放先前由 new 创建的对象,并调用对象的析构函数。

会调用对象的析构函数,用于对象的清理和资源释放。

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

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

相关文章

二分查找——OJ题(一)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、二分查找1、题目讲解2、算法原理3、代码实现 二、在排序数组中查找元素的第一个和最后一个…

Mini MyBatis-Plus(下)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 最核心的内容前两篇已经…

docker 安装可视化工具 Protainer 以及 汉化

一、创建保存数据的卷 安装网址&#xff1a;Install Portainer BE with Docker on Linux - Portainer Documentation docker pull portainer/portainer二、根据portainer镜像创建容器 docker run -d -p 8000:8000 -p 9000:9000\ --name portainer --restartalways \ -v /var/r…

深入ArkUI:深入实战组件text和text input

文章目录 Text组件介绍Text组件的属性方法Text:文本显示组件4.3TextInput组件实战案例:图片宽度控制页面本文总结要点回顾在今天的课程中,我们将深入学习ArkUI提供的基础组件,着重探讨text和text input两个组件。 Text组件介绍 Text组件是一个用于显示文本的组件,其主要作…

VSCode安装Go环境

VSCode安装Go 1.点击Go官网&#xff0c;根据自己环境下载go安装包&#xff0c;我这里为Windows 2.双击安装包&#xff0c;一直点击【Next】即可 VSCode配置Go基础环境 1.创建Go的工作目录: C:\Code\GoCode 2.创建Go的环境变量: GOPATH (1)右键【此电脑】&#xff0c;点击…

C/C++转WebAssembly及微信小程序调用

上一篇文章讲了C/C如何转WebAssembly&#xff0c;并测试了在Web端调用。本篇内容和上篇一样&#xff0c;介绍C/C包转的.wasm包如何在小程序中调用。 说明 本篇是在上一篇步骤1-4的基础上&#xff0c;再做修改&#xff0c;供微信小程序端调用的方法和步骤。 本篇操作手册可以…

Python自动化测试:选择最佳的自动化测试框架

在开始学习python自动化测试之前&#xff0c;先了解目前市场上的自动化测试框架有哪些&#xff1f; 随着技术的不断迭代更新&#xff0c;优胜劣汰也同样发展下来。从一开始工具型自动化&#xff0c;到现在的框架型&#xff1b;从一开始的能用&#xff0c;到现在的不仅能用&…

鸿蒙问题之本地模拟器无法识别

今天按例打开本地模拟器&#xff0c;发现DevEco Studio不能检测到我的本地模拟器了。 重启了DevEco Studio和模拟器多次都无果。果断删除模拟器 然后创建一个新的&#xff0c;就可以成功检测到了。这应该是idea的一个bug

关于python解析mf4中二维信号数据的注意事项

python解析mf4中的信号数据一般用np.ndarray存储&#xff0c;但是mf4中的一个信号有时不一定是一维数据&#xff0c;有时会是一个二维的&#xff0c;没错&#xff0c;就是一个信号数据就是二维的&#xff0c;这时候&#xff0c;np数组的每个元素也是一个数组&#xff0c;这个时…

【揭秘】如何制作推拉门电子画册,轻松成为行业大咖!

​在当今数字化时代&#xff0c;电子画册已成为企业展示产品、服务的重要手段。与传统印刷画册相比&#xff0c;电子画册具有诸多优势&#xff0c;如易于传播、易于更新、环保低碳等。更重要的是&#xff0c;通过电子画册&#xff0c;企业可以更好地与目标受众互动&#xff0c;…

天津医科大学临床医学院专升本药学专业有机化学考试大纲

天津医科大学临床医学院高职升本科专业课考试大纲药学专业《有机化学》科目考试大纲 一、考试基本要求 本考试大纲主要要求考生对《有机化学》基本概念有较深入的了解&#xff0c;能够系统地掌握各类化合物的命名、结构特点及立体异构、主要性质、反应、来源和合成制备方法等…

相对于一般的统计学,计量经济学的特色是什么?谈Stata与计量经济学

Stata作为一种数据分析软件&#xff0c;高度适用于依托计量经济学的研究领域&#xff0c;如宏观经济学、财政学等&#xff0c;当然在医学等学科应用也较为广泛&#xff0c;在处理面板数据方面也深具特色。计量经济学是指运用概率统计方法对经济变量之间的因果关系进行定量分析的…

idea的pom.xml文件灰色删除线解决办法

以上是点击了移除module后就变成这样 如果再次对着已移除的module右键会发现有个delete&#xff0c;点击这个是真删了&#xff0c;要谨慎备份哦 解决方案&#xff1a;恢复误操作remove module的解决方法 idea最右边&#xff0c;有个Maven控件&#xff0c;找到要恢复的module&a…

vscode连接linux服务器

目录 下载vscode&#xff0c;这是微软开源软件&#xff0c;打开后到下载扩展页面 在下载扩展页面下载中文和ssh远程连接扩展 安装后会在左边新生成一个图标点击齿轮 选择第一个 配置连接信息 远程隧道右边刷新&#xff0c;等刷出来hostname的主机后 连接ip出来后&#x…

mybatisX自动生成sql语句,尝试测试方法报错

今天我使用mybatisx自定义mapper方法生成sql语句后&#xff0c;在测试时报错 错误是MyBatis 无法找到映射的语句&#xff08;Statement&#xff09;引起的 我是这样操作的&#xff0c;在mapper接口自定义了一个方法 然后alt加enter&#xff0c;自动生成sql 结果 mapper.xml文件…

骨传导耳机的原理是什么?一文读懂骨传导耳机优缺点都有哪些!

一、骨传导耳机传声原理是什么 骨传导耳机以人体骨骼为传声介质&#xff0c;可以将声音转化为不同频率的震动&#xff0c;在不经过外耳道和鼓膜的情况下&#xff0c;通过震动使声音经过内耳道&#xff0c;直接传入大脑听觉神经&#xff0c;与传统耳机相比&#xff0c;可以节省许…

Gooxi成功入选全国首批人工智能企业

日前&#xff0c;Gooxi成功入选由深圳市人工智能产业协会评定的全国首批36家人工智能企业之一&#xff0c;这是继Gooxi成功与广东未来研究院合作AI联合创新中心之后在AI行业持续深耕的又一殊荣&#xff0c;彰显出Gooxi在AI领域的卓越实力。 据悉&#xff0c;全国首批人工智能企…

第 1 场 算法季度赛 蓝桥搜狐畅游(1~5 , 7)

1、水题 2、树上dp 3、模拟 4、概率 5、拆位 6、&#xff08;是没学过的东西了...&#xff09; 7、组合数学 1. 新年快乐【算法赛】 直接模拟 #include <iostream> using namespace std; int main() {cout <<"2024 AK";return 0; } 2. 蓝桥圣诞树…

【每日一题】收集巧克力

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;枚举操作数 写在最后 Tag 【枚举】【数组】【2023-12-28】 题目来源 2735. 收集巧克力 题目解读 有长度为 n, 下标从 0 开始的整数数组 nums, 表示收集不同类型的巧克力的成本. nums[i] 表示收集类型 i 巧克力的成本…

12.28_黑马数据结构与算法笔记Java

目录 291 最长公共子序列 动态规划 分析 292 最长公共子序列 动态规划 实现 293 Leetcode 583 两个字符串删除 294 Leetcode 300 最长递增子序列 分析 295 Leetcode 300 最长递增子序列 实现 296 Catalan数 分析 297 Catalan数 实现 298 Catalan数 应用 出栈总数 299 C…