C++新手问题:运算符重载

文件a.h:#ifndefA_H_#defineA_H_classCONV{private:inta;doubleb;public:CONVoperator+(const... 文件 a.h:

#ifndef A_H_
#define A_H_
class CONV
{
private:
int a;
double b;
public:
CONV operator +(const CONV &_A) const;
};
#endif
文件a.cpp:
#include"a.h"

CONV CONV::operator+ (const CONV &_A) const {return CONV(a+_A.a,b+_A.b);}
(省略默认构造函数和析构函数,以及main.cpp(带main函数的那个))
---------------------------------------

问题:为什么运算符重载不能写成如下形式:
CONV:: CONV operator+ (const CONV &_A) const {return CONV(a+_A.a,b+_A.b)};
或者在头文件中直接写CONV operator +(const CONV &_A) const{return CONV(a+_A.a,b+_A.b);};
展开
 我来答
john_lee1969
推荐于2016-11-30 · TA获得超过1700个赞
知道小有建树答主
回答量:419
采纳率:100%
帮助的人:530万
展开全部
你这样也不好,二元操作符“+”,最好写成友元函数,并且再增加【以“非CONV类型”数据为参数的“构造函数”】。
比如你的方法,对于这种形式的“+”就无能为力了:
CONV a, b;
...
a = 5 + b;
如果你说你永远不会用到这种加“非CONV类型”的数据的形式,那我无话可说;如果可能用到(比如“复数”的运算),那么把“非CONV类型”的数据写到 + 的左边,根据“交换律”,是合法的,但你的operator + 不支持,即使你增加了【以“非CONV类型”数据为参数的“构造函数”】也不行,因为你的operator + 是成员函数,而“5 +”里的+,编译器显然不会认为是你的operator +。
如果把 operator + 拿出来作为全局函数,并且让它成为 CONV 的友元,再配合【以“非CONV类型”数据为参数的“构造函数”】,就可以完美实现这种表达式了。
class CONV
{
friend const CONV& operator + (const CONV& x, const CONV& y) // 友元operator +
{
CONV c;
c.a = x.a + y.a;
c.b = x.b + y.b;
return c;
}
private:
int a;
double b;
public:
CONV (int i) a(i), b(0) {} // 以“非CONV类型”数据(整型)为参数的“构造函数”
CONV () {}
CONV (int i, double d) a(i), b(d) {}
};

const CONV& foo (const CONV& t)
{
CONV s;
s = 3 + t;
return s;
}
在 foo 函数中,编译器会匹配 + 的两边参数类型,经过一系列推演,最终使用 CONV (3) 把 3 先转化为一个临时 CONV 对象,然后使用这个临时对象和 t 对象作为参数,调用 operator (const CONV&, const CONV&)。
罪恶欲都
2014-07-16 · 超过47用户采纳过TA的回答
知道答主
回答量:177
采纳率:0%
帮助的人:114万
展开全部
类中的函数实现就是这么定义的,返回值 类名::函数(){}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式