为什么我可以为引用分配新值,如何引用引用呢?

时间:2011-08-24 19:48:39

标签: c++ reference

我有几个与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?
    

    我想抓住这个参考,并且可能错过了一些关键的事情,所以这些问题。

  3. 所以任何明确这一点的指针都会很有用。

5 个答案:

答案 0 :(得分:56)

    • a)它不能,您引用的行不会更改引用q,它会更改p
    • b)没有文字是常量,但p是一个指向文字的指针。 指针可以改变,指向的指针不能改变。 q = "world";使指针p指向别的东西。
  1. 您似乎认为此代码

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

    正在重新分配参考,但事实并非如此。 它将k的值分配给ij仍然引用i。 我猜这是你的主要误解。

答案 1 :(得分:23)

关于我认为你缺少的引用的一个重要细节是,一旦引用被绑定到一个对象,你永远不能重新分配它。从那时起,无论何时使用引用,它都与使用它所引用的对象无法区分。例如,在您的第一段代码中,当您编写

q = "World";

由于q是绑定到p的引用,因此这等同于编写

p = "World";

只会更改p指向的位置,而不是指向的字符串的内容。 (这也解释了为什么它不会崩溃!)

至于第二个问题,一旦绑定到对象,就无法重新分配引用。如果你需要一个可以改变它的引用的引用,你应该使用一个指针。

希望这有帮助!

答案 2 :(得分:3)

a)如何将参考q重新初始化为其他内容?

不可能!

引用变量仍然是创建时初始化的别名。


b)不是字符串文字,p =“Hello”,是一个常量/只读空间。如果我们这样做,
不,不。

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

不重新分配参考。它会更改别名变量的值。

在这种情况下,它会将i的值更改为k

答案 3 :(得分: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.

总而言之,p&amp; q是实体/对象(内存)的名称。

所以,如果你指定q的东西,它也反映在p中。因为它与p的赋值相同。 所以q =“世界”,意味着现在也指向“世界”。即p&amp;存储位置。 q都指 - 持有“世界”第一个字符的地址。

如果您将参考概念理解为别名,我希望第二个问题无需回答。

答案 4 :(得分:1)

请注意,自C ++ 20起,可以使用{{1} 更改类中引用变量所保存的引用 },例如以下摘自this SO post的示例:

df2 %>%
  arrange(ID) %>% 
  group_by(ID) %>%
  filter(n()>1) %>% 
  ungroup()

代码:http://coliru.stacked-crooked.com/a/4674071ea82ba31b