1. 程式人生 > >按值傳遞/按引用傳遞 返回物件/返回引用

按值傳遞/按引用傳遞 返回物件/返回引用

 1、按值傳遞物件與傳遞引用:

       通常,編寫使用物件作為引數的函式時,應按引用而不是按值來傳遞物件。這樣做的原因之一是提高效率。按值傳遞物件涉及到生成臨時拷貝,即呼叫複製建構函式,然後呼叫解構函式。呼叫這些函式需用時間,複製大型物件比傳遞引用花費的時間要多的多。如果函式不修改物件,應將引數宣告為const引用。

        按引用傳遞物件的另一個原因是,在繼承使用虛擬函式時,被定義為接受基類引用引數的函式可以接受派生類。

虛方法:P471

       設計基類時,必須確定是否將類方法宣告為虛擬的。如果希望派生類能夠重新定義方法,則應在基類中將方法定義為虛擬的。

//按引用傳遞
void show(const Brass & rba)
{
    rba.ViewAcct();
    cout<<endl;
}
//按值傳遞
void inadequate(Brass ba)
{
    ba.ViewAcct();
    cout<<endl;
}
假設將派生類引數傳遞給上述兩個函式:
BrassPlus buzz("Buzz Parsec",00001111,4300);
show(buzz);
inadequate(buzz);

        show()函式呼叫使rba引數成為BrassPlus物件buzz的引用,因此,rba.ViewAcct()被解釋為BrassPlus版本。但在inadequate()函式中,ba是Brass(const Brass &)建構函式建立的一個Brass物件,因此,ba.ViewAcct()被解釋為Brass版本,所以只有buzz的Brass部分被顯示。

         如果希望派生類可以重新定義基類的方法,則可以使用關鍵字virtual將它宣告為虛擬的,這樣對於通過指標或引用訪問的物件,能夠根據物件型別來處理,而不是根據引用或指標的型別來處理。具體地說,基類的解構函式通常應當是虛擬的。

  2、返回物件和返回引用

        返回物件涉及到生成返回物件的臨時拷貝,這是呼叫函式的程式可以使用的拷貝。因此,返回物件的時間成本包括呼叫複製建構函式來生成拷貝所需的時間和呼叫解構函式刪除拷貝所需的時間。返回引用可以節省時間和記憶體。

        函式不能返回在函式中建立的臨時物件的引用,因為當函式結束時,臨時物件將消失,在這種情況下應返回物件,以生成一個呼叫程式可以使用的拷貝。

    通常的規則是,如果函式返回在函式中建立的臨時物件,則不要使用引用。例如,下面的方法使用建構函式建立一個新物件,然後返回該物件的拷貝:
Vector Vector::operator+(const Vector & b)const
{
    return Vector(x+b.x,y+b.y);
}

    如果返回的是通過引用或指標來傳遞給它的物件,則應按照引用傳遞。例如,下面的程式碼按引用返回呼叫函式的物件或作為引數傳遞給函式的物件:
const Stock & Stock::topval(const Stock & s)const
{
    if(s.total_val>total_val)
        return s;
    else
        return *this;
}