在C++方法中返回对象的方法

Wes*_*ton 4 c++ reference class object

假设我有一个看起来像这样的课程

class MyAnimals{
public:
    Animal getAnimal(int index){
        return animals.at(index);
    }
private:
    vector<Animal> animals;
}
Run Code Online (Sandbox Code Playgroud)

从我到目前为止学到的关于C++的知识,我认为getAnimal目前会返回动物的副本,而不是Java中的引用.我已经看到这被建议作为返回对象的正确方法,但是如果你想要在它返回后修改那个动物怎么办?我只是改变它的副本,MyAnimals.animals里面的实际动物将保持不变.我已经看到解决这个问题的一种方法是返回Animal&而不是Animal,这似乎在很大程度上起作用,但是如果我想重新分配给返回的Animal的变量怎么办?例如,

Animal& a = myanimals.getAnimal(1);
a = myanimals.getAnimal(2);
Run Code Online (Sandbox Code Playgroud)

从我得到的,这将改变动物myanimals.animals[1]是同一个确切的对象myanimals.animals[2],因为a是一个参考.返回物品有哪些不同的方法?

eer*_*ika 7

从我到目前为止学到的关于C++的知识来看,我认为getAnimal目前会返回动物的副本,而不是Java中的引用.

正确.

我已经看到这被建议作为返回对象的正确方法

如果您打算返回副本,那么是.

我只是改变它的副本,MyAnimals.animals里面的实际动物将保持不变.

正确.

我看到解决这个问题的一种方法是返回Animal而不是Animal,这似乎在很大程度上起作用

是的,引用正是您所需要的.

但是如果我想重新分配给返回的Animal的变量怎么办?

好吧,通常不需要重新分配现有的引用(无论如何都不允许).而不是你做了什么,你可以这样做:

Animal& a = myanimals.getAnimal(1);
Animal& b = myanimals.getAnimal(2);
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因需要,则使用指针代替,以绕过限制.即使您返回引用,也可以执行此操作:

Animal* a = &myanimals.getAnimal(1);
a = &myanimals.getAnimal(2);
Run Code Online (Sandbox Code Playgroud)