VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1722|回复: 11

关于重载运算符+的一个问题

[复制链接]

3

主题

9

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-3-20 14:00:02 | 显示全部楼层 |阅读模式
operator + ()函数不是可以定义为成员函数也可以定义为友元函数,那两种情况有什么区别?
谢谢!
回复

使用道具 举报

0

主题

49

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-6-25 23:00:01 | 显示全部楼层
假设类BigInt是个大数处理类
BigInt有BigInt(int i)构造函数
BigInt temp;
BigInt temp2 = 2 + temp;
成员函数无法将2隐式转换为BigInt,友元函数则可以
回复

使用道具 举报

0

主题

49

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-6-26 00:30:01 | 显示全部楼层
应该说对成员函数重载+来说,该句子相当于:
BigInt temp2 = 2.operator+(temp);
这是个错误的句子
回复

使用道具 举报

0

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-6-26 09:30:01 | 显示全部楼层
作为成员的运算符比起作为非成员的运算符,在声明和定义时,形式上少了一个参数,这是因为c++
对所有的成员函数隐藏了了第一个参数this

同样的,重载后的运算符作为成员函数也比作为友元的函数参数多一个,拿 运算符 + 来说,在成员函数中,它第一个参数是它所属的那个对象,第二个是一个参数,而在友元函数中,两个对象都是参数
声明如下
成员函数版: SomeClass operator + (SomeClass )
友元函数版: friend SomeClass operator +(SomeClass ,SomeClass)
Someclass  为一个类名,假设这两个函数返回的都是 SomeClass 对象.
回复

使用道具 举报

3

主题

9

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
 楼主| 发表于 2020-6-26 15:45:01 | 显示全部楼层
原来内部还有那么多道理呢!谢谢!
回复

使用道具 举报

0

主题

63

帖子

43.00

积分

新手上路

Rank: 1

积分
43.00
发表于 2020-6-28 16:15:01 | 显示全部楼层
恩,参数可以隐式类型转换,一个object不可以。建议看effective c++ Item19
回复

使用道具 举报

0

主题

8

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-6-30 00:45:01 | 显示全部楼层
Member function has a latent parameter.
Friend function does't.
回复

使用道具 举报

2

主题

20

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
发表于 2020-7-5 14:45:02 | 显示全部楼层
如果你要把对象自己放在运算符左边,那么就不能用成员函数实现
回复

使用道具 举报

1

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-7-12 22:45:01 | 显示全部楼层
双目运算符最好用友员函数,单目用成员函数
回复

使用道具 举报

1

主题

39

帖子

27.00

积分

新手上路

Rank: 1

积分
27.00
发表于 2020-7-12 23:45:01 | 显示全部楼层

成员定义有更多的限制, 因为默认的规格是:
operator+ ( int ) const -----> operator+ ( T const&, int ) const;

而友员就没有那么多限制,可以分别修订两个参数,做一些调整等
operator+ ( T const&, int )
operator+ ( int, T const& )

从重载的角度看, 友员都是比较灵活的.
但是,能用成员还是使用成员比较爽.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表