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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值