我有几个与C ++中引用的使用有关的问题。
在下面显示的代码中,它是如何工作的,而不是在第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";
}
如何将参考q重新初始化为其他内容?
不是字符串文字p = "Hello"
,是常量还是只读空格?如果我们这样做,
q = "World";
不应该更改p
中应该是常量的字符串吗?
我已经读过有关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?
我想抓住这个参考,并且可能错过了一些关键的事情,所以这些问题。
所以任何明确这一点的指针都会很有用。
答案 0 :(得分:56)
q
,它会更改p
。p
是一个指向文字的指针。
指针可以改变,指向的指针不能改变。
q = "world";
使指针p
指向别的东西。您似乎认为此代码
int i;
int &j = i;
int k;
j = k;
正在重新分配参考,但事实并非如此。
它将k
的值分配给i
,j
仍然引用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()