[英]What does '&' mean in C++?
'&' 在 C++ 中是什么意思?
在函數內
void Read_wav::read_wav(const string &filename)
{
}
它在 C 中的等價物是什么?
如果我想把上面的 C++ 函數轉換成 C 函數,我該怎么做?
這意味着該變量是一個引用。 C 中沒有直接的等價物。您可以將其視為使用時自動取消引用的指針,並且可能永遠不會為 NULL。
在 C 中表示字符串的典型方法是通過char
指針,因此該函數可能如下所示:
void read_wav(struct Read_wav* instance, const char *filename)
{
}
注意:這里的第一個參數模擬了 C++ 中隱式的this
對象引用,因為它看起來像一個成員方法。
在這種情況下, & 使變量成為引用。
通常,當您將變量傳遞給函數時,會復制該變量,並且該函數會在該副本上工作。 當函數返回時,您的原始變量不變。 傳遞引用時,不會進行任何復制,即使在函數返回后也會顯示該函數所做的更改。
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*
。
在 C 中,你可以這樣寫:
void read_wav(struct Read_wav* , const char * pSzFileName)
{
}
std::string 是處理 const char 數組的 C++ 方式。
& 是 C++ 參考。 它的行為就像你在處理后面的指針一樣(它主要是一個語法糖,認為它提示后面的指針不應該為空)。
&符號在 C++ 中有兩種不同的含義:獲取某物(例如變量或函數)的地址和指定變量或函數參數作為對在其他地方定義的實體的引用。 在您的示例中,使用的是后一種含義。
嚴格來說,C 沒有像引用這樣的東西,但是指針(或指向指針的指針)已經為類似的東西使用了很長時間。
參見例如http://www.cprogramming.com/tutorial/references.html , C++ 中的指針變量和引用變量有什么區別? 或http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29有關 C++ 中引用的更多信息。
在這種特殊情況下, 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 struct [所有字段必須是POD 等]
引用是別名,它們與指針非常相似。
std::string
是一個具有顯式length
的char
數組(即,其中可以嵌入空字符)。
有一個 C 庫來模擬std::string
(即提供封裝的接口),稱為bstring
for Better String Library 。 它使您免於處理兩個不同變量(數組和長度)的乏味。
您不能在C
使用類,但您可以使用轉發結構(以強加封裝)來模擬它們,並且類方法只需成為帶有顯式參數的常規函數即可。
總之,這導致了以下轉換:
void Read_wav::read_wav(const string &filename);
void read_wav(struct Read_wav* this, struct bstring const* filename);
其中(除了struct
噪音)與您之前的非常相似:)
& 表示變量通過引用傳遞。 因此,在您的函數中,您將沒有變量的本地副本,而是原始變量本身。 函數內部對變量的所有更改都會影響原始傳遞的變量。
您可能想查看Binky Pointer fun ,這是一個說明指針和引用是什么的視頻。
在這種情況下, string &filename
意味着該函數將接收一個引用(內存地址)作為參數,而不是將其作為副本接收。
這種方法的優點是您的函數不會在堆棧上分配更多空間來保存filename 中包含的數據。
正如其他人所說,這是一個參考。 在 C 中,你可能會像這樣寫函數
void read_wav(struct Read_wav* rw, const char* filename)
{
}
&filename 表示這是對文件名的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.