C++Primer Plus第十章对象和类 构造函数和析构函数的使用,(析构函数的正确理解)

在上面代码的基础上只需要添加构造函数和 析构函数即可,这里直接上代码
stock10.h,stock10.cpp,usestock2.cpp

#ifndef STOCK10_H_
#define STOCK10_H_
#define CLASS2 1
#if CLASS2
//stock10.h
#include<string>	
class Stock //class declaration 
{
private:
	std::string company; //公司
	long shares;//股票数量
	double share_val;//股票单价
	double total_val;//总市值
	void set_tot()//内联函数,和inline同理,定义位于类申明中的函数自动成为内联韩式
	{
		total_val = shares * share_val;
	}
public:
	//两个构造函数
	Stock();//默认的构造函数
	Stock(const std::string& co, long n = 0, double pr = 0.0);
	~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 // CLASS2
//stock10.cpp--using class with constructors,destructor added
//version 00
#include<iostream>
#include"stock10.h"
//add
//默认无参的构造函数
Stock::Stock()
{
	std::cout << "默认的构造函数执行\n";
	company = "no name";
	shares = 0;
	share_val = 0.0;
	total_val = 0.0;
}
//add
Stock::Stock(const std::string& co, long n , double pr)
{
	std::cout << "用构造函数创建:" << co << "公司\n";
	company = co;
	if (n < 0)
	{
		std::cout << "持股数量不能小于0" << company << "公司的股票";
		shares = 0;
	}
	else
		shares = n;
	share_val = pr;
	set_tot();
}
//add,析构函数对象
Stock::~Stock()
{
	std::cout << "Bye," << company << "!\n";
}
//其他的方法
void Stock::acquire(const std::string& co, long n, double pr)
{
	company = co;
	if (n<0)
	{
		std::cout << "输入股票的数量不正确" << company << "被设置为0";
		shares = 0;
	}
	else
	{
		shares = n;
	}
	share_val = pr;
	set_tot();
}

void Stock::buy(long num, double price)
{
	if (num<0)
	{
		std::cout << "股票的数量不能是负数" << "请求终止";
	}
	else
	{
		shares += num;
		share_val = price;
		set_tot();
	}
}
void Stock::sell(long num, double price)
{
	using std::cout;
	if (num<0)
	{
		cout << "股票的数量不能是负数" << "请求终止";
	}
	else if (num>shares)
	{
		cout << "你输入的数量超过你持有的数量" << "请求终止"<<"\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;
	using std::ios_base;

	//设置输入格式 #.###
	ios_base::fmtflags orig = cout.setf(ios_base::fixed, ios_base::floatfield);
	std::streamsize prec = cout.precision(3);

	cout << "公司:" << company<<"\n"
		<< "股票:" << shares << "\n"
		<< "股价:$" << share_val<<"\n";

		//设置输出格式 #.##
		cout.precision(2);
		cout<< "总值:$" << total_val << "\n";

		//回复原始格式
		cout.setf(orig, ios_base::floatfield);
		cout.precision(prec);
}
#pragma region 练习1.10.3
//usestck1.cpp -- using the Stock class
//compile with stock10.cpp
#if 1
#include <iostream>
#include"stock00.h"
int main()
{
	{
		using std::cout;
		cout << "用构造函数创建新的对象\n";
		Stock stock1("阿里巴巴", 20, 12.50);
		stock1.show();
		Stock stock2("腾讯", 2, 2);
		stock2.show();

		cout << "赋值stock1 to stock2:\n";
		stock2 = stock1;
		cout << "显示stock1,stock2\n";
		stock1.show();
		stock2.show();

		cout << "用构造函数复位对象\n";
		stock1 = Stock("微软", 10, 50.0);//temp object,从新创建的时候,会释放原来的赋值,故而执行析构函数,打印出来,在给创建
		cout << "析构函数释放stock1:\n";
		stock1.show();
		cout << "Done\n";
	}
	return 0;
}
#endif 
#pragma endregion

这里为了大家理解构造函数和析构函数,我这里把打印的情况截屏吹来

在这里插入图片描述
1,我们看到在创建对象stock1的时候,带参数的构造函数被调用,之后通过show的方法打印出来,stock2创建的时候,也被打印出来。
2,对象stock1,stock2可以进行赋值操作。打印的结果看赋值是成功的。
3,stock1,再一次被创建的时候,发现析构函数把微软抛出来了。
4,但最后show的时候,微软的信息是正常打印出来的,所以可以得出结论,直接赋值是不会执行析构函数的,通过析构函数创建对象后,执行析构函数,这里并没有推出本(main())函数体
5,打印完成“Done\n”之后,两个析构函数再执行, 可以理解为推出本函数体,析构函数执行一次
综合4,5:可以理解为对象被销毁的时候析构函数执行一次。如果这样的话,可以打印一下两次生成的stock1的地址是否是同一个地址,打印的结果可以知道地址是没有变化的,但是这是否也理解为对象被销毁了呢。暂时留一个疑问(后来发现,这个删除的是临时变量,删除临时变量的时候,析构函数就执行了,这里要理解一下,不是整个函数体退出执行析构函数)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值