C++Primer Plus 第12章 类和动态内存分配 12.10编程练习第3题new,delete的指向深度拷贝3题

系列文章目录

例如:C++Primer Plus第十二章类和动态内存分配第3题


`提示:3. 新编写程序清单 10.7和程序清单10.8描述的 Stock 类,使之使用动态分配的内存,而不是 string类对象来存储股票名称。另外,使用重载的operator<<()定义代替show()成员函数。再使用程序清单10.9测试新的定义程序。


`提示:要学习一定要认真的学习

前言

提示:知识点概括:

new[],delete[],operator<<()


提示:以下是本篇文章正文内容,下面案例可供参考

一、情景再现

在第十章我们实现过的方法。这里用跟好的方式实现

1 头文件,原程序清单10.7

#pragma once
//stock20.h -- augmented version 
#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()//内联函数,和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()const;
	const Stock& topval(const Stock& s)const;
};
#endif // !STOCK20_H_

2 实现方法.原程序清单10.8

//stock20.cpp--augmented version
//version 20
#include<iostream>
#include"stock20.h"

//默认无参的构造函数
Stock::Stock()
{
	std::cout << "默认的构造函数执行\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 << "用构造函数创建:" << co << "公司\n";
	company = co;
	if (n < 0)
	{
		std::cout << "持股数量不能小于0" << company << "公司的股票";
		shares = 0;
	}
	else
		shares = n;
	share_val = pr;
	set_tot();
}

Stock::~Stock()
{

}
//其他的方法
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()const
{
	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);
}

const Stock& Stock::topval(const Stock& s)const
{
	if (s.total_val>total_val)
		return s;
	else
		return *this;
}

3原测试函数10.9

示例:原测试函数不变。下面不再更新。

二、使用步骤

1.头文件,

代码如下(示例):

#pragma once
//stock20.h -- augmented version 
#ifndef STOCK20_H_
#define STOCK20_H_
#include<string>	
namespace NStock
{ 
	using std::ostream;
	class Stock
	{
	private:
		char* pCompany;			//公司
		long shares;			//股票数量
		double share_val;		//股票单价
		double total_val;		//总市值
		unsigned textLength;
		void assignMember(const char* text);
		void set_tot()			//内联函数,和inline同理,定义位于类申明中的函数自动成为内联函数
		{
			total_val = shares * share_val;
		}
	public:
		Stock(Stock& st);
		Stock( const char* co, long n = 0, double pr = 0.0);
		~Stock();
		//析构函数
		void acquire( char* co, long n, double pr);
		void buy(long num, double price);
		void sell(long num, double price);
		void update(double price);
		
		const Stock& topval(const Stock& s)const;
		friend ostream& operator<<(std::ostream& os, const Stock& str);
	};

	
	
}

#endif // !STOCK20_H_


2.方法的

代码如下(示例):

//stock20.cpp--augmented version
//version 20
#include<iostream>
#include"pe12_3.h"
namespace NStock
{
	Stock::Stock( const char* co, long n, double pr)
	{
		std::cout << "用构造函数创建:" << co << "公司\n";
		assignMember(co);
		if (n < 0)
		{
			std::cout << "持股数量不能小于0" << pCompany << "公司的股票";
			shares = 0;
		}
		else
			shares = n;
		share_val = pr;
		set_tot();
	}

	Stock::~Stock()
	{
		delete[]pCompany;
	}
	NStock::Stock::Stock(Stock& st)
	{
		assignMember(st.pCompany);
	}
	//其他的方法
	void Stock::acquire( char* co, long n, double pr)
	{
		assignMember(co);
		if (n < 0)
		{
			std::cout << "输入股票的数量不正确" << pCompany << "被设置为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();
	}


	const Stock& Stock::topval(const Stock& s)const
	{
		if (s.total_val > total_val)
			return s;
		else
			return *this;
	}



	ostream& 
	NStock::operator<<(std::ostream& os, const Stock& str)
	{

		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: " << str.pCompany << " Shares: " << str.shares << '\n';
		cout << " Share Proce:$" << str.share_val;
		cout.precision(2);
		cout << " Total Worth:$" << str.total_val << '\n';
		cout.setf(orig, ios_base::floatfield);
		cout.precision(prec);
		return os;
	}

	//私有成员
	void
		Stock::assignMember(const char* text)
	{
		textLength = strlen(text);
		pCompany = new char[textLength + 1];
		strcpy_s(pCompany, textLength + 1, text);
	}
}


总结

提示:这里对文章进行总结:

例如:动态内存的new,delelt的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值