c++ 用傳引用(pass - by - const reference )的方式 替代傳值(pass - by - value)

參考 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 函數調用時 內部會怎麼樣 發生什麼事?

  1. 創建一個 son類 臨時的複製對象
  2. 那麼這個對象會先調用父類的構造
  3. 然後會調用父類的 兩個 string 的構造
  4. 然後調用自己的構造 調用自己的兩個 string 的構造
  5. 現在就是6次構造
  6. 等 過一會出了作用域 還會調用 相應的6次析構

開銷還是很大的 所以用 傳const的 引用的方式是最好的

void test(const son& s)
{
	//// do something ///
}

這樣的傳遞方式 效率會提升多了 沒有任何的構造被調用 沒有任何的析構調用

const 關鍵字 也很關鍵 如果不加 const dosomething代碼改了 外面的t 的內容 就不是我們想要的效果了

當參數爲 內置類型時效率如何?

c++ 編譯器的底層實現 其實引用 reference 就是指針實現的
因此 傳遞的 reference 就是指針
所以 如果參數 是內置類型 比如(double int )等等
傳值的方式 要比傳遞引用 要快
STL的大部分容器和迭代器使用 傳值更爲合適

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章