最近在看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;
}
比较简单就补贴注释了。
不足之处 欢迎指出。