2011-08-24 37 views
20

我有幾個有關在C++中使用引用的問題。爲什麼我可以給引用指定一個新值,以及如何使引用指向其他內容?

  1. 在下面的代碼所示,它是如何工作的,並在線路q = "world";沒有給出一個錯誤?

    #include <iostream> 
    
    using namespace std; 
    
    int main() 
    { 
        char *p = "Hello"; 
        char* &q = p; 
        cout <<p <<' '<<q <<"\n"; 
        q = "World"; //Why is there no error on this line 
        cout <<p <<' '<<q <<"\n"; 
    } 
    
    1. 如何參考q也重新初始化到別的東西?

    2. 是不是字符串常量,p = "Hello",恆定或只讀空間?所以,如果我們這樣做,

      q = "World"; 
      

      不會在p這應該是恆定的字符串是否會改變?

  2. 我已閱讀關於C++引用類型的變量,因爲它們不能被重新初始化或重新分配,因爲它們被存儲「內部」作爲恆定指針。所以編譯器會給出錯誤。

    但實際上如何重新分配參考變量?

    int i; 
    
    int &j = i; 
    
    int k; 
    
    j = k; //This should be fine, but how we reassign to something else to make compiler flag an error? 
    

    我想抓住這個參考,並在那可能錯過了一些關鍵的事情,所以這些問題。

所以任何指針來清除它,將是有益的。

回答

41
    • 一)它不能,你引用不更改參考q行了,它改變p值。
    • b)否字面常量,但p是指向文字的指針。 指針可以更改,指向的內容不能。 q = "world";使指針p指向別的東西。
  1. 您似乎認爲,這個代碼

    int i; 
    int &j = i; 
    int k; 
    j = k; 
    

    被重新分配的參考,但事實並非如此。 它將k的值分配給i,j仍然指的是i。 我猜這是你的主要誤解。

+0

準確地說,我的qns是,是什麼代碼將重新分配一個引用到其他東西(這在技術上是不允許的)我在OP中提到,j = k;很好,因爲我知道它會改變'裁判'的價值。 – goldenmean

+7

沒有將重新分配參考的法定代碼。 – john

19

有關,我認爲你缺少引用一個重要的細節是,一旦引用綁定到一個對象,你永遠無法重新分配它。從這一點開始,任何時候你使用這個引用,它與使用它引用的對象是無法區分的。舉個例子,在你的第一段代碼,當你寫

q = "World"; 

由於q是綁定到p一個參考,這相當於編寫

p = "World"; 

這只是改變了其中p指向,而不是它指向的字符串的內容。 (這也解釋了爲什麼它不會崩潰!)

關於你的第二個問題,引用不能被重新分配一次綁定到一個對象。如果你需要一個可以改變它的參照物的參考,你應該使用一個指針來代替。

希望這會有所幫助!

3

a)如何可以參考q也重新初始化到別的東西?

這不可能!

的參考變量保持其所在創建時間被初始化的別名。


B)沒有字符串文字,p值= 「你好」,恆定/在只讀空間。所以如果我們這樣做,
不,它不。

char* &q = p; 

這裏q是將類型char p的指針的參考。這裏的字符串是不變的,指針不是,它可以指向另一個字符串,並且引用是該指針的別名,而不是字符串文字,因此它是有效的。


c)中第二個問題我已經是我已閱讀,因爲它們不能被重新初始化/重新分配約C++引用類型的變量,因爲它們被存儲「內部」作爲恆定指針。所以編譯器會給出錯誤。

int i; 

int &j = i; 

int k; 

j = k; //This should be fine, but how we reassign to something else to make compiler flag an error 

不重新分配參考。它會更改它的別名變量的值。

在這種情況下,它改變了ik

3

將引用視爲別名,希望引用的世界更容易理解。

int p; // Declares p as an integer; Defines p & allocates space 
int &q = p ; // Declares a Reference. Though they are symbolically 2 variables, 
      // they essentially refer to same name and same memory location. 

因此,p = 5和q = 5將全部相同。

在你的榜樣,

char *p = "Hello"; // Declares your pointer to "Hello". p has its own existence. 
char* &q = p; // This now creates a reference (alias) to p with name q. 

因此,所有的一切,對& q是實體/對象(內存)的名字。

所以,如果你指定q的東西,它也反映在p中。因爲它和p的分配一樣。 所以q =「世界」,也就是說p現在也指向「世界」。即這兩個存儲位置都參考 - 保存「世界」的第一個字符的地址。

如果你理解引用作爲別名的概念,我希望第二個問題不需要回答。

相關問題