C++ 运算符重载

mediam2000 2009-04-10 08:51:29
编译器遇到类的运算符重载时,怎么来判定使用友元函数或成员函数?
例如:
class V
{
public:
V operator+( const V );// 重载运算符函数,operator+声明为成员函数
...
private:
...
};

int main()
{
V v1, v2, v3;
v3 = v1 + v2 // 在这里如果编译器将v1 + v2解释为operator+(v1,v2),岂不是大大不妙;
// 编译器依据什么将v1 + v2 解释为v1.operator(v2);而不是operator+(v1,v2)????;


}

请高手解答,谢谢!!!
...全文
127 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
liubuweiright 2009-04-11
  • 打赏
  • 举报
回复
学习
mediam2000 2009-04-10
  • 打赏
  • 举报
回复
试验结果如下:
同时都定义‘+’的重载运算符的成员函数和友元函数,重载运算符的成员函数的优先级比重载运算符的友元函数高,因此这时解释为:operator+( V *this, v2);

删除‘+’的重载运算符的成员函数后,由于首先没有找到类的重载运算符的成员函数,转而去查找是否有友元函数,因此这时会解释为:operator+( v1, v2);

都删除去时,当然就是报错。。。
============================================================================================================================

谢谢,明天有时间我也测试一下,据说C++ premier 上有比较详细的解释
Jarrys 2009-04-10
  • 打赏
  • 举报
回复
试验结果如下:
同时都定义‘+’的重载运算符的成员函数和友元函数,重载运算符的成员函数的优先级比重载运算符的友元函数高,因此这时解释为:operator+( V *this, v2);

删除‘+’的重载运算符的成员函数后,由于首先没有找到类的重载运算符的成员函数,转而去查找是否有友元函数,因此这时会解释为:operator+( v1, v2);

都删除去时,当然就是报错。。。
mengde007 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 mediam2000 的帖子:]
编译器遇到类的运算符重载时,怎么来判定使用友元函数或成员函数?
例如:
class V
{
public:
V operator+( const V );// 重载运算符函数,operator+声明为成员函数
...
private:
...
};

int main()
{
V v1, v2, v3;
v3 = v1 + v2 // 在这里如果编译器将v1 + v2解释为operator+(v1,v2),岂不是大大不妙;
// 编译器依据什么将v1 + v2 解释为v1.operator(v2…
[/Quote]
你的这个问题很是那个……编译器有一套完整的解决方案,如果非要问个为什么的话,我想只有编译器的作者知道。
liliangbao 2009-04-10
  • 打赏
  • 举报
回复
成员函数默认的就可以是this指针作为第一个参数~
按照LZ的意思你应该将其定义为友元函数~
术木 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sky0801636 的回复:]
当你用友员函数进行运算符重载时,编译器将会把 v1 + v2 解释为 operator+( v1, v2)

例:
class V
{
public:
friend V operator+(const V& a, const V& b);// 重载运算符函数,operator+声明为友员函数
...
private:
...
};
[/Quote]

正解,

C++ primer 上 有详解, 举得例子记得是 string 类
Jarrys 2009-04-10
  • 打赏
  • 举报
回复
楼主可以分别定义‘+’的重载运算符的成员函数友元函数并在其中添加一些输出语句来识别到底解释成哪种形式。我也试试去
sky0801636 2009-04-10
  • 打赏
  • 举报
回复
当你用友员函数进行运算符重载时,编译器将会把 v1 + v2 解释为 operator+( v1, v2)

例:
class V
{
public:
friend V operator+(const V& a, const V& b);// 重载运算符函数,operator+声明为友员函数
...
private:
...
};


mediam2000 2009-04-10
  • 打赏
  • 举报
回复
v3 = v1 + v2 // 在这里如果编译器将v1 + v2解释为operator+(v1,v2),岂不是大大不妙;
// 编译器依据什么将v1 + v2 解释为v1.operator(v2);而不是operator+(v1,v2)????;

成员函数默认的就可以是this指针作为第一个参数,(如果this在函数里被使用的话)。
============================================================================================================
v3 = v1 + v2 // 我想知道编译器在什么情况或条件下将v1 + v2 解释为 operator+( V *this, v2)
// 在什么情况或条件下将 v1 + v2 解释为 operator+( v1, v2);
  • 打赏
  • 举报
回复
v3 = v1 + v2 // 在这里如果编译器将v1 + v2解释为operator+(v1,v2),岂不是大大不妙;
// 编译器依据什么将v1 + v2 解释为v1.operator(v2);而不是operator+(v1,v2)????;

成员函数默认的就可以是this指针作为第一个参数,(如果this在函数里被使用的话)。
xqls_xqls 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mediam2000 的回复:]
v3 = v1 + v2 // 编译器可以将此解释为 operator+( V *this, v2) 或 operator+( v1, v2)
// 是不是编译器同时按这两个函数签名去找对应的函数定义???还是有其他依据
// 比如根据operator+(...)是友元或成员函数,来将v1 + v2 解释为
// operator+( V *this, v2) 或 operator+( v1, v2)
[/Quote]

UP
mediam2000 2009-04-10
  • 打赏
  • 举报
回复
v3 = v1 + v2 // 编译器可以将此解释为 operator+( V *this, v2) 或 operator+( v1, v2)
// 是不是编译器同时按这两个函数签名去找对应的函数定义???还是有其他依据
// 比如根据operator+(...)是友元或成员函数,来将v1 + v2 解释为
// operator+( V *this, v2) 或 operator+( v1, v2)
mengde007 2009-04-10
  • 打赏
  • 举报
回复
编译器根据你是否重载了+这个操作符,因为这个符号常用于具体的值,但是这里明显是两个对象,那就查看是否重载了+。比较不成功的话,那就报错。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧