2010-06-03 136 views
1

一個簡單的問題:傳遞變量函數

當我一個變量傳遞給一個函數,並計劃使該變量的副本功能使用?

如果它確實存在,我知道該函數只會讀取變量並且永遠不會寫入該變量,是否可以將該變量傳遞給該函數而不創建該變量的副本,或者我應該只保留該變量編譯器優化爲我自動做到這一點?

+3

您使用的是什麼C++文本書,並沒有詳細說明這一點? – 2010-06-03 20:43:19

+0

什麼課本? – Faken 2010-06-03 20:44:24

+2

這就是問題所在。 :)你應該從一本很好的教科書中學習,我們在這裏有一個大列表:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – GManNickG 2010-06-03 20:48:47

回答

6

是的,複製通過值傳遞的參數。但是,您也可以通過引用傳遞變量。引用是一個別名,所以這使得該參數成爲變量的別名,而不是副本。例如:

void foo(int x) {} 
void bar(int& x) {} 

int i; 

foo(i); // copies i, foo works with a copy 
bar(i); // aliases i, bar works directly on i 

如果你將其標記爲const,你有一個只讀別名:

void baz(const int&); 

baz(i); // aliases i, baz reads-only i 

一般情況下,總是由常量引用傳遞。當你需要修改別名時,刪除const。作爲一個好的經驗法則,基本類型(int,char *等)和類型與sizeof(T) < sizeof(void*)應該通過值來傳遞,而不是的const引用,因爲它們的大小足夠小,複製將比鋸齒更快。

2

是的。
如果你知道你可以傳遞參數爲const &像這樣:

int function(const string& str) {} 

對於小的類型,如int或float和char這不值得冒這個險,因爲經過參考相同的傳遞INT。只有當你傳遞諸如vectorstring之類的大事情時,這樣做纔有意義。

編譯器很可能不會爲你做這個優化,因爲在大多數情況下它不知道它是允許的。

0

如果使用引用,則只傳遞別名。如果你不這樣做,將會有一個副本。這取決於你需要對變量做什麼。如果你需要使用這些參數,但不能改變它們,那麼const引用是最好的解決方案(效率和語義方面),除非是非常小的類型。

1

如果該功能通過複製接收的變量,是程序沒有進行復制:

void function(int pass_by_value); 

如果函數引用接收變量,沒有,程序不進行復印,但使用原始變量:
void function2(int & pass_by_reference);

如果該函數不修改變量,函數應該接收恆定基準:
void function3(const int & pass_by_constant_reference);

通常,類和結構應該通過常量引用傳遞。 POD(普通舊數據)類型可以按值傳遞。

在C++中,您需要告訴編譯器和用戶您的函數,您希望如何傳遞變量以及它們是否會被修改。

0

在const引用(const &)中可以使用實際變量的值,但不能生成副本,但不能修改原始變量的值,爲此只需使用&或(*)的函數定義,函數調用如下:

myFunction的(X)或myFunction的(& X)

希望它能幫助:)

Başak比爾基