c++ primer第一章大习题

最近在看c++ primer
第一章主要是c++ 的一些基础 介绍类相关的东西 基本上没什么特别的。

主要是 这个书店程序的头文件 寻思着自己写一下 ,在写的过程中 产生了一个疑问?
重载运算符的时候 发现在重载函数内可以访问新生成的对象和引入的对象的私有成员 以前都没注意到。
比如下面这个

Sales_item Sales_item::operator+(Sales_item &book)
{
	if (ISBN == book.ISBN)
	{
		Sales_item new_book;
		new_book.ISBN = ISBN ;
		new_book.number = number + book.number;
		new_book.price = (price + book.price) / 2;
		new_book.total_price = total_price + book.total_price;
		return new_book;
	}
	else
	{
		cerr << "ISBN号不同无法进行运算";
	}
}

上网查了下 以下是回答原话:
实践证明,类(class)私有成员可以被类成员函数访问,不区分成员在哪个实例(instance)里。也就是说,在类内部的成员函数中,哪怕是传入的对象,也是可以直接访问该对象的私有成员。(前提是该对象必须是本类型的一个对象)。

#include<iostream>
#include<string>
using namespace std;

class Sales_item
{
	string ISBN;
	int number;
	double price;
	double total_price;
public:
	Sales_item(string IS = "", int nu = 0, double pr = 0) :
		ISBN(IS), number(nu), price(pr) 
	{
		total_price = number*price;
	}
	string isbn() { return ISBN; }
	friend ostream &operator << (ostream &output, Sales_item &book);
	friend istream &operator >> (istream &intput, Sales_item &book);
	Sales_item operator+(Sales_item &book);
	void operator+=(Sales_item &book);
};

ostream &operator<<(ostream &output, Sales_item &book)
{
	output <<"ISBN号:"<< book.ISBN <<endl<<"出售册数:"<< book.number<<endl<<"单价:"<<book.price 
		<<endl<<"总销售额:"<<book.total_price<< endl;
	return output;
}
istream &operator >> (istream &intput, Sales_item &book)
{
	intput >> book.ISBN >> book.number >> book.price;
	book.total_price = book.number*book.price;
	return intput;
}

Sales_item Sales_item::operator+(Sales_item &book)
{
	if (ISBN == book.ISBN)
	{
		Sales_item new_book;
		new_book.ISBN = ISBN ;
		new_book.number = number + book.number;
		new_book.price = (price + book.price) / 2;
		new_book.total_price = total_price + book.total_price;
		return new_book;
	}
	else
	{
		cerr << "ISBN号不同无法进行运算";
	}
}
void Sales_item::operator+=(Sales_item &book)
{
	number+=book.number;
	price = (price+book.price)/2;
	total_price+= book.total_price;
}

还有一个点
在我们测试程序的时候 一般需要很多组数据的验证 用手一次一次的输入会搞的很烦 。
所以就得用到文件重定向
步骤
1.在生成的.exe文件同目录下 新建两个文本 一个用来输入 一个用来输出
2.在输入的文本中输入多组测试数据 以空格隔开或者换行也行。
3.在系统的命令行窗口 进入可执行文件(.exe)的目录下 执行以下命令

additem <infile >outfile

additem: .exe文件的文件名。
infile: 输入文件的文件名。
outfile:输出文件的文件名。
就能在输出文件里看到 结果了。

D:\文档\Visual Studio 2015\Projects\exercise2\Debug>exercise2 <1.txt >2.txt

下面是这两个文本。
在这里插入图片描述在这里插入图片描述
exercise2.cpp

#include<iostream>
#include"Sales_item.h"
#include<vector>
using namespace std;

int main()
{
	Sales_item book;
	int i;
	vector<Sales_item> items;
	while (cin >> book)
	{
		for ( i = 0; i < items.size(); i++)
		{
			if (book.isbn() == items[i].isbn())
			{
				items[i] += book; break;
			}
		}
		if (i == items.size())
		{
			items.push_back(book);
		}
	}
	for (i = 0; i < items.size(); i++)
	{
		cout << items[i] << endl;
	}
	return 0;
}

比较简单就补贴注释了。

不足之处 欢迎指出。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值