C++ 类的构造函数和析构函数

news2024/9/27 7:15:01

目录

  • 类的构造函数和析构函数
    • 构造函数
      • 声明构造函数
      • 定义构造函数
      • 使用构造函数
      • 默认构造函数
    • 析构函数
      • 析构函数的声明
      • 析构函数的定义
    • 改进Stock类(加入构造函数和析构函数)

类的构造函数和析构函数

构造函数

常规的初始化语法不适用类的初始化
例如:

int a = 10;//整型的初始化
struct thing
{
	char *str;
	int m;
};
//结构体初始化
struct thing t1 = {"test",666};
class Test
{	
	private:
		int a;
		int b;
	public};

Test t1 = {22,33};//编译错误

不能像结构体一样初始化Test对象的原因是数据部分的访问状态是私有的,这意味着程序不能直接访问数据成员。
如果将数据成员成为公有,而不是私有,就可以像刚才那样初始化类对象,但使数据成为公有的违背了类的一个主要初衷:数据隐藏
一般来说,最好是在创建对象时对它进行初始化。

声明构造函数

Stock(const std::string & co,long n = 0,double pr = 0.0);//设置默认值

定义构造函数

//构造函数,没有返回值
Stock::Stock(const std::string & co,long n,double pr)
{
    company = co;
    if(n<0)
    {
        std::cout << "Number of shares can't be nagative;" 
        << company << " shares set to 0.\n";
        shares = 0;

    }
    else
        shares = n;

    share_val = pr;
    set_tot();
}

使用构造函数

Stock food = Stock("World Cabbage",250,1.25);//显示地调用
Stock food("World Cabbage",250,1.25);//隐式地调用
Stock *p1 = new Stock("games",18,19.0);//new动态分配内存  

构造函数的使用方式不同于其他类方法,一般来说,使用对象来调用方法

food.show();

但无法使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的,因此构造函数被用来创建对象,而不能通过对象来调用。

默认构造函数

Stock fluffy_the_cat;

如果没有提供任何构造函数,则C++将自动提供默认构造函数。它是默认构造函数的隐式版本。默认构造函数没有参数,因为声明中不包含值。

Stock::Stock(){ }

注意的是:
当没有定义任何构造函数时,编译器才会提供默认构造函数,为类定义了构造函数后,就必须为它提供默认构造函数,否则将出错。

#ifndef STOCK00_H_
#define STOCK00_H_
#include <string>

class Stock
{
    private://可不写,默认是private
        std::string company;
        long shares;
        double share_val;
        double total_val;
        void set_tot(){total_val = shares * share_val;}//内联函数
    public:
        Stock(const std::string & co,long n = 0,double pr = 0.0);//设置默认值
        Stock(){}//默认构造函数
};
#endif
#include<iostream>
#include"stock00.h"
//构造函数,没有返回值
Stock::Stock(const std::string & co,long n,double pr)
{
    company = co;
    if(n<0)
    {
        std::cout << "Number of shares can't be nagative;" 
        << company << " shares set to 0.\n";
        shares = 0;

    }
    else
        shares = n;

    share_val = pr;
    set_tot();
}

析构函数

用构造函数创建对象后,程序负责跟踪该对象,直到过期为止。对象过期时,程序将自动调用一个特殊的成员函数,即析构函数

析构函数的声明

在类名前加上~

~Stock();

析构函数的定义

//析构函数
Stock::~Stock()
{
    using std::cout;
    cout << "Bye" << "!\n";

}

改进Stock类(加入构造函数和析构函数)

#ifndef STOCK00_H_
#define STOCK00_H_

#include <string>

class Stock
{
    private://可不写,默认是private
        std::string company;
        long shares;
        double share_val;
        double total_val;
        void set_tot(){total_val = shares * share_val;}//内联函数

    public:
        Stock(const std::string & co,long n = 0,double pr = 0.0);//设置默认值
        Stock(){}//默认构造函数
        ~Stock();//析构函数
        void acquire(const std::string & co,long n,double pr);
        void buy(long num,double price);
        void sell(long num,double price);
        void update(double price);
        void show();

};
#endif
#include<iostream>
#include"stock00.h"

//定义成员函数时,使用作用域解析运算符::来标识函数所属的类

//构造函数,没有返回值
Stock::Stock(const std::string & co,long n,double pr)
{
    company = co;
    if(n<0)
    {
        std::cout << "Number of shares can't be nagative;" 
        << company << " shares set to 0.\n";
        shares = 0;

    }
    else
        shares = n;

    share_val = pr;
    set_tot();
}
//析构函数
Stock::~Stock()
{
    using std::cout;
    cout << "Bye, " << company << "!\n";

}
void Stock::acquire(const std::string & co,long n,double pr)
{
    company = co;
    if(n<0)
    {
        std::cout << "Number of shares can't be nagative;" 
        << company << " shares set to 0.\n";
        shares = 0;

    }
    else
        shares = n;

    share_val = pr;
    set_tot();
}

void Stock::buy(long num,double price)
{
    if(num<0)
    {
        std::cout << "Number of shares purchased can't be negative. " 
        << "Transaction is aborted.\n";

    }
    else
    {
        shares += num;
        share_val = price;
        set_tot();
    }

}
void Stock::sell(long num,double price)
{
    using std::cout;
    if (num<0)
    {
        cout << "Number of shares sold can't be negative. "
         << "Transaction is aborted.\n";
    }
    else if(num > shares)
    {
        cout << "You can't sell more than you have! "
        << "Transaction is aborted.\n";

    }
    else
    {
        shares -= num;
        share_val = price;
        set_tot();

    }
}

void Stock::update(double price)
{
    share_val = price;
    set_tot();
}

void Stock::show()
{
    using std::cout;
    cout << "Company: " << company << "Shares: " 
            << shares << '\n' << "Share Price: $" 
            << share_val << " Total Worth: $" 
            << total_val << '\n';
}
#include<iostream>
#include"stock00.h"
int main()
{
    /*
    food.Sock();  不能使用对象来调用构造函数
    */
    #if 0
    Stock food = Stock("World Cabbage",250,1.25);//显示地调用
    Stock food("World Cabbage",250,1.25);//隐式地调用
    food.show();
    #endif

    #if 1
    /*
    当没有定义任何构造函数时,编译器才会提供默认构造函数;假如定义了构造函数,没有定义默认构造函数,则 "Stock fluffy_the_cat"
    这样的形式创建对象时会出错,默认构造函数是形参为空的函数,例如"Stock(){}"
    */
    Stock fluffy_the_cat;
    fluffy_the_cat.acquire("NanoSmart",20,12.50);
    fluffy_the_cat.show();
    fluffy_the_cat.buy(15,18.125);
    fluffy_the_cat.show();
    fluffy_the_cat.sell(400,20.00);
    fluffy_the_cat.show();
    fluffy_the_cat.buy(300000,40.125);
    fluffy_the_cat.show();
    fluffy_the_cat.sell(300000,0.125);
    fluffy_the_cat.show();
    #endif
    return 0;

}

在这里插入图片描述

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

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

相关文章

Deepin20.9 安装Mysql

文章目录 mysql下载查看 mysql 状态卸载卸载mysql&#xff1a;清理残留数据检查是否删除完毕 mysql Deepin 安装 下载 从网上下载 https://dev.mysql.com/get/mysql-apt-config_0.8.23-1_all.deb 安装 mysql-apt-config 下载文件名: mysql-apt-config_0.8.23-1_all.deb …

PoseiSwap IDO 即将开启,一览 $POSE 经济模型

以太坊创始人 Vitalik Buterin 曾在今年以太坊黑山大会上&#xff0c;进行了以“以太坊的三个技术挑战&#xff1a;扩容、隐私和用户安全”为主题的演讲&#xff0c;阐明了具有隐私性、可扩展性和安全性的且易访问的区块链生态将是行业发展趋势&#xff0c;或许重复造轮子正在变…

【探索 Kubernetes|作业管理篇 系列 10】Pod 健康检查和恢复机制

前言 大家好&#xff0c;我是秋意零。 上一篇中介绍了&#xff0c;Pod 的服务对象&#xff0c;从而对 Pod 有了更深的理解&#xff1b; 今天的主题是 Pod 健康检查和恢复机制&#xff0c;我们将结束 Pod 的内容。 最近搞了一个扣扣群&#xff0c;旨在技术交流、博客互助&am…

图像中提取文本

将从此图像中提取文本。我使用得是 PyCharm&#xff0c;您随意编辑器或IDE 1、下载所需得库和exe文件&#xff1a; tesseract-ocr 可执行exe文件下载后&#xff0c;安装时无需指定安装目录。 http://jaist.dl.sourceforge.net/project/tesseract-ocr-alt/tesseract-ocr-setup-3…

代码随想录二刷day25 | 回溯 之 216.组合总和III 17.电话号码的字母组合

216.组合总和III 题目链接 解题思路&#xff1a; 选取过程如图&#xff1a; 图中&#xff0c;可以看出&#xff0c;只有最后取到集合&#xff08;1&#xff0c;3&#xff09;和为4 符合条件。 递归三部曲 确定递归函数参数 和77. 组合 一样&#xff0c;依然需要一维数组path…

走进人工智能|深度学习 算法的创世纪

前言&#xff1a; 深度学习通过训练深层神经网络模型&#xff0c;可以自动学习和提取数据的特征&#xff0c;包括更准确的图像识别、自然语言处理、医学诊断等方面的应用。 文章目录 序言背景算法的创世纪技术支持应用领域程序员如何学总结 序言 深度学习是一种机器学习方法&a…

easyui05(datagrid数据新增)

一.对话框&#xff1a;Dialog 加载页面 <div id"myDialog" style"display:none"></div> 二.editGoods.jsp 表单 myForm <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <tit…

2023年互联网Java面试复习大纲:ZK+Redis+MySQL+Java基础+架构

多数的公司总体上面试都是以自我介绍项目介绍项目细节/难点提问基础知识点考核算法题这个流程下来的。有些公司可能还会问几个实际的场景类的问题&#xff0c;这个环节阿里是必问的&#xff0c;这种问题通常是没有正确答案的&#xff0c;就看个人的理解&#xff0c;个人的积累了…

Vue练手项目之仿京东到家主页

目录 概述1.效果展示2.使用原始HtmlCSS实现3.使用Vue.js进行组件化3.1 Header部分组件实现3.1.1图标的展示3.1.2 定义Vue调试的名称3.1.3 使用scoped隔离组件间的css影响 3.2 附近店铺部分实现3.3 底部导航栏组件的实现3.4 将组件组成一个整体页面 4.代码地址 概述 本人是一个…

【微信小程序开发】第 9 课 - 小程序的协同工作和发布

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、协同工作 1.1、了解权限管理需求 1.2、了解项目成员的组织结构 1.3、小程序的开发流程 2、小程序成员管理 2.1、成员管…

【Unity Shader】Special Effects(八)Wireframe 线框化(UI)

更新日期:2023年6月17日。 Github源码:[点我获取源码] 索引 Wireframe 线框化思路分析Sobel算子片元输入数据结构-定义片元输入数据结构-填充片元输入数据结构-传入属性定义求梯度值方法求边缘方法范围控制线框化渐变动画Wireframe 线框化 线框化效果可以将一张图像根据纹理…

从618「技术暗战」,看乡村振兴的未来「赛点」

作者 | 曾响铃 文 | 响铃说 作为消费复苏后的首个消费节点&#xff0c;从“史上消费者福利最大的618”“史上投入最大的一届618”等口号&#xff0c;都能感觉到这届618的火药味比以往要浓得多。 有业内人士透露&#xff0c;这次的年中大促无论从商品种类、数量还是提供的服务…

【自动化测试】是否有必要做自动化测试?

‍目录 一、前言 二、自动化目的 三、自动化分类 四、自动化实现 一、前言 在一些测试交流群经常会看到有小伙伴在问&#xff0c;"怎么做自动化测试&#xff1f;学习自动化测试有什么资料吗&#xff1f;自动化测试是不是很牛逼&#xff1f;" &#xff0c;甚至有…

Python之面向对象和继承

一、关于None和判断的总结 1.1、None是什么&#xff1f; 与C和JAVA不同&#xff0c;python中是没有NULL的&#xff0c;取而代之的是None。None是一个特殊的常量&#xff0c;表示变量没有指向任何对象。在Python中&#xff0c;None本身实际上也是对象&#xff0c;有自己的类型N…

浅谈自动化测试框架开发

在自动化测试项目中&#xff0c;为了实现更多功能&#xff0c;我们需要引入不同的库、框架。 首先&#xff0c;你需要将常用的这些库、框架都装上。 pip install requests pip install selenium pip install appium pip install pytest pip install pytest-rerunfailures pip …

【深度学习】基于pytorch的FER2013人脸表情图像识别(ResNet/VGG/DenseNet)

题目要求 1.1. 任务要求 数据集&#xff1a;Facial Expression Recognition Challenge&#xff0c;共有7类&#xff1a;生气、恶心、害怕、快乐、悲伤、惊讶、中性。 基本要求&#xff08;50%&#xff09;&#xff1a;构建ResNet分类模型18层。 改进&#xff08;30%&#x…

Disruptor(1):Disruptor简介

1 什么是Disruptor Martin Fowler在自己网站上写了一篇LMAX架构的文章&#xff0c;在文章中他介绍了LMAX是一种新型零售金融交易平台&#xff0c;它能够以很低的延迟产生大量交易。这个系统是建立在JVM平台上&#xff0c;其核心是一个业务逻辑处理器&#xff0c;它能够在一个线…

如何关闭电脑自动更新?一招教你永久关闭!

百度安全验证https://baijiahao.baidu.com/s?id1749271752443309717

《微服务架构设计模式》第三章 微服务架构中的进程间通信

内容总结自《微服务架构设计模式》 微服务架构中的进程间通信 一、通信概述通信方式API定义消息格式 二、同步通信RESTgRPC断路器服务发现 三、异步通信消息消息通道消息代理消息问题 ) 一、通信概述 通信方式 有很多进程间通信技术可供开发者选择。服务可以使用基于同步请求…

国产操作系统介绍和安装

国产操作系统 分类 操作系统分类国产操作系统银河麒麟中科方德统信UOS红旗Linux深度系统优麒麟系统 具体介绍 麒麟操作系统 麒麟操作系统&#xff08;Kylin操作系统&#xff0c;简称麒麟OS&#xff09;&#xff0c;是一种国产操作系统&#xff0c;由国防科技大学研发&#x…