參考 effective c++
缺省情況下 c++ 函數傳遞值是傳值的形式 比如
void text(string text)
{
/// do something ///
}
string t = "abcd";
text(t);
這樣其實會傳的實際參數的副本 , 編譯器爲我們 把t 複製了 一份 裏面 do something 不會對 外面的
t 有任何的影響 。
這樣做有什麼壞處呢?
先來看一個 demo
#include <iostream>
using namespace std;
class person
{
public:
person() {};
virtual ~person() {};
private:
string name;
string sex;
};
class son : public person
{
public:
son() {};
~son() {};
private:
string age;
string fatherName;
};
void test(son s)
{
//// do something ///
}
int main()
{
son s;
test(s);
system("pause");
}
定義了一個父類 一個之類 和 一個函數
至於爲啥父類的虛構要用虛函數 可以去看 這篇文章
想一下 當 test 函數調用時 內部會怎麼樣 發生什麼事?
- 創建一個 son類 臨時的複製對象
- 那麼這個對象會先調用父類的構造
- 然後會調用父類的 兩個 string 的構造
- 然後調用自己的構造 調用自己的兩個 string 的構造
- 現在就是6次構造
- 等 過一會出了作用域 還會調用 相應的6次析構
開銷還是很大的 所以用 傳const的 引用的方式是最好的
void test(const son& s)
{
//// do something ///
}
這樣的傳遞方式 效率會提升多了 沒有任何的構造被調用 沒有任何的析構調用
const 關鍵字 也很關鍵 如果不加 const dosomething代碼改了 外面的t 的內容 就不是我們想要的效果了
當參數爲 內置類型時效率如何?
c++ 編譯器的底層實現 其實引用 reference 就是指針實現的
因此 傳遞的 reference 就是指針
所以 如果參數 是內置類型 比如(double int )等等
傳值的方式 要比傳遞引用 要快
STL的大部分容器和迭代器使用 傳值更爲合適