系列文章目录
例如: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的使用。
877

被折叠的 条评论
为什么被折叠?



