C++ 流插入和流提取运算符的重载的实现
01流插入<<运算符的重载
C++在输出内容时,最常用的方式:
std::cout<<1<<"hello";
问题:
- 那这条语句为什么能成立呢?
- cout是什么?"<<"运算符能用在cout上呢?
原因:
- 实际上,cout是在iostream头文件中定义的ostream类的对象。
- "<<"能够用在cout上是因为,在ostream类对"<<"进行了重载。
对于std::cout<<1<<"hello";这条语句,有可能按以下的方式重载成ostream类的成员函数:
ostream&ostream::operator<<(intn) { ....//输出n整型的代码 return*this; } ostream&ostream::operator<<(constchar*s) { ....//输出s字符串的代码 return*this; }
- std::cout<<1;语句,等价于cout.operator<<(1);
- std::cout<<"hello";语句,等价于cout.operator<<("hello");
- std::cout<<1<<"hello";语句,等价于(cout.operator<<(1)).operator<<("hello");
02流插入<<运算符重载的例子
假定我们要想把某个对象里的内容进行打印输出,那么我们可以重载ostream类的流插入<<运算符。
下面以CStudent类作为例子:
classCStudent//学生类 { public: //构造函数 CStudent(intid=0,intage=0,stringname=""):m_id(id),m_age(age),m_name(name){} //将该函数声明成友元函数 //目的是使得函数可以访问CStudent类的私有成员变量 friendostream&operator<<(ostream&o,constCStudent&s); private: intm_age;//年龄 intm_id;//ID号 stringm_name;//名字 }; //重载ostream对象的流插入<<运算符函数 //目的是使得能打印输出CStudent对象的信息 ostream&operator<<(ostream&o,constCStudent&s) { o<输出结果:
1,20,小林coding
需要注意是ostream&operator<<(ostream&o,constCStudent&s)函数是全局的,所以函数的第一个参数必须要传入ostream的对象,并且CStudent类需要将此函数声明成友元函数,使得函数可以访问CStudent类的私有成员变量。
03流提取>>运算符重载的例子
还是以CStudent类作为例子,假设想通过键盘的输入的内容,来初始化对象,则我们可以重载istream类的流提取>>运算符。
classCStudent//学生类 { public: //构造函数 CStudent(intid=0,intage=0,stringname=""):m_id(id),m_age(age),m_name(name){} //将该函数声明成友元函数 //目的是使得函数可以访问CStudent类的私有成员变量 friendostream&operator<<(ostream&o,constCStudent&s); //将该函数声明成友元函数 //目的是使得函数可以给CStudent类的私有成员变量进行赋值 friendistream&operator>>(istream&is,CStudent&s); private: intm_age;//年龄 intm_id;//ID号 stringm_name;//名字 }; //重载ostream对象的流插入<<运算符函数 //目的是使得能打印输出CStudent对象的信息 ostream&operator<<(ostream&o,constCStudent&s) { o<>运算符函数 //目的是使得初始化CStudent对象的内容 istream&operator>>(istream&is,CStudent&stu) { stringinputStr; is>>inputStr; intpos=inputStr.find(",",0);//查找首次出现逗号的位置 stringtmpStr=inputStr.substr(0,pos);//截取从0到pos位置的字符串 stu.id=atoi(tmpStr.c_str());//atoi可以将char*类型的内容转成int类型 intpos2=inputStr.find(",",pos+1);//查找第二次出现逗号的位置 tmpStr=inputStr.substr(pos+1,pos2-pos-1);//取出age的值 stu.age=atoi(tmpStr.c_str());//atoi可以将char*类型的内容转成int类型 tmpStr=inputStr.substr(pos2+1,inputStr.length()-pos2-1);//取出name的值 stu.name=tmpStr; returnis; } intmain() { CStudentstu; //将输入的信息,初始化stu对象 cin< >stu; return0; } 输入内容和输出内容:
//输入内容:
1,20,小林coding//输出内容:
1,20,小林coding
04小结
要想流插入<<运算符和流提取>>运算符能针对自定义的对象,那么我们就需要重载针对该对象的ostream类的<<运算符和istream的>>运算符,并且只能重载成全局的函数,然后在CStudent类里需要把上面的两个重载函数声明成友元函数,使得两个重载的函数可以访问和赋值CStudent类里的私有成员函数。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。