寧以const引用傳遞代替按值傳遞(內建型別除外)
阿新 • • 發佈:2019-02-09
預設的情況下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的拷貝建構函式。
當銷燬時,每個動作都會有相應的解構函式。
因此,總體成本為 六次建構函式+六次解構函式。
這樣,按引用傳遞的效率優勢就顯現了出來。
但是如果你有個物件屬於內建型別,按值傳遞往往比按引用傳遞效率高!!!