变量和引用赋值之间的差异



这让我很困扰,我最近才重新接触c++,我很清楚参考文献。为什么下面的b和c似乎没有区别?换句话说,直觉上,我认为c不是一个ref变量会得到一个拷贝。它让我在考虑返回对局部变量的引用的问题时思考。

int a = 10;
int& func()
{
return a;
}
int &b = func();  
int c = func(); // shouldn't this make a copy into c but c acts like a reference.

我认为c不是一个ref变量会复制。

c确实是a的副本。注意int c = func();copyinitializationint &b = func();引用初始化.

这意味着如果您对c进行了更改,它们将不会反映在a上。演示

int a = 10;
int& func()
{
return a;
}
int &b = func();  //reference initialization
int c = func();   //copy initialization
int main()
{
c = 20;
std::cout << a<< " "<< b <<" "<< c <<std::endl; // 10 10 20
return 0;
}

还要注意"初始化"的强调。而不是"分配"。与其他语言(例如python)不同,这些术语在c++中具有不同的含义。

谢谢你的回答,现在明白了。这个问题开始于"为什么我不能返回一个局部变量引用到一个变量,如果它是一个副本?"嗯,我意识到,因为在那一点上已经太迟了,堆栈已经没有了。我在想可以在那堆东西消失之前复印——错了!你可以返回到一个引用,但是当你使用它的时候,段错误。返回到一个变量,并且,因为它试图复制,立即出现分段错误。

int& func()   // compile warning
{
int a = 10;
return a;
}
int &b = func();  // ok, but segfault if try to use b.
int c = func(); // segfault immediately

最新更新