C++:特殊成员函数

构造函数、析构函数和拷贝构造函数是C++类中的三种特殊成员函数,它们分别用于对象的初始化、清理和拷贝操作。

1.构造函数(Constructor):构造函数在对象创建时自动调用,用于初始化对象的成员变量。它的名称与类名相同,没有返回类型。构造函数可以重载,即同一个类可以有多个构造函数,根据参数的不同进行选择。

class RolePlayer {
public://构造函数RolePlayer(){std::cout << "构造函数" << std::endl;};
};
在main函数中实例化多个对象
int main() {RolePlayer roleA;RolePlayer roleB;RolePlayer roleC;system("pause");retrun 0;
}

运行,查看结果;

构造函数在对象创建时自动调用,一般我们会在构造函数中针对对象的成员变量进行初始化,这个时候就可以对构造函数进行重载,设置带参数的构造函数;

重载(Overloading)是指在一个类中定义多个同名方法,但是它们的参数列表不同,即参数类型、参数个数或者参数顺序不同。在调用这些方法时,编译器会根据传入的参数类型和数量来确定具体调用哪个方法。这种特性可以增加代码的灵活性和可读性。

示例:

class RolePlayer {
public://构造函数RolePlayer(){std::cout << "构造函数" << std::endl;};//带参数的构造函数RolePlayer(int HP){m_nHP = HP;};//获取HP的方法int GetHP() {return m_nHP;}private:char * m_NPCName;int m_nHP;
};

在对象创建时运行带参数的构造函数对对象的m_nHP成员变量进行赋值;

int main() {RolePlayer roleA(44);std::cout << roleA.GetHP() << std::endl;system("pause");return 0;
}

此时对象roleA成员变量在实例化的时候就已经被赋值了。

2.析构函数

析构函数在对象销毁时自动调用,用于释放对象占用的资源,比如内存、文件句柄等。它的名称是在类名前面加上波浪号(~),没有参数和返回类型。通常用于清理对象分配的资源,确保没有资源泄漏。

还是使用RolePlayer类进行示范
class RolePlayer {
public://构造函数RolePlayer(){std::cout << "构造函数" << std::endl;};//析构函数~RolePlayer(){std::cout << "析构函数" << std::endl;};
};

这个时候我们在源文件中使用new创建一个对象,并替对象创建地址空间,接着使用delete释放掉对象的地址空间;

int main() {RolePlayer * pRoleA = new RolePlayer;delete pRoleA;system("pause");return 0;
}

接着运行程序:

可以看到对象的构造函数在创建对象时执行,析构对象在释放对象时执行。

析构函数可以清理对象分配的资源,确保没有资源泄漏。

3.拷贝构造函数(Copy Constructor):拷贝构造函数用于在创建新对象时,以已存在的对象作为参数进行初始化。它通常用于对象的复制或传递。如果不显式定义拷贝构造函数,编译器会提供默认的拷贝构造函数,执行浅复制。

我们还是拿RolePlayer类进行举例

class RolePlayer {
public://一个传入参数的构造函数RolePlayer(int HP){m_nHP = HP;};
​//拷贝构造函数RolePlayer(const RolePlayer & other){m_nHP = other.m_nHP;std::cout << "拷贝构造函数执行成功" << std::endl;}   //获取对象HPint GetHP() {return m_nHP;}private:int m_nHP;
};

此时我先实例化一个对象roleA,接着再创建一个对象roleB,且再创建对象B的时候调用拷贝构造函数进行对象的复制与传递;

int main() {//实例化对象roleARolePlayer roleA(44);//实例化对象roleBRolePlayer roleB(roleA);std::cout << roleB.GetHP() << std::endl;system("pause");return 0;
}

此时我在创建roleA对象时调用其构造函数进行成员初始化,将roleA对象的m_nHP值设置为44,接着实例化对象roleB,且调用拷贝构造函数,将对象A作为拷贝对象进行传入;此时再打印roleB的HP值,结果如下:

可以看到拷贝构造函数执行成功,且roleA对象的属性成功拷贝至roleB。

这三种特殊成员函数在C++中非常重要,它们在对象的生命周期中起着关键作用,确保对象被正确地初始化、清理和复制。

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

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

相关文章

《动手学深度学习(Pytorch版)》Task01:初识深度学习——4.22打卡

深度学习介绍 AI地图 自然语言处理&#xff1a;起源于符号学&#xff0c;如机器翻译&#xff0c;人在几秒钟能反应过来&#xff0c;属于感知问题计算机视觉&#xff1a;图片由像素组成&#xff0c;难以用符号学解释&#xff0c;在图片中进行推理&#xff0c;大部分用概率模型或…

vue3组件封装系列-表单请求

我们在开发一些后台管理系统时&#xff0c;总是会写很多的列表查询页面&#xff0c;如果不封装组件&#xff0c;就会无限的复制粘贴&#xff0c;而且页面很冗余&#xff0c;正常情况下&#xff0c;我们都是要把组件进行二次封装&#xff0c;来达到我们想要效果。这里我分享一下…

uni-app 的 扩展组件(uni-ui) 与uView UI

uni-app 的 扩展组件&#xff08;uni-ui&#xff09; 与uView UI uni-ui 官方背景&#xff1a;组件集&#xff1a;设计风格&#xff1a;文档与支持&#xff1a;社区与生态&#xff1a; uView UI 第三方框架&#xff1a;组件集&#xff1a;设计风格&#xff1a;文档与支持&#…

ScriptableObject数据容器讲解

概述 是Unity提供的一个用于创建可重用的数据容器或逻辑的基类。 ScriptableObject 是继承自 UnityEngine.Object 的一个类&#xff0c;但与普通的 MonoBehaviour 不同&#xff0c;它不能附加到GameObject上作为组件。 相反&#xff0c;ScriptableObject 通常用于存储和管理…

【JavaSE启航篇 01】探索JavaSE:史上最强JavaSE学习路线图 知识图谱

【JavaSE启航篇 01】探索JavaSE&#xff1a;史上最强JavaSE学习路线图 &知识图谱 作者名称&#xff1a;纸飞机-暖阳 作者简介&#xff1a;专注于Java和大数据领域&#xff0c;致力于探索技术的边界&#xff0c;分享前沿的实践和洞见 文章专栏&#xff1a;JavaSE那些年专栏 …

数据库管理-第173期 OceanBase一体化Plus多模融合(20240422)

数据库管理173期 2024-04-22 数据库管理-第173期 OceanBase一体化Plus多模融合&#xff08;20240422&#xff09;1 架构简化2 不止融合2.1 行列混存2.2 多维使用2.3 多模JOIN 3 展望 数据库管理-第173期 OceanBase一体化Plus多模融合&#xff08;20240422&#xff09; 作者&…

3D Gaussian Splatting介绍

目录 一、概述二、基础介绍1. 多维高斯分布2. 将3D 高斯投影到2D像素平面3. 球谐函数4. Splatting and α \alpha α blending 三、整体流程四、 伪代码五、评价指标六、实验结果七、reference 一、概述 3D Gaussian Splatting和NeRF一样&#xff0c;主要用于新视图合成。 特…

eCharts 折线图 一段是实线,一段是虚线的实现效果

在lineStyle里写了不生效的话&#xff0c;可以尝试数据拼接 option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data: [150, 230, 224,218 ,,,],type: line},{data: [,,, 218, 135, 147, 260],type: line,lineStyl…

Valentina Studio Pro for Mac:强大的数据库管理工具

Valentina Studio Pro for Mac是一款功能全面、操作高效的数据库管理工具&#xff0c;专为Mac用户设计&#xff0c;旨在帮助用户轻松管理各种类型的数据库。 Valentina Studio Pro for Mac v13.10激活版下载 该软件拥有直观的用户界面&#xff0c;使得数据库管理变得简单直观。…

ChromaDB教程

使用 Chroma DB&#xff0c;管理文本文档、将文本嵌入以及进行相似度搜索。 随着大型语言模型 &#xff08;LLM&#xff09; 及其应用的兴起&#xff0c;我们看到向量数据库越来越受欢迎。这是因为使用 LLM 需要一种与传统机器学习模型不同的方法。 LLM 的核心支持技术之一是…

CSS-vminvmax单位

vmin 和 vmax 单位 vmin 是相对于视口宽度和高度中较小值进行计算&#xff0c;它的值为视口宽度和高度中的较小值的百分比。 例如&#xff0c;如果视口宽度为 800px&#xff0c;高度为 1000px&#xff0c;那么 1vmin 等于 8px&#xff08;800px 的 1%&#xff09;。 vmax 是…

半年来每月必用,隐私协议Railgun因何得到Vitalik的青睐?

还没有哪个隐私协议能让 Vitalik 每个月都转入以太坊交互&#xff0c;但 Railgun 做到了。在过去 6 个月中&#xff0c;Vitalik 基本每个月都会使用 ETH 与 Railgun 交互&#xff0c;随后被 Vitalik 推特确认&#xff0c;并为 Railgun 打了个小广告。市场反应迅速&#xff0c;其…