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

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

最近在学习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);

    原文作者:Sharp_Zjf
    原文地址: https://blog.csdn.net/Sharp_Zjf/article/details/50903111
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞