![](/img/trans.png)
[英]Why neither constructor nor assignment operator executed when declaring object?
[英]Declaring a reference to object and the 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::string >& foo1 )
{
foo1 = bar();
std::map< std::string, std::string >& foo2 = bar();
}
我的理解是,如果我开始使用foo2,因为foo2是对bar()返回的同一实例的引用,我用foo2做的任何事都将反映在myMap中。 但是foo1怎么样? foo1是否获得了myMap的副本,还是指向与bar()返回的实例相同的实例? c ++标准库说std :: map的赋值运算符会复制元素,但这是否意味着在foo2的声明中没有真正调用赋值运算符?
谢谢!
引用在C ++中不可重用。 这意味着一旦初始化,您就无法重新分配它们。 相反,任何赋值实际上都涉及被引用的对象。 所以在你的代码中,
foo1 = bar();
std::map< std::string, std::string >& foo2 = bar();
第一行调用std::map::operator=
作为参数传递给myFunc
。 在那之后, foo1
stills引用同一个对象 - 但它的值(例如它所拥有的元素)可能已经被改变了。
请注意,如果怀疑它在您的脑海中,则第二行不是赋值。 相反,它是一个初始化。 由于bar的返回类型实际上是std::map<std::string, std::string> const&
,它不能绑定到std::map<std::string, std::string>&
所以它是一个编译错误。
为了扩展事物的“哲学”方面,C ++引用被设计为尽可能透明,并不像对象那样存在。 这是使用术语的C ++标准含义(它与OOP无关):它表示例如引用类型没有大小。 相反, sizeof(T&) == sizeof(T)
。 类似地,引用没有地址,也不可能形成指针或对引用的引用:给定int& ref = i;
,然后&ref == &i
。
因此,有意地使用引用,就像所引用的对象本身被使用一样。 在引用的生命周期中发生的唯一特定于引用的是它的初始化:它可以绑定到什么以及它在生命周期中意味着什么。
这条线
foo1 = bar();
创建一个副本(因为这是map
的赋值运算符所做的)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.