在实现操作符重载时为何使用友元?

本文探讨了C++中操作符重载的概念,并详细解释了为何在某些情况下需要使用友元来实现操作符重载,特别是对于<<等非成员二元操作符的重载。

在实现操作符重载时为何使用友元?
1.不管是友元函数还是友元类都是为了让外部函数或类可以访问到其他类中对外部私有的量。
2.一般情况下不推荐使用友元,因为其是高耦合。
3.一些情况需要用到友元,如操作符重载中的<<重载。
这里要先说明重载operator的使用方法,operator可以重载操作符如下:
可以重载的操作符

+   -   *   /   %   ^   &   |   ~
!   =   <   >   +=  -=  *=  /=  %
^=  &=  |=  <<  >>  >>= <<= ==  !=
<=  >=  &&  ||  ++  --  ->* ‘   ->
[]  ()  new delete  new[]   delete[] 

其定义:
操作符函数是一种特殊的成员函数或友员函数
也就是说完整的操作符函数需要借助友元。
成员函数的语法形式为:

类型   类名  ::  operator  op ( 参数表 )
    {
          // 相对于该类定义的操作
    }

可以知道在操作符有的一目有的二目,当操作符重载函数为成员函数时默认操作符左侧的参数可以通过该类的this指针获取,右侧的参数作为operator的参数输入,这样就可以使用一个参数的操作符重载来实现二目操作符的重载,比如:

bool operator==(MyString& s) const;//重载等于号
bool MyString::operator==(MyString& s) const
{
if (this->m_len != s.m_len){
return false;
}
else{
return !strcmp(m_p,s.m_p);
}
}
但是如果要重载<<操作符输出结果,一般的写法是cout<<s;也即是说左侧不是成员函数或类可以通过this指针调用的量,这就造成必须使用两个参数的成员操作符重载,把第一个参数作为<<左侧参数,第二个参数做为<<右侧参数输入,然而会发现如:
ostream& operator<<(ostream& out, MyString& s);//报错,error:此运算符的参数太多

因此只能通过友元实现二元非成员重载:

friend ostream& operator<<(ostream& out,MyString& s);//重载<<输出操作符,利用友元访问内布置
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值