今天试着学习了一下C++对输入输出符号重载,发现遇到了一下的问题。
我自己定义了一个类叫做 Sales_item,我想实现的功能是使cout<<和cin>>能够对对象进行处理,换句话说是重载了<<和>>
这是我定义的头文件。
第一个问题是:我之前把我想要重载的三个方法 + ,>>和<<写在了类的里面, 也就是变成了类的成员方法。
后来发现这是错误的,对于io的重载不能是作为成员方法。
include <iostream>
using namespace std;
class Sales_item {
public:
string ISBN;
int num;
double val;
Sales_item(){
}
~Sales_item(){
};
};
Sales_item &operator+(const Sales_item book1,const Sales_item book2);
ostream &operator<<(ostream &os,Sales_item &book);
istream &operator>>(istream &is,Sales_item &book);
这是具体的cpp实现
#include "Sales_item.h"
#include <string>
Sales_item &operator+(const Sales_item book1, const Sales_item book2) {
Sales_item *res = new Sales_item();
res->ISBN = book1.ISBN;
res->num = book1.num + book2.num;
res->val = book1.val + book2.val;
return *res;
}
ostream& operator<<(ostream &os, Sales_item &book) {
os<<"ISBN: "<<book.ISBN<<"num: "<<book.num<<"val: "<<book.val;
return os;
}
istream& operator>>(istream &is, Sales_item &book) {
is>>book.ISBN;
cout<<book.ISBN;
is>>book.num;
cout<<book.num;
is>>book.val;
cout<<book.val;
return is;
}
我写了一个主函数运行。
#include <iostream>
#include "Sales_item.h"
using namespace std;
int main() {
cout << "Hello, World!" << std::endl;
cout<<"book1 :"<<endl;
Sales_item book1,book2,book3;
cin>>book1;
cout<<"book2"<<endl;
cin>>book2;
cout<<"book3"<<endl;
cin>>book3;
cout<<"book1 + book2 :"<<endl;
Sales_item book = book1 + book2 + book3;
cout<<book;
return 0;
}
在进行输入的时候cin>>book1,值是正确的,但是在输入完之后,对象book1竟然跳转到了析构函数,然后把内存给释放了。
后来才发现,在定义输入方法的时候
istream &operator>>(istream &is,Sales_item book);
在book前没有加& 引用符号,那么在调用方法的时候,使用的是拷贝参数,当然在执行完方法后,内存会释放。
后来又发现第三个问题
Sales_item operator+(const Sales_item book1,const Sales_item book2);
这个方法返回类型也忘了加&,于是变成返回了对象而不是引用类型。
然后在调用方法cout<<book1+book2;的时候果断又错了。