如何在C++中实现类似Python的引用行为?

4
在Python中,如果我执行以下操作:
a = []
b = a 
a.append(1)
b[0] == 1 

这个例子运行良好,因为a和b都指向堆上的基础对象。

等效的C++代码是什么?


5
使 b 成为与 a 指向同一对象的引用。 - super
3个回答

5
以下是一个不错的翻译:
等价的C++代码是什么?
std::vector<int> a;
auto& b = a;
a.push_back(1);
b[0] == 1;

拥有引用语义的关键是使用引用变量。


1
你可以使用shared_ptr:所有副本操作单个数据实例。并且您将能够重新分配新实例以进行操作(这比引用更好)。

4
你能解释一下为什么使用引用比指针更好吗?如果可以的话,我建议永远使用引用。因为引用没有shared_ptr的开销(即使很小),而且使用起来更简单。当然,引用也有局限性,有时你必须使用指针。 - AlexGeorg
2
我认为你更接近 OP 的需求。共享指针的行为更接近其他语言中引用的工作方式,而不是 C++ 引用类型。 - QCTDev
@AlexGeorg 我认为这个答案接近于 OP 想要实现的内容。他在 Python 中的经验是因为 Python 的 vars 是底层共享指针。 - mvidelgauz
3
@mvidelgauz 说得没错,但是教给别人一种次优解真的有意义吗?更不用说在 C++ 中,特别是对于向量,指针看起来很麻烦,因为如果 b 是指针,则必须像 (*b)[0] == 1 这样访问值。 - AlexGeorg
@AlexGeorg 我理解你的观点,它对我来说是有道理的。但我怀疑 OP 在他们的问题中只给出了一个最小的例子。问题的真正精神是如何在可能很大且更复杂的软件中实现变量的相等行为(包括在对象之间传递它们,在容器中存储它们等)。 - mvidelgauz

0
虽然应尽可能使用引用以保持简单,但为了完整起见,这里提供一个使用共享指针的解决方案:
#include <iostream>
#include <memory>
#include <vector>

int main()
{
 auto a = std::make_shared<std::vector<int>>();
 auto b = a;
 a->push_back(1);

 std::cout << "This is One: " << (*b)[0] << "\n";
}

是的,对于琐碎的事情来说,C++ 可能看起来比 Python 糟糕得多了……不过我们现在至少有 "auto" 这个东西可以避免反复输入这个:std::shared_ptr<std::vector<int>>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接