C++:特殊成员函数

news2024/11/16 17:55:10

构造函数、析构函数和拷贝构造函数是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;
    }   
    
    //获取对象HP
    int GetHP() {
        return m_nHP;
    }
    
private:
    int m_nHP;
};

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

int main() {
    //实例化对象roleA
    RolePlayer roleA(44);
    
    //实例化对象roleB
    RolePlayer 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.coloradmin.cn/o/1616239.html

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

相关文章

Vs Code npm install 报错解决方法

用的人家的前端框架发现是封装过的&#xff0c;要修改人家前端的话还得把前端源码放在Vs Code 上运行&#xff0c;后端放在IDEA上运行&#xff0c;然后前后端并行开发&#xff0c;在配置前端环境时遇到&#xff1a; npm install 这个的原因是我把node下载到D盘了权限不够框框爆…

Linux:服务器硬件及RAID配置

Linux&#xff1a;服务器硬件及RAID配置 服务器 服务器是什么 服务器的英文名称为“ Server”&#xff0c;是指在网络上提供各种服务的高性能计算机。作为网络的节点&#xff0c;存储、处理网络上80&#xff05;的数据、信息&#xff0c;因此也被称为网络的灵魂。 服务器和…

数据挖掘实验(Apriori,fpgrowth)

Apriori&#xff1a;这里做了个小优化&#xff0c;比如abcde和adcef自连接出的新项集abcdef&#xff0c;可以用abcde的位置和f的位置取交集&#xff0c;这样第n项集的计算可以用n-1项集的信息和数字本身的位置信息计算出来&#xff0c;只需要保存第n-1项集的位置信息就可以提速…

怎么通过Javascript脚本实现远程控制一路开关

怎么通过Javascript脚本实现远程控制一路开关呢&#xff1f; 本文描述了使用Javascript脚本调用HTTP接口&#xff0c;实现控制一路开关。一路开关可控制一路照明、排风扇等电器。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称1智能WiFi…

信息系统项目管理师0062:需求分析(5信息系统工程—5.1软件工程—5.1.2需求分析)

点击查看专栏目录 文章目录 5.1.2需求分析1.需求的层次2.需求过程3.UML4.面向对象分析记忆要点总结5.1.2需求分析 软件需求是指用户对新系统在功能、行为、性能、设计约束等方面的期望。根据IEEE的软件工程标准词汇表,软件需求是指用户解决问题或达到目标所需的条件或能力,是…

入坑 Node.js 1

原文&#xff1a;https://blog.iyatt.com/?p14717 前言 前面刚刚对 Spring Boot 有了个概念&#xff0c;再来学学 Node.js&#xff0c;顺便当学 JavaScript&#xff0c;为后面入前端做准备。 环境 Node.js 20.12.2 官方 API 文档&#xff1a;https://nodejs.org/docs/lat…

iOS OC项目中引入SwiftUI文件

iOS OC项目中引入SwiftUI文件 1、创建SwiftUI文件 2、第一次创建时&#xff0c;Xcode会提示桥接&#xff0c;选择 Creat Bridging Header即可。 3、创建swift管理类 /**在UIKit中使用SwiftUI&#xff0c;需要使用UIHostingController对SwiftUI进行包装&#xff0c;返回的是U…

小游戏:贪吃蛇

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;贪吃蛇 &#x1f337;追光的人&#xff0c;终会万丈光芒 目录 &#x1f3dd;1.头文件&#xff1a; &#x1f3dd;2.实现文件&#xff1a; &#x1f3dd;3.测试文件 &#xff1a; 前言&#…

STM32自动光控窗帘程序+Proteus仿真图 H桥L298驱动电机

目录 1、前言 2、仿真图 3、源程序 资料下载地址&#xff1a;STM32自动光控窗帘程序Proteus仿真图 H桥L298驱动电机 1、前言 基于STM32F103设计的智能光控窗帘&#xff0c;包含STM32芯片、光敏电阻、LCD1602显示屏、电机驱动控制模块等。 备注&#xff1a;通过ARM内部的…

网络安全数字孪生:一种新颖的汽车软件解决方案

摘要 随着汽车行业转变为数据驱动的业务&#xff0c;软件在车辆的开发和维护中发挥了核心作用。随着软件数量的增加&#xff0c;相应的网络安全风险、责任和监管也随之增加&#xff0c;传统方法变得不再适用于这类任务。相应的结果是整车厂和供应商都在努力应对汽车软件日益增加…

CAS和synchronized原理

synchronized与CAS Synchronized 原理加锁工作过程一些优化 CAS实现原子类 小结 Synchronized 原理 synchronized 既可以是乐观锁, 也可以是悲观锁.synchronized 既可以是轻量级锁, 也可以是重量级锁.synchronized 重量级锁是由系统的互斥锁实现的; 轻量级锁是基于自旋锁实现的…

Windows 安全中心:页面不可用 你的 IT 管理员已限制对此应用的某些区域的访问,并且你尝试访问的项目不可用。有关详细信息,请与 IT 支持人员联系。

问题 1&#xff1a;Windows 安全中心提示&#xff1a;【页面不可用 你的 IT 管理员已限制对此应用的某些区域的访问&#xff0c;并且你尝试访问的项目不可用。有关详细信息&#xff0c;请与 IT 支持人员联系。】 修复 Microsoft.SecHealthUI 方法 1&#xff1a;命令自动重装安…

linq select 和selectMany的区别

Select 和 SelectMany 都是 LINQ 查询方法&#xff0c;但它们之间有一些区别。 Select 方法用于从集合中选择特定的属性或对集合中的元素进行转换&#xff0c;并返回一个新的集合。例如&#xff1a; var numbers new List<int> { 1, 2, 3, 4, 5 }; var squaredNumbers…

sc2024项目consul

1. 什么是consul HashiCorp Consul是一款服务网络解决方案&#xff0c;可让团队管理服务之间以及内部部署和多云环境及运行时的安全网络连接。consul提供服务发现、服务治理、流量管理和对网络基础设施设备的自动更新。(添加链接描述)Consul使用Go语言开发 2. 功能 多数据中…

【PCL】教程global_hypothesis_verification 通过验证模型假设来实现 3D 对象识别与位姿估计...

测试程序1 milk.pcd milk_cartoon_all_small_clorox.pcd 终端输出1&#xff1a; Model total points: 12575; Selected Keypoints: 193 Scene total points: 307200; Selected Keypoints: 7739 [pcl::SHOTEstimation::computeFeature] The local reference frame is not valid!…

windows驱动开发-内存概述

“90%的程序问题都是由内存引起的&#xff0c;剩下的10%是使用内存引起的&#xff01;”这是一句非常经典的论证&#xff0c;实际上&#xff0c;在程序开发中&#xff0c;内存问题就是最大的问题&#xff0c;没有之一。 现代的计算机体系中&#xff0c;内存承载了太多的功能&a…

解决“该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的”的方法

一、问题 安装插件出现时“该扩展程序未列在 Chrome 网上应用店中&#xff0c;并可能是在您不知情的情况下添加的” 二、解决方法 1、把需要安装的第三方插件&#xff0c;后缀.crx 改成 .rar&#xff0c;然后解压&#xff0c;得到一个文件夹 2、再打开chrome://extensions/谷歌…

Visual Studio Code使用

目录 1.python的调试 2.c的运行 方法1&#xff1a; 方法2&#xff1a; 3.c的调试 3.1调试方法一&#xff1a;先生成执行文件&#xff0c;再调试 3.2调试方法二&#xff1a;同时生成执行文件&#xff0c;调试 4.tasks.json 与launch.json文件的参考 4.1C生成执行文件tas…

linux之进程通信

目录 一、进程通信介绍 1.目的 2.发展 3.进程通信是什么&#xff0c;怎么通信&#xff1f; 二、管道 1.介绍 2.匿名管道 1.单向通信管道原理 2.代码实现 3.管道特征 4.管道的四种情况 5.管道的应用场景 使用管道实现一个简易版本的进程池 3.命名管道 1.思考 2.…

燃冬之yum、vim和你

了解了很多指令和权限&#xff0c;搞点真枪实弹来瞅瞅 学Linux不是天天就在那掰扯指令玩&#xff0c;也不是就研究那个权限 准备好迎接Linux相关工具的使用了么码农桑~ yum 软件包 什么是软件包呢&#xff1f; 首先来举个生活中常见点的例子&#xff1a;比如我的手机是华为…