對於類能傳引用的就儘可能傳引用
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
{
};
返回值傳指針的時候,傳基類的指針;而傳引用的時候,傳子類的對象。由於基類的指針能夠指向子類的對象,但子類的指針不能指向父類的對象;子類的對象能夠截斷爲父類的對象,而父類對象不能做爲子類對象用。