您的位置:程序门 -> c/c++ -> c++ 语言



c++中的一个运算符重载的问题,请教


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


c++中的一个运算符重载的问题,请教
发表于:2008-01-22 14:39:04 楼主
源程序如下:
#include   <iostream.h>
class   complex
{
friend complex   operator+(const   complex   &x,const   complex   &y)         //重载为类的友元函数
{
  cout < <"begin   from   class   complex" < <endl;
  return   complex(x.real+y.real,x.image+y.image);
}
public:
int   real;
int   image;
public:
complex()
{
}
complex(int   r,int   i):real(r),image(i)         //construct   function
{}

        void   print(void)const
{
cout < <"real=" < <real < <"   image=" < <image < <endl;
}
        ~complex()
{}
};

class   a
{
friend complex   operator+(complex   &x,complex   &y)                 //重载为类的友元函数  
{
cout < <"begin   from   class   a" < <endl;
return   complex(x.real+y.real,x.image+y.image);

}
};          

void   main()
{
complex   c1(2,3),c2(4,5);
complex   z;
z=c1+c2;
z.print();
}
运行结果:    
begin   from   class   a
real=6   image=8
press   any   key   to   continue  
               
问题:1、两个运算符重载函数,其中class   a类中的重载函数的形参不是const类型,而complex类中的形参是const类型。在执行命令z=c1+c2后,为什么是调用的恰好是class   a中的重载函数而非complex中的呢?
              2、如果把class   a中重载函数的形参也改为和const类型,即和complex完全一样,执行命令z=c1+c2后却调用的是complex的重载函数,这又是为什么呢?
      谢谢!


发表于:2008-01-22 14:45:331楼 得分:0
换个wxdevpp试一下吧。
记住c++的名言:不要轻易假设你或你的编译器错了。很可能2者都是对的。
发表于:2008-01-22 14:48:392楼 得分:0
首先明确一点,friend函数不属于类。
于是lz的问题中,存在的是两个形式的complex   +   重载:
complex   operator+(const   complex   &x,   const   complex   &y);
complex   operator+(complex   &x,   complex   &y);

该怎么调用就只要根据参数类型了~
发表于:2008-01-22 14:58:213楼 得分:0
taodm的回答总是那么经典,^_^

to   lz,我2楼的回复不严密~   按照我这种解释,你的第2种改法将导致编译出错,呵呵;但你得到结果了
发表于:2008-01-22 14:58:544楼 得分:0
friend函数的确不属于类,但如问题所示,我想知道的是,两个重载函数基本上完全一样,只是形参有无const类型的不同而已,而运行结果却不一样。你说的“该怎么调用就只要根据参数类型了~”,那什么样的参数类型才进行相应的调用呢?也就是说为什么有那样的结果。
发表于:2008-01-22 15:09:385楼 得分:0
同意楼上说的。
发表于:2008-01-22 15:32:206楼 得分:0
参数有无const,是可以作为重载依据的。

const   complex   c1(2,3),   c2(4,5);
变量c1,c2是const类型,调用z=c1+c2将选择const或者const引用参数的重载形式
complex   c1(2,3),   c2(4,5);
非const类型,调用z=c1+c2可以选择const参数和非const参数形式,都存在的时候,将选择非const的重载形式;如果只有const形式的,也能调用,因为隐式转换到常量引用。

lz的问题2,应该是taodm大哥说的与编译器有关了,我理解不深,不敢多说。那种改法,dev   c++认为函数重复定义了,报错。
发表于:2008-01-22 17:16:057楼 得分:0
嗯,现在这个回复我看懂了。
谢谢ltc_mouse!


快速检索

最新资讯
热门点击