class CComplex
{
public:
    CComplex(int nX=0,int nY=0){x=nX;y=nY;};
public:
    int x;
    int y;
public:
    CComplex operator +(CComplex& p){ return CComplex(p.x+x,p.y+y); };}请问为什么CComplex operator +(CComplex& p)中要用引用,而不是CComplex p;
实际上我如果换成CComplex p同样可以的。那么引用和不引用有什么本质上的区别呢?

解决方案 »

  1.   

    主要是效率问题。
    如果不用引用的话,对参数的传递将会引发copy ctor的调用。
    如果用引用, 操作直接在实际参数上进行,不会调用copy ctor
    ================================================================CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!★  浏览帖子速度极快![建议系统使用ie5.5以上]。 ★  多种帖子实现界面。 
    ★  保存帖子到本地[html格式]★  监视您关注帖子的回复更新。
    ★  可以直接发贴、回复帖子★  采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录! 
    ★  支持在线检测程序升级情况,可及时获得程序更新的信息。★★ 签名  ●  
         可以在您的每个帖子的后面自动加上一个自己设计的签名哟。Http://www.ChinaOK.net/csdn/csdn.zip
    Http://www.ChinaOK.net/csdn/csdn.rar
    Http://www.ChinaOK.net/csdn/csdn.exe    [自解压]
      

  2.   

    感觉跟poson一样,应该有两处是需要加 const 比较安全一点.CComplex operator +(CComplex& p)
    改为 CComplex operator +(const CComplex& p) const; 好象好一点.
    第一个const保护+号右边的复数,第二个const保护+号左边的复数.这样原来的两个运算书就比较安全了.
      

  3.   

    同意 AroundClockDancer(夜行人) 所作的解释!在重载运算符时,很重要的一点就是要保证它的执行效率,因为算符函数往往在不经意的时候就会用到。编写效率低下的算符函数是不可原谅的(:-))!所以用引用,不要用by-value(传值),否则会有临时对象的构造和析构成本!另外同样重要的一点:你的传入参数应该用const加以限定,因为你一定不希望传进来的那个用来加在后面的对象值被你不经意的改变掉!同样的原则适用于左操作数!
      

  4.   

    前面已经说的很清楚了,补充一点:
    如果参数是CComplex& p而不是const CComplex& p,在传入临时对象的引用时会出问题。
      

  5.   

    class CMyArray : public CStringArray 
    {
    public:
    CMyArray (){}
    //! CMyArray (CMyArray &Src){}
    };BOOL ProcessDataInArray (CMyArray saBuffer)
    {
    return false;
    }void CSomeFunc() 
    {
      CMyArray            naTemp;
      ProcessDataInArray (naTemp); //Need CMyArray(CMyArray &Src) func. 
    }上面这个函数的声明是对的(通得过编译的),但是对ProcessDataInArray 的调用是错的(通不过编译的),如果你把“//!”的去掉程序是可以通过编译传值调用是有一定条件才可用的
      

  6.   

    我在想一个问题,就是有没有可能不用引用是不行的,有些情况下必须用引用(请不要举两个值互换的问题 swap(int x,int y))。大家能对这些问题发表一下自己的看法吗?谢谢!