Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 声明对对象和赋值运算符的引用_C++_Reference_Assignment Operator - Fatal编程技术网

C++ 声明对对象和赋值运算符的引用

C++ 声明对对象和赋值运算符的引用,c++,reference,assignment-operator,C++,Reference,Assignment Operator,我觉得这个问题已经足够基本了,可以放在某个地方,但我似乎找不到答案 假设我有以下代码: //class member function std::map< std::string, std::string > myMap; const std::map< std::string, std::string >& bar() { return myMap; } void myFunc( std::map< std::string, std::strin

我觉得这个问题已经足够基本了,可以放在某个地方,但我似乎找不到答案

假设我有以下代码:

//class member function
std::map< std::string, std::string > myMap;

const std::map< std::string, std::string >& bar()
{
   return myMap;
}

void myFunc( std::map< std::string, std::string >& foo1 )
{
   foo1 = bar();
   std::map< std::string, std::string >& foo2 = bar();
}
//类成员函数
std::mapmyMap;
常量std::map&bar()
{
返回myMap;
}
void myFunc(std::map&foo1)
{
foo1=bar();
std::map&foo2=bar();
}
我的理解是,如果我开始使用foo2,因为foo2是对bar()返回的相同实例的引用,所以我对foo2所做的任何操作都将反映在myMap中。但是foo1呢?foo1是否获取myMap的副本,或者它是否也指向与bar()返回的实例相同的实例?C++标准库表示,STD::MAP的赋值操作符将复制元素,但这是否意味着赋值操作符在FoO2?< /P>的声明中没有真正调用? 谢谢

线路

foo1 = bar();

创建一个拷贝(因为这是 map /<代码>赋值运算符)。这意味着一旦它们被初始化,您就不能重新分配它们。相反,任何赋值实际上都涉及引用的对象。所以在你的代码中

foo1 = bar();
std::map< std::string, std::string >& foo2 = bar();
foo1=bar();
std::map&foo2=bar();
第一行对作为参数传递给
myFunc
的对象调用
std::map::operator=
。在那之后,
foo1
stills指的是同一个对象——但是它的值(例如,它包含的元素)很可能已经改变了

请注意,如果您对第二行的内容有任何疑问,则第二行不是作业。相反,它是一个初始化。由于条形图的返回类型实际上是
std::map const&
,因此无法绑定到
std::map&
,因此这是一个编译错误


为了扩展事物的“哲学”面,C++引用被设计成尽可能透明,并且不作为对象存在。它使用的是术语的C++标准含义(它与OOP无关):它意味着,例如引用类型没有大小。相反,

sizeof(T&)==sizeof(T)
。类似地,引用没有地址,也不可能形成指向引用的指针或引用:给定
int&ref=i
,然后
&ref==&i


因此,引用是有意使用的,就好像引用的对象本身正在使用一样。在引用的生命周期中,唯一一件特定于引用的事情是它的初始化:它可以绑定到什么以及它在生命周期中的意义。

返回对全局变量的引用似乎很奇怪,不是吗?@0A0D:不是真的,如果“全局”变量实际上没有外部链接,它可以用于封装。或者您可以返回对全局变量
a
或全局变量
b
的引用+1谢谢,我自己也学到了一些新东西。我刚刚做了一个测试,我确实100%错了,你是对的(好的,太棒了!谢谢,我真正需要知道的是赋值运算符是在foo1中调用的,而不是在foo2中调用的。很好的解释,谢谢@如果可能的话,你能解释一下为什么通常不使用参考变量吗?我对它们有了更好的理解(感谢你的回答),但似乎程序员通常更喜欢指针而不是指针。是裁员吗?有限的范围?@MannyD我的经验和你的不一样。我经常使用引用并看到引用被用作局部变量,对于这种用法,它们通常比指针更可取。@Luc我想我应该澄清一下。我一直在函数参数列表中看到/使用它们,但我不明白为什么要在代码体中声明它们,甚至作为类成员。