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

时间:2015-09-23 15:04:59

标签: c++ class object reference

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

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是参考。返回物品有哪些不同的方法?

3 个答案:

答案 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的以下方法。

  1. const参考。这使您可以在需要查询对象时避免复制。

    Animal const& getAnimal(int index) const;
    
  2. 参考。这允许您修改MyAnimals内的对象。

    Animal& getAnimal(int index);
    
  3. 按价值计算。就Animal的内容而言,这是最安全的返回MyAnimals的方法,但也是效率最低的方法。

    Animal getAnimal(int index) const;
    
  4. 通过迭代器提供对元素的访问。

    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);