2011-02-09 41 views
6

'&'在C++中的含義是什麼?作爲函數在C++中'&'是什麼意思?

void Read_wav::read_wav(const string &filename) 
{ 

} 

什麼是內它在C相同呢?

感謝


編輯1

如果我要改變上述C++函數到C函數,我會怎麼做呢?

+1

http://en.wikipedia.org/wiki/Reference_(C%2B%2B) – 2011-02-09 14:32:34

+1

as @Tim Medora said http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29(但我已更正鏈接;)) – 2011-02-09 14:35:02

+0

@HernánEche - 粘貼失敗我的部分...謝謝! – 2011-02-09 14:36:29

回答

12

在這方面參考,&使得變量的引用。

通常,當你傳遞一個變量的函數,變量被複制,並在功能上工作的副本。函數返回時,原始變量不變。當您傳遞參考時,即使函數返回,也不會進行復制,並且該函數所做的更改也會顯示出來。

C沒有引用,但C++引用是功能上等同於C的指針真的是唯一的區別是,指針必須提領時,你使用它們:

*filename = "file.wav"; 

但引用可以用,好像他們是原始變量:

filename = "file.wav"; 

從表面上看,引用都應該永遠是零,雖然這不是不可能要做到這一點。

等價的C函數是:

 void read_wav(const char* filename) 
    { 

    } 

這是因爲C沒有string。 C語言的通常做法是在需要字符串時發送指向字符數組的指針。由於在C++中,如果你輸入一個字符串常量

read_wav("file.wav"); 

類型是const char*

11

這意味着該變量是一個reference。在C中沒有直接的等價物。你可以把它看作是一個在使用時自動解引用的指針,也許永遠不會是NULL。

代表在C柱的典型方法是由char指針,因此函數可能會是這樣的:

void read_wav(struct Read_wav* instance, const char *filename) 
{ 
} 

注:這裏的第一個參數來模擬你會隱含this對象引用在C++中,因爲這看起來像一個成員方法。

+0

你確定嗎?!? – karlphillip 2011-02-09 14:34:11

+0

請參閱我的第一個編輯。謝謝:) – 2011-02-09 14:34:38

-3

&文件名意味着這是爲filename

0

&意味着變量通過引用傳遞。所以,在你的函數中,你將不會有本地變量副本,而是原始變量本身。函數中所有對變量的更改都會影響原始傳遞的變量。

0

你可能想看看Binky Pointer fun,那就是說明了什麼指針和引用的視頻。

1

在C語言中,你會寫這種方式:

void read_wav(struct Read_wav* , const char * pSzFileName) 
{ 

} 

的std :: string是處理爲const char型數組的C++的方式。

&是一個C++參考。它的行爲就好像你在背後操縱的指針(它主要是一個語法糖,以爲它會提示指針後面不應該是空的合同)。

0

在這種情況下,string &filename意味着函數將接收而不是接收它作爲複製的基準(存儲器地址)作爲參數,。

此方法的優點是您的函數不會在堆棧上分配更多空間來保存文件名中包含的數據。

0

這是一個參考,因爲其他人說。 在C中,你可能寫功能類似

void read_wav(struct Read_wav* rw, const char* filename) 
{ 

} 
1

的符號用於在C++中兩種不同的含義:獲得的東西的地址(例如一個變量或函數的),並指定可變或函數參數作爲對其他地方定義的實體的引用。在你的例子中,後者的含義正在使用中。 C並沒有嚴格地講任何類似於引用的東西,但是指針(或者指向指針的指針)對於類似事物的年齡已經是用戶了。

參見例如http://www.cprogramming.com/tutorial/references.htmlWhat are the differences between a pointer variable and a reference variable in C++?http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29瞭解有關C++中引用的更多信息。

1

在這種特殊情況下,std :: string有一個c_str方法,它返回一個const char *。你可以做一個平行的C版,然後讓你的C++做這樣的事情:

void Read_wav::read_wav(const string &filename) 
{ 
    do_read_wav(internal_read_wav, filename.c_str()); 
} 

其中do_read_wav是你的C程序和internal_read_wav是一個指向C風格的結構。

void do_read_wav(struct Read_wav rw, const char * filename) 

現在,如果你是在類的存儲信息,你需要做一個C結構[所有字段必須是POD等]

1

引用是別名,他們都非常相似,指針。

std::string是一個char的數組,並帶有明確的length(也就是說,可以在其中嵌入空字符)。

對於Better String Library,有一個C庫來模擬std::string(即提供封裝接口),稱爲bstring。它可以讓你免除處理兩個不同變量(數組和長度)的麻煩。

您不能使用C中的類,但可以使用轉發的結構體來模擬它們(以實施封裝),並且類方法只是使用顯式參數變成常規函數。

總之,這導致了以下轉變:

void Read_wav::read_wav(const string &filename); 

void read_wav(struct Read_wav* this, struct bstring const* filename); 

其中(除struct噪聲)非常相似,你有什麼:)之前