当前位置: 首页 > news >正文

<c++> 类的构造函数与类的析构函数

文章目录

  • 类的构造函数
    • 什么是构造函数
    • 声明和定义构造函数
    • 如何使用构造函数
    • 默认构造函数
  • 类的析构函数
    • 什么是析构函数
    • 声明和定义析构函数
  • 小练习
    • 银行账户
    • 执行效果

类的构造函数

什么是构造函数

Q:什么是类的构造函数
A:构造函数是类的一种特殊成员函数,不需要人为调用,而是在建立对象时自动被执行。简单来说就是在建立对象时构造函数就会自动进行执行。

声明和定义构造函数

class Dog {private://成员变量string name;int age;
};

构造函数的名称要和类名称相同。现在创建一个Dog的构造函数,由于需要为Dog对象提供 2 个值,因此构造函数应该有 2 个参数。具体如下:

	Dog(const string & na, int ag);//ps:成员函数设计时加 cons t的好处:1.安全2.通用性好,既适用于普通对象也适用于常对象。Dog::Dog(const string & na, int ag) {name = na;age = ag;
}

注意:通常情况下,创建对象有两种情况,一种是直接创建类的对象,另一种是通过new来创建一个动态对象,这两种情况都会自动调用构造函数。

如何使用构造函数

c++有两种使用构造函数来初始化对象的方法,第一种方法就是显式地调用构造函数。这里将 dog对象的name成员设置成字符串旺财,将age成员设置成 10。

Dog dog = Dog ("旺财",10);  		//显式地调用构造函数

另一种方法就是隐式地调用构造函数。

	Dog dog("旺财",10);  		//隐式地调用构造函数

注意:因为在构造函数构造出对象之前,对象是不存在的,所以无法使用对象来调用构造函数。也就是说,构造函数被用来创建对象,而不能通过对象来调用。

默认构造函数

Q:什么是类的默认构造函数
A:默认构造函数是在未提供显式初始值时,用来创造对象的构造函数。
当使用下面这种声明时,就是默认构造函数。执行命令后,会创建dog对象,但是不会初始化它的成员。

	Dog dog; 

注意:当没有定义任何构造函数时,编译器才会提供默认构造函数。如果自己定义了构造函数,就必须自己定义默认构造函数,否则上面的声明会报错。

定义默认构造函数很简单,一般有两种方法,第一种方法就是给已有构造函数的所有参数提供默认值。

   Dog(const string & na = "no name", int ag = 0);

第二种方法就是通过函数重载来定义一个没有参数的构造函数

Dog::Dog() {name = "no name";age = 0;
}

类的析构函数

什么是析构函数

Q:什么是类的析构函数
A:析构函数是特殊的类成员函数,简单来说,析构函数与构造函数的作用正好相反,它用来完成对象被删除前的一些清理工作,也就是专门的扫尾工作。简单来说就是在类对象被回收,销毁时自动调用。

声明和定义析构函数

和构造函数一样,析构函数的名称也很特殊,需要在类名前加上~Dog类的析构函数就是~Dog()。通常情况下,类对象被回收,销毁有两种情况,一种是超过生命周期之后被自动回收,另一种是动态对象通过delete回收,这两种情况都会自动调用析构函数。

因为在类对象被回收,销毁时析构函数会自动调用,所以必须要有一个析构函数。如果没有提供析构函数,编辑器会隐形声明一个默认析构函数。

小练习

银行账户

我们定义一个类来表示银行账户。数据成员包括储户姓名,账号和存款。成员函数执行以下操作。

  • 创建一个对象并将它初始化。
  • 显示储户的姓名,账号和存款。
  • 存入参数指定的存款。
  • 取出参数指定的存款。
#include<iostream>
using namespace std;class BankAccount {private :string fullname;string account;double deposit;public :BankAccount();BankAccount(const string, const string, float);~BankAccount();void init_account(const string, const string, float);void print_info() const;void save(float);void withdraw(float);
}; int main() {BankAccount ba("锡兰","0001",1000);ba.print_info();ba.init_account("锡兰_CC","",1500);ba.print_info();ba.save(233.3);ba.print_info();return 0;
}//默认构造函数 
BankAccount::BankAccount() {deposit = 0;
}//带参数构造函数的定义 
BankAccount::BankAccount(string name, string id, float f) {fullname = name;account = id;deposit = f;
}//析构函数
BankAccount::~BankAccount() {cout << "结束!!!" << endl;
} //初始化对象
void BankAccount::init_account(string name, string id, float f) {cout<<"初始化账户信息";if(name != "") fullname = name;if(id != "") account = id;deposit = f; 
} //输出账号信息
void BankAccount::print_info() const {cout << "账号信息:" << endl;cout << "姓名:" << fullname << endl;cout << "ID:" << account << endl;cout << "存款:" << deposit <<endl; 
} //存款函数
void BankAccount::save(float f) {deposit += f;
} //取款函数
void BankAccount::withdraw(float f) {deposit -= f;
} 

执行效果

在这里插入图片描述

相关文章:

<c++> 类的构造函数与类的析构函数

文章目录类的构造函数什么是构造函数声明和定义构造函数如何使用构造函数默认构造函数类的析构函数什么是析构函数声明和定义析构函数小练习银行账户执行效果类的构造函数 什么是构造函数 Q&#xff1a;什么是类的构造函数 A&#xff1a;构造函数是类的一种特殊成员函数,不需…...

华为OD机试真题Java实现【玩牌高手】真题+解题思路+代码(20222023)

玩牌高手 给定一个长度为n的整型数组,表示一个选手在n轮内可选择的牌面分数。选手基于规则选牌, 请计算所有轮结束后其可以获得的最高总分数。 选择规则如下: 1、在每轮里选手可以选择获取该轮牌面,则其总分数加上该轮牌面分数,为其新的总分数。 2、选手也可不选择本轮…...

Hive Sql整体优化思路

如果遇到sql性能问题&#xff0c;可以先查看4040页面的sql执行信息。一个sql解析为多个stage&#xff0c;一个stage分为多个task。对问题Sql的某一个stage&#xff0c;基本的分析思路如下&#xff1a;所有的task都慢&#xff0c;检查下是否有笛卡尔积(关联字段重复值、关联字段…...

【华为OD机试模拟题】用 C++ 实现 - 数组的中心位置(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

取指定数值的地址 (int 转 void *)

int a 0x12345678 是一个地址void *p (void *)a; 提示下马错误&#xff1b;Error: cast to pointer from integer of different size [-Werrorint-to-pointer-cast]This error occurs when there is an attempt to convert an integer to a pointer of a different size. Thi…...

C#的多线程、线程池和Task

线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作&#xff0c;那么设置不同的线程执行路径往往是有益的&#xff0c;每个线程执行特定的工作。 线程是轻量级进程。一个使用线程的常见实例是现代操作系统中并行编程的…...

Day20【元宇宙的实践构想06】—— 元宇宙与Web3.0

&#x1f483;&#x1f3fc; 本人简介&#xff1a;男 &#x1f476;&#x1f3fc; 年龄&#xff1a;18 &#x1f91e; 作者&#xff1a;那就叫我亮亮叭 &#x1f4d5; 专栏&#xff1a;元宇宙 部分资料参考文献: 成生辉教授的《元宇宙&#xff1a;概念、技术及生态》和百度相关…...

极限熵和冗余度

本专栏包含信息论与编码的核心知识&#xff0c;按知识点组织&#xff0c;可作为教学或学习的参考。markdown版本已归档至【Github仓库&#xff1a;information-theory】&#xff0c;需要的朋友们自取。或者公众号【AIShareLab】回复 信息论 也可获取。 信息冗余度(多余度、剩余…...

女生学习大数据专业未来前景怎么样

学习大数据与性别没有什么太大关系&#xff0c;各有优势。就目前的发展前景来说&#xff0c;大数据还是非常不错的&#xff0c;至于好不好就业就要看你个人学习的怎么样&#xff0c;以及学历是否过关了~ 据《新职业——大数据工程技术人员就业景气现状分析报告》显示&#xff…...

主题模型实践

目录 一.TF-IDF 二.LSI 三.相似度 四.主题和主题分布 五. LDA计算的相似度 六.LDA过程 七.主题 八.主题和主题分布 九.数据处理流程 十.常用正则表达式 十一.代码 一.TF-IDF 二.LSI 三.相似度 四.主题和主题分布 五. LDA计算的相似度 六.LDA过程 七.主题 八.主题和主…...

按字典序排列的最小的等价字符串[拆解并查集]

并查集前言一、按字典序排列的最小的等价字符串二、并查集总结参考文献前言 并查集有什么用&#xff1f;并查集是什么&#xff1f;搞懂这两个问题&#xff0c;相关的并查集问题就变得非常easy&#xff01; 一、按字典序排列的最小的等价字符串 二、并查集 有一种方法&#x…...

操作系统——6.系统调用

目录 1.概述 2.系统调用的定义和作用 2.1 定义 2.2 功能 2.3 分类 3.系统调用和库函数的区别 4.系统调用背后的过程 5.小结 1.概述 这篇文章我们主要来介绍一下操作系统中的系统调用&#xff0c;下面来看一下具体的框架图&#xff1a; 2.系统调用的定义和作用 2.1 定…...

JavaScript DOM操作

目录 获取元素&#xff1a; 修改元素属性&#xff1a; 添加、删除、替换元素&#xff1a; 修改样式&#xff1a; DOM&#xff08;文档对象模型&#xff09;是一种用于操作 HTML 和 XML 文档的 API。JavaScript 通过 DOM API 可以访问和操作页面中的元素、属性和样式等。 获…...

【数据结构】顺序表

文章目录前言初始化顺序表打印顺序表检查容量判空顺序表数据个数尾部插入尾部删除头部插入头部删除在pos位置插入数据删除pos位置的数据查找数据修改数据销毁顺序表整体代码写在最后前言 顺序表作为数据结构中的小小弟&#xff0c;还是很好应付的。说到数据结构&#xff0c;顺序…...

【人工智能 AI 】RPA 架构师需要具备的技能有哪些?RPA Solution Architect

RPA 架构师需要具备的技能有哪些?使用markdown格式,不少于3000字,细化到3级目录。 文章目录 一、RPA架构师需要具备的技能1. 对RPA的理解2. 对RPA技术的熟练掌握2.1 RPA系统的架构模式2.2 RPA软件的操作模式2.3 RPA程序的编写方式3. 对RPA应用的知识4. 对软件开发的基本知识…...

【模拟集成电路】鉴频鉴相器设计(Phase Frequency Detector,PFD)

鉴频鉴相器设计&#xff08;Phase Frequency Detector&#xff0c;PFD&#xff09;前言一、 PFD的工作原理二、 PFD电路设计&#xff08;1&#xff09;PFD电路图&#xff08;2&#xff09;D触发器电路图&#xff08;3&#xff09;与非门&#xff08;NAND&#xff09;电路图&…...

【Linux】进程间通信介绍 | 管道

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;进程间通信…...

这次说说腾讯的一场 35K—55K 的 Android 高工面试

一、面试的由来 事情是这样的&#xff0c;因为跟公司发展一些想法的不同&#xff0c;早在十月份的时候就有了跳槽的想法&#xff0c;但是碍于老大的面子就一直就没有跟人事说出口&#xff0c;打算着等到年后金三银四在试试跳槽。 但是发生一件事终于让我忍不住了&#xff0c;…...

Jenkins第一讲

目录 一、Jenkins 1.1 敏捷开发与持续集成 1.1.1 敏捷开发 1.1.2 持续集成 1.2 持续集成工具 1.2.1 jenkins和hudson 1.2.2 技术组合 1.2.3 部署方式对比 1.3 安装Jenkins 1.3.1 下载Jenkins的war包 1.3.2 开启Jenkins 1.4 Jenkins全局安全配置 1.5 使用Jenkins部…...

变分推断 | MATLAB实现VBMC变分贝叶斯蒙特卡洛模拟的贝叶斯推断

变分推断 | MATLAB实现变分贝叶斯蒙特卡洛模拟的贝叶斯推断 目录 变分推断 | MATLAB实现变分贝叶斯蒙特卡洛模拟的贝叶斯推断效果一览基本介绍研究内容模型描述模型设计参考资料效果一览 基本介绍 MATLAB实现变分贝叶斯蒙特卡洛模拟的贝叶斯推断。变分贝叶斯蒙特卡洛(VBMC)是…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...