c++方法中返回对象的方法

Ways to return an object in C++ method

本文关键字:方法 对象 c++ 返回      更新时间:2023-10-16

假设我有一个像这样的类

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

从我目前对c++的了解来看,我认为getAnimal目前返回的是动物的副本,而不是Java中的引用。我认为这是返回对象的正确方法,但如果您想在返回后修改该动物,该怎么办?我只是改变了它的副本和MyAnimals里面的实际动物。动物将保持不变。我看到的一种方法来解决这个问题是返回Animal&而不是Animal,这似乎在大多数情况下是有效的,但是如果我想重新分配变量被分配给返回的动物呢?例如,

Animal& a = myanimals.getAnimal(1);
a = myanimals.getAnimal(2);

从我得到的,这将改变动物在myanimals.animals[1]myanimals.animals[2]完全相同的对象,因为a是一个引用。返回对象有哪些不同的方法?

根据我目前对c++的了解,我认为getAnimal目前返回的是动物的副本,而不是Java中的引用。

正确的。

我认为这是返回对象的正确方法

如果您打算返回一个副本,那么yes。

我只是改变它的副本和MyAnimals中的实际动物。动物将保持不变。

正确的。

我看到的一种绕过这个的方法是返回Animal&而不是动物,这似乎在大多数情况下都有效

是的,参考文献正是你所需要的。

但是如果我想重新赋值一个变量给返回的动物呢?

嗯,通常不需要重新分配一个现有的引用(这是不允许的)。你可以这样做:

Animal& a = myanimals.getAnimal(1);
Animal& b = myanimals.getAnimal(2);

如果出于某种原因需要这样做,那么可以使用指针来绕过限制。即使在返回引用时也可以这样做:

Animal* a = &myanimals.getAnimal(1);
a = &myanimals.getAnimal(2);

我知道以下方法从MyAnimals返回Animal

  1. const参考。这允许您在只需要查询对象时避免创建副本。

    Animal const& getAnimal(int index) const;
    
  2. 通过引用
  3. 。这允许您在MyAnimals中修改对象。

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

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

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

您不能根据设计"重新分配"引用。但是你可以重新分配一个指针。所以如果你有一个返回引用的getAnimal(),你可以这样写:

Animal* a = &myanimals.getAnimal(1);
a = &myanimals.getAnimal(2);