gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:07:01 25 4
gpt4 key购买 nike

我觉得这个问题很基础,可以在某个地方提出,但我似乎无法找到答案。

假设我有这段代码:

//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 所做的任何操作都将反射(reflect)在 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& , 它不能绑定(bind)到 std::map<std::string, std::string>&所以这是一个编译错误。


为了扩展事物的“哲学”方面,C++ 引用被设计为尽可能透明并且并不真正作为对象存在。这是使用术语的 C++ 标准含义(它与 OOP 无关):这意味着例如引用类型没有有大小。相反,sizeof(T&) == sizeof(T) .类似地,引用没有地址并且不可能形成指针或对引用的引用:给定 int& ref = i; , 然后 &ref == &i .

因此,引用是有目的地使用的,就好像被引用的对象本身被使用一样。在引用的生命周期中发生的唯一特定于引用的事情是它的初始化:它可以绑定(bind)到什么以及它在生命周期方面意味着什么。

关于c++ - 声明对对象和赋值运算符的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6886750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com