1. 程式人生 > >寧以const引用傳遞代替按值傳遞(內建型別除外)

寧以const引用傳遞代替按值傳遞(內建型別除外)

預設的情況下C++是按值傳遞的,這可能付出昂貴的代價(費時)。
看看下面的程式碼吧:

class Person
{
public:
    Person();
    virtual ~Person();
    ...
private:
    std::string name;
    std::string adddress;   
};
class Student : public Person
{
public:
    Student();
    ~Student();
    ...
private:
    std::string shoolName;
    std::string schoolAddress;
};

然後有下面的程式碼:

bool validateStudent(Student s);
Student plato;
bool platoIsOK = validateStudent(plato);

這會發生什麼?
通過plato將s進行初始化,呼叫拷貝賦值函式;
當validateStudent函式返回時,s會被銷燬,即呼叫解構函式。

這顯示不是整個故事!student物件內有兩個string物件,所以每次構造一個Student物件也就構造了兩個string物件。
Student繼承Person,所以每次構造一個Student物件也必須構造出一個Person物件。
一個Person又有兩個string在其中,因此每一次Person的構造動作又必須承擔兩個string建構函式。
因此,當按值傳遞時,會呼叫一次Student拷貝建構函式、一次Person拷貝建構函式、四次string的拷貝建構函式。
當銷燬時,每個動作都會有相應的解構函式。

因此,總體成本為 六次建構函式+六次解構函式。

這樣,按引用傳遞的效率優勢就顯現了出來。

但是如果你有個物件屬於內建型別,按值傳遞往往比按引用傳遞效率高!!!