说我有一个看起来像这样的课程
class MyAnimals{
public:
Animal getAnimal(int index){
return animals.at(index);
}
private:
vector<Animal> animals;
}
从目前为止我对C ++的了解,我认为getAnimal
目前会返回动物的副本,而不是Java中的引用。我已经看到这被建议作为返回对象的正确方法,但是如果你想要在它返回后修改那个动物怎么办?我只是改变它的副本,MyAnimals.animals里面的实际动物将保持不变。我看到解决此问题的一种方法是返回Animal&
而不是Animal
,这似乎在很大程度上起作用,但是如果我想重新分配给它的变量怎么办?归还动物?例如,
Animal& a = myanimals.getAnimal(1);
a = myanimals.getAnimal(2);
根据我的要求,这会将myanimals.animals[1]
处的动物更改为与myanimals.animals[2]
完全相同的对象,因为a是参考。返回物品有哪些不同的方法?
答案 0 :(得分:7)
从目前为止我对C ++的了解,我认为getAnimal目前会返回动物的副本,而不是Java中的引用。
正确。
我已经看到这被认为是回归物品的正确方法
如果您打算返回副本,那么是。
我只是在改变它的副本,MyAnimals.animals里面的实际动物将保持不变。
正确。
我见过的一种解决方法是返回Animal&amp;而不是动物,这似乎适用于大部分
是的,引用正是您所需要的。
但如果我想重新分配给返回的Animal的变量怎么办?
嗯,通常不需要重新分配现有的引用(无论如何都不允许)。而不是你做了什么,你可以这样做:
Animal& a = myanimals.getAnimal(1);
Animal& b = myanimals.getAnimal(2);
如果由于某种原因需要,则使用指针代替,以绕过限制。即使您返回引用,也可以执行此操作:
Animal* a = &myanimals.getAnimal(1);
a = &myanimals.getAnimal(2);
答案 1 :(得分:1)
我知道从Animal
返回MyAnimals
的以下方法。
按const
参考。这使您可以在需要查询对象时避免复制。
Animal const& getAnimal(int index) const;
参考。这允许您修改MyAnimals
内的对象。
Animal& getAnimal(int index);
按价值计算。就Animal
的内容而言,这是最安全的返回MyAnimals
的方法,但也是效率最低的方法。
Animal getAnimal(int index) const;
通过迭代器提供对元素的访问。
class MyAnimals
{
public:
typedef vector<Animal>::iterator iterator;
typedef vector<Animal>::const_iterator const_iterator;
iterator begin();
iterator end;
const_iterator begin() const;
const_iterator end const;
Animal getAnimal(int index){
return animals.at(index);
}
private:
vector<Animal> animals;
};
答案 2 :(得分:1)
你不能重新分配&#34;设计参考。但你可以重新分配一个指针。因此,如果您有getAnimal()
返回引用,您可以写:
Animal* a = &myanimals.getAnimal(1);
a = &myanimals.getAnimal(2);