C++ 类和对象 (5) 析构函数

news2025/1/4 16:26:57

        用构造函数创建对象后,程序负责跟踪该对象,直到对象过期为止。对象过期时,程序将自动调用一个特殊的成员函数,该函数的名称——析构函数。析构函数完成清理工作,实际上还是很有用的。例如,用new来分配一个构造函数,则析构函数将使用delete来释放这些内存。Stock的构造函数没有使用new,因此析构函数实际上没有需要它清除的工作。在此情况下,只需要让编译器生成一个什么都不做的隐式析构函数即可,Stock类第一版正是这样做的。

        举例,为Stock类提供一个析构函数。

        和构造函数一样,析构函数的名称也很特殊:在类名前加上~。因此,Stock类的析构函数为~Stock()。另外,和构造函数一样,析构函数也可以没有返回值和声明类型。与构造函数不同的是,析构函数没有参数,因此Stock析构函数的原型必须是:

~Stock();

        由于Stock的析构函数不承担任何重要的工作,因此可以将它编写为不执行任何操作的函数:

Stock::~Stock()
{
}

        但是,有时候为了能看出析构函数何时被调用,可以这样写代码:

Stock::~Stock()
{
    cout << "ByeBye," << company <<"!"<<endl;
}

        什么时候调用析构函数由编译器决定,通常不能再代码中显式地调用析构函数。如果

创建的是静态存储类对象,则其析构函数将在程序结束时自动被调用。

创建的是自动存储类对象,则其析构函数将在程序执行完代码块时自动被调用。

        如果对象是通过new创建的,则它将驻留在栈内存或者自由存储区中,当使用delete来释放内存时,其析构函数将自动被调用。最后,程序可以创建临时对象来完成特定的操作,在这种情况下,程序将在结束对该对象使用时自动调用其析构函数。

        由于在类对象过期时析构函数将自动被调用,因此必须有一个析构函数。如果程序员没有提供析构函数,编译器将隐式地声明一个默认析构函数,并在发现导致对象被删除的代码后,提供默认析构函数的定义。

        改进Stock类

        下面将对构造函数和析构函数加入到类和方法的定义中。

1.头文件stock20.h,将构造函数和析构函数的原型加入到原来的类声明中。使用#ifndef防止多重包含。

#ifndef __STOCK20_H__
#define __STOCK20_H__
#include <string>
class Stock
{
        private:
                std::string company;
                long shares;
                double share_val;
                double total_val;
                void set_tot(){total_val = shares * share_val;}
        public:
                Stock();        
                Stock(const std::string &co,long n,double pr);
                ~Stock();
                void buy(long num,double price);
                void sell(long num,double price);
                void update(double price);
                void show();
};

#endif

2.实现文件stock20.cpp使用了using声明和限定名称来访问头文件中的各种声明,将构造函数和析构函数的方法定义添加到以前的方法中。并且每次被调用时,都显式一条信息。

#include <iostream>
#include "stock20.h"

Stock::Stock()
{
    std::cout<<"Default constructor called\n";
    company = "no name";
    shares = 0;
    share_val = 0.0;
    total_val = 0.0;
}
Stock::Stock(const std::string &co,long n,double pr)
{
    std::cout<<"Constructor using"<<co<<"called\n";
    company = co;
    if(n<0)
    {
        std::cout<<"Constructor using "<<co<<"called\n"
        <<company<<"shares set to 0.\n";
        shares = 0;
    }
    else
        shares = n;
    share_val = pr;
    set_tot();
}

Stock::~Stock()
{
    std::cout<<"Bye,"<<company<<"!"<<std::endl;
}
void Stock::buy(long num,double price)
{
    if(num<0)
    {    
        std::cout<<"Numer of shares can't be negative,Transaction is aborted"
        <<std::endl;
    }
    else
    {
        shares += num;
        share_val = price;
        set_tot();
    }
}
void Stock::sell(long num,double price)
{
    if(num<0)
    {
        std::cout<<"Numer of shares can't be negative,Transaction is aborted"
        <<std::endl;
    }
    else if(num >shares)
    {
        std::cout<<"You can't sell more than you have!Trancsaction is aborted"
        <<std::endl;
    }
    else
    {
        shares -= num;
        share_val=price;
        set_tot();
    }
}
void Stock::update(double price)
{
    share_val = price;
    set_tot();
}
void Stock::show() const
{
    std::cout<<"Company:"<<company<<std::endl;
    std::cout<<"Shares:"<<shares<<std::endl;
    std::cout<<"Share price"<<share_val<<std::endl;
    std::cout<<"Total worth:"<<total_val<<std::endl;
}

3.客户文件,使用Stock类,显示了构造函数和析构函数。

#include <iostream>
#include "stock20.h"

int main()
{    
    {
        using std::cout;
        cout<<"Using constructors to create new objects\n";
        Stock stcok1("NanoSmart",12,20.0);
        stock1.show();
        Stock stock2=stock("Boffo objects",2,2.0);
        stock2.show();

        cout<<"Assingning stock1 to stock2:\n";
        stock2=stock1;
        cout<<"Listing stock1 and stock2:\n";
        stock1.show();
        stock2.show();

        cout<<"Using a constructor to reset an object\n";
        stock1=Stock("Nifty Foods",10,50.0);
        cout<<"Revised stock1:\n";
        stock1.show();
        cout<<"Done\n";
        const Stock land = Stock("Klu proper",3,3.0);
        land.show();
     } 
        return 0;
       
}

 指的注意的是,main()的开头和末尾多了一个大括号。诸如stock1和stock2等自动变量将在程序退出其定义所属代码块时消失。如果没有这些大括号,代码块将为整个main(),因此只有main()执行完毕后,才会调用析构函数。在窗口环境中,这意味着将在析构函数调用前关闭,导致无法看到信息。但是添加大括号后,析构函数调用将在到达返回语句前执行,从而显式相应信息。

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

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

相关文章

八、【漏洞复现】jupyter-notebook 命令执行(CVE-2019-9644)

8.0、基础知识 1、测试功能点 &#xff08;这种情况基本上很难遇到&#xff09; 8.1、漏洞原理 ​Jupyter Notebook是一套用于创建、共享代码和说明性文本文档的开源Web应用程序。 Jupyter Notebook可直接使用命令行执行任意命令。​ 8.2、影响范围 未授权开启终端权限的…

嵌入式Linux应用开发-基础知识-第七章 具体单板的 LED驱动程序

嵌入式Linux应用开发-基础知识-第七章 具体单板的 LED驱动程序 第七章 具体单板的 LED 驱动程序7.1 怎么写 LED 驱动程序&#xff1f;7.2 AM335X的 LED驱动程序7.2.1 原理图 XXXXXX_AM335X开发板结构为&#xff1a;7.2.2 所涉及的寄存器操作7.2.3 写程序7.2.4 配置内核去掉原有…

PyTorch meshgrid 生成网格坐标

torch.meshgrid(*tensors, indexingNone) 使用输入的 1-D 张量创建网格坐标 示例 indexing‘xy’ import torcha torch.arange(3) b torch.arange(3, 6)x, y torch.meshgrid(a, b, indexingxy) print(x , x, sep\n) print(y , y, sep\n)输出: x tensor([[0, 1, 2],[0, …

麒麟信安组织开展国产操作系统技术赋能专题培训

近日&#xff0c;为学习国产操作系统基本概念、使用与运维知识&#xff0c;应对用户单位内部信息系统国产化需求&#xff0c;来自国营洛阳丹城无线电厂的运维工程师们走进麒麟信安&#xff0c;进行了为期一周的操作系统课程学习。 针对客户此次培训需求&#xff0c;结合学员实…

uni-app:canvas-图形实现1

效果 代码 <template><view><!-- 创建了一个宽度为300像素&#xff0c;高度为200像素的canvas元素。canvas-id属性被设置为"firstCanvas"&#xff0c;可以用来在JavaScript中获取该canvas元素的上下文对象。 --><canvas style"width:200p…

nodejs+vue电影网站elementui

第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;技术背景 5 3.2.2经济可行性 6 3.2.3操作可行性&#xff1a; 6 3.3 项目设计目标与原则 6 3.4系统流程分析 7 3.4.1操作流程 7 3.4.2添加信息流程 8 3.4.3删除信息流程 9 第4章 系统设计 11 …

助力古彝文保护,AI文字识别技术推动文化传承

文章目录 一、写在前面古彝文为何物&#xff1f;古彝文的保护背景 二、古彝文识别有何难点&#xff1f;如何解决&#xff1f;三、合合信息的强劲技术四、古文识别的重要意义 一、写在前面 古彝文为何物&#xff1f; 彝文指的是云南、贵州、四川等地的彝族人使用的文字&#x…

【Java 进阶篇】MySQL外键约束详解

在数据库设计和管理中&#xff0c;外键约束是一项重要的功能&#xff0c;它用于维护表与表之间的关联关系&#xff0c;保证数据的完整性和一致性。本文将详细介绍MySQL外键约束的概念、用法以及一些最佳实践&#xff0c;以帮助您更好地理解和应用外键约束。 1. 什么是外键约束…

使用领域引导图卷积神经网络GCNN增强基于脑电图EEG的神经疾病诊断完整代码

一种基于图卷积神经网络&#xff08;GCNN&#xff09;的新方法&#xff0c;用于改进使用头皮脑电图&#xff08;EEG&#xff09;进行神经系统疾病诊断。尽管脑电图是神经系统疾病诊断中主要使用的检测方法之一&#xff0c;但基于EEG的专家视觉诊断的敏感性仍然只有约50&#xf…

ubuntu18.04 OpenGL开发(显示YUV)

源码参考&#xff1a;https://download.csdn.net/download/weixin_55163060/88382816 安装opengl库 sudo apt install libglu1-mesa-dev freeglut3-dev mesa-common-dev 安装opengl工具包 sudo apt install mesa-utils 检查opengl版本信息&#xff08;桌面终端执行&#xff09…

JVM机制理解与调优方案

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; 前言 很多Java开发…

更直观地学习 Git 命令

theme: condensed-night-purple 前言 本文参考于 Learn Git Branching 这个有趣的 Git 学习网站。 在该网站&#xff0c;可以使用 show command 命令展示所有可用命令。 你也可以直接访问网站的sandbox&#xff0c;自由发挥。 本地篇 基础篇 git commit git commit将暂…

Matlab随机数的产生

1、常见分布随机数的产生 1.1 二项分布 在贝努力试验中&#xff0c;某事件A发生的概率为p&#xff0c;重复该实验n次&#xff0c;X表示这n次实验中A发生的次数&#xff0c;则随机变量X服从的概率分布律&#xff08;概率密度&#xff09;为 记为 binopdf(x,n,p) p…

BiMPM实战文本匹配【下】

引言 这是BiMPM实战文本匹配的第二篇文章。 注意力匹配 如上图所示&#xff0c;首先计算每个正向(或反向)上下文嵌入 h i p → \overset{\rightarrow}{\pmb h_i^p} hip​→​(或 h i p ← \overset{\leftarrow}{\pmb h_i^p} hip​←​)与另一句的每个正向(或反向)上下文嵌入 …

MQTT协议是什么?快速了解MQTT协议在物联网中的应用

随着工业互联网的迅猛发展&#xff0c;工业设备数据采集和实时监控成为制造业提高生产效率和质量的重要手段。在物联网应用中&#xff0c;通信技术包括Wi-Fi、RFID、NFC、RS232、RS485、USB等&#xff0c;其中在物联网技术框架体系中所使用到的通讯协议主要有&#xff1a;AMQP、…

企业软文推广应该如何巧妙植入品牌信息?

软文推广相比于传统硬广而言&#xff0c;成本更低且效果明显&#xff0c;因此不少企业在进行营销时都会优先考虑软文推广&#xff0c;但是部分企业在写软文时因为产品融入不明显导致软文推广没有效果。下面媒介盒子就来告诉大家&#xff0c;企业在进行软文推广时应该如何巧妙植…

数字孪生:降低现代船舶水声设备研制风险与成本的关键要素

声波是海洋中唯一能够有效传递远距离信息的载体&#xff0c;1000Hz的声波在海水中的每公里吸收衰减仅为0.067分贝&#xff0c;而在陆地上大显神通的电磁波由于受到海水高介电常数和高导电率的影响&#xff0c;因传播衰减量太大而无法通信。 声波在海洋中的传播也并非一帆风顺。…

C#,数值计算——Ranbyte的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Generator for random bytes using the algorithm generally known as RC4. /// </summary> public class Ranbyte { private int[] s { get; set; } n…

vue安装步骤

1、winR ->cmd 打开运行窗口 2、如下两种方式&#xff0c;测试电脑现有vue版本&#xff0c;提示"MODULE_NOT_FOUND"错误 (1)方式一&#xff1a;vue -V (2)方式二&#xff1a;vue -version 3、输入以下命令&#xff1a; 参考链接&#xff1a;https://blog.csdn.n…

自发光贴图和光照贴图的原理和作用

什么自发光贴图 自发光贴图&#xff08;Emissive Mapping&#xff09;是一种用于在计算机图形学中模拟自发光效果的技术。它可以将光源直接嵌入纹理贴图中&#xff0c;以模拟物体表面具有发光效果的材质。 传统的纹理贴图只能模拟物体表面的颜色和纹理&#xff0c;无法模拟物体…