簡體   English   中英

'&' 在 C++ 中是什么意思?

[英]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.htmlC++ 中的指針變量和引用變量有什么區別? 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是一個具有顯式lengthchar數組(即,其中可以嵌入空字符)。

有一個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM