对输入输出符的重载

今天试着学习了一下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;的时候果断又错了。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值