运算符重载函数作为类成员函数与友元函数的区别

来源:互联网 发布:wol网络唤醒 安卓 编辑:程序博客网 时间:2024/06/05 23:42

运算符重载函数作为类成员函数与友元函数

最近在学习C++的基础,简单地记一些笔记。

关于运算符重载函数作为成员函数还是友元函数的注意点:

当运算符重载函数作为类的成员函数时,要求操作数左边必须是一个对象,而函数的参数可以是同类的对象也可以是普通的变量。这要看具体的问题具体分析,比如下面的例子:
//作为类成员函数定义:Complex operator+(Complex &c1){    return new Complex(this.real+c1.real,this.image+c1.image);}//调用:1)c3 = c1+c2;  即 c3 = c1.operator+(c2)  //正确2)c3 = c1+5;  函数原型:Complex operator+(int i){}  //正确3)c3 = 5+c1;  //错误
以上第三种调用方式显然不能利用定义的重载运算符的,这是因为没有办法调用i.operator+(c1)。那么如果想要这么做,只能作为类的非成员函数,而且当要访问的数据为对象的私有成员函数时,则必须声明为类的友元函数。

重载运算符的规则

不允许用户自定义新的运算符,只能对已有的运算符进行重载

重载运算符不允许改变运算符原操作数的个数

重载运算符不能改变运算符的优先级

重载运算符函数不能有默认的参数,会导致参数个数不匹配

重载双目运算符(略:可参照以上的规则直接重载)

重载单目运算符(主要学习一下前置自增和后置自增)

Time Time::operator++(){  //前置自增    if(++sec >= 60){        sec -= 60;        minute ++ ;    }    return *this;}Time Time::operator++(int){ //后置自增    Time temp(*this);    sec ++ ;    if(sec >= 60){        sec -= 60;        minute ++ ;    }    return temp;}
区别:前置自增是返回自加后的自己,而后置自增是先返回未增加前的对象,然后对象再自加

比如:

int main(){    Time t1(34,59),t2;    cout<<"time1 : ";    t1.display();    ++t1;    cout<<"time1 : ";    t1.display();    t2 = t1++;    cout<<"time1 : ";    t1.display();    cout<<"time2 : ";    t2.display();}

输出如下:
time1 : 34:59
++time : 35:0
time1++ : 35:1
t2 : 35:0

重载流插入运算符和流提取运算符

必须声明为该类的友元函数,原型如下:
friend ostream & operator<<(ostream &output,Complex &c);friend istream & istream>>(istream &input,Complex &c);

0 0