关于<<和>>重载操作符 返回值的问题

来源:互联网 发布:linux apache 加载php 编辑:程序博客网 时间:2024/06/01 10:23

操作符重载一般有以下几点需要注意的:

1)重载操作符必须有一个类类型的操作数,这是为了避免对已有的内置类型对象的操作符的原本含义的更改;

2)重载后的操作符的优先级和结合性是固定不变的;

3)重载操作符为类成员函数时,它的形参表中会少一个形参,原因是有一个隐含形参this,而且该this形参限定为第一个操作数;

4)当操作符为非类成员函数的时候,如果该函数需要访问类的私有数据成员,需要将该操作符设置为友元。

下面主要介绍介个常用的操作符重载模式以及需要注意的问题

一、输出操作<<的重载

其函数原型是

ostream& operator<<(ostream& os, const Classtype &object) {

                 os<<object.(数据成员名);

                 return os;

}

针对上面的操作符重载,我们给出以下解释:

该操作符重载的第一个形参类型是ostream&,原因是ostream对象不能复制,因此选择引用,ostream对象同样不能是const的,因为写入到流通长会改变流的状态。第二个形参为const Classtype的应用,原因是为了避免类对象的复制,同时输出操作不应该对对象的数据成员做修改,所以应该声明为const的。另外输出操作符要尽可能少的做格式化,而且IO操作符必须为非类成员函数,主要是为了和目前所用的形式统一,通常将其设置为类的友元。返回值类型是ostream& 类型个人认为主要是为了使用方便,适用于连写的这种方式,比如cout<<object1<<object2.........

#include <iostream>#include <string>using namespace std;class student{public:student():a(0),s("Hello"){};student(int c,string s1):a(c),s(s1){};student& student::operator=(student &stu){this->a=stu.a;this->s=stu.s;return *this;}/*friendvoid operator<<(ostream& out,const student &stu){out<<stu.a<<"\t"<<stu.s;}*/friend ostream& operator<<(ostream& out,const student &stu){//注意此处的形参,out不可以为const。out<<stu.a<<"\t"<<stu.s;return out;}friend istream& operator>>(istream& in,student &stu){//返回值必须为引用,且类形参为非const,因为要对其写入。in>>stu.a>>stu.s;return in;}private:int a;string s;};int main(){student ab(3,"I miss you");student stu1,stu2;stu1=stu2=ab;//=操作符返回值,可以为引用或者非引用,因为操作顺序是从右向做操作的。cout<<stu1;//即使<<操作符返回值为空值,也可以这么进行输出。但是如果想连续输出//就像cout<<stu1<<stu2;就必须使用返回值为ostream &的版本了,而且此时的返回值必须为引用。。//因为操作的顺序是从左到右,返回的引用,还可以对其赋值。如果返回非引用,ostream对象没有办法复制cin>>stu1;cout<<stu1;return 1;}


原创粉丝点击