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);};
? 展开
#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);};
? 展开
2个回答
展开全部
你这样也不好,二元操作符“+”,最好写成友元函数,并且再增加【以“非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&)。
比如你的方法,对于这种形式的“+”就无能为力了:
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&)。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询