对于类能传引用的就尽量传引用
1),参数用引用
void Method(const MyClass& aMyClass)
2),返回值用引用
const MyClass& Method()
{
 static MyClass s_MyClass;
 ...
 return s_MyClass;
}
这样,调用者就可以这样调用
const MyClass& newMyClass = Method();
比这样调用省去了MyClass的constructor的开销:
MyClass newMyClass = Method();
如果我们这样尝试:
MyClass Method()
{
 static MyClass s_MyClass;
 ...
 return s_MyClass;
}
const MyClass& newMyClass = Method();
这样是达不到效果的,是因为在Method()调用内部,已经调用了MyClass的Copy Constructor把返回值从s_MyClass构造出来。
3),大体而言,返回值传引用和传指针Performance效果是差不多的。那什么时候返回值传引用,什么时候传指针呢?这的确是个问题。指针可以为NULL,但引用必须指向一个被引用的东西。如果返回值是指针,为了安全起见,那么一般程序会这样调用返回指针的方法:
const MyClass* Method()
{
 if()
  return p; // p is a pointer which is not NULL
 else
  return NULL;
}
const MyClass* pMyClass = Method();
if(!pMyClass)
 ... // Do something, when pMyClass is NULL;
else
 ... // Do something, when pMyClass is not NULL;
 // Like pMyClass->MyClassMethod();
 
但如果是传引用,必须确保Method()返回值引用到真实的一个变量,并且这个变量不能是函数内部非static变量,因为函数内部非static变量会因为函数调用结束而销毁。
调用者就不需要做类似指针是空值的检查。
现在看来,好象传引用更方便些。
但是,从另外一个方面讲,返回值传指针,调用者一般用起来不会引起performance问题,意思是:
如果返回值为指针,那么调用者一般会这样调用:
const MyClass* pMyClass = Method();
// Then use pMyClass do something
如果返回值为引用,那么调用者这样调用最好:
const MyClass& myClass = Method();
但是,一般情况下,大家都习惯于这样用:
const MyClass myClass = Method();
这样一用,Peformance就会差一些。
所以从这个角度上讲,好象返回值传指针更好。
但是话又说回来了,即使返回值传指针,调用者也可以这样用:
const MyClass myclass = *(Method());
这样的话,Performance会一样差,因为同样一个新的MyClass对象会构造出来。
所以总结一下,返回值传引用和传指针,不能一概而论,还是要具体情况具体分析。
4).如果存在类继承关系,情况会略显复杂。
比如:
class BaseClass
{
};
class DerivedClass: public BaseClass
{
};
返回值传指针的时候,传基类的指针;而传引用的时候,传子类的对象。因为基类的指针可以指向子类的对象,但子类的指针不能指向父类的对象;子类的对象可以截断为父类的对象,而父类对象不能作为子类对象用。