c++方法中返回对象的方法
Ways to return an object in C++ method
假设我有一个像这样的类
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
。
-
由
const
参考。这允许您在只需要查询对象时避免创建副本。Animal const& getAnimal(int index) const;
通过引用 。这允许您在
MyAnimals
中修改对象。Animal& getAnimal(int index);
的值。就
MyAnimals
的内容而言,这是返回Animal
最安全的方法,但也是最低效的方法。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; };
您不能根据设计"重新分配"引用。但是你可以重新分配一个指针。所以如果你有一个返回引用的getAnimal()
,你可以这样写:
Animal* a = &myanimals.getAnimal(1);
a = &myanimals.getAnimal(2);
- 使用std::函数映射对象方法
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 从父类方法返回子类对象
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 为什么此派生对象无法访问基类的后递减方法?
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 正在调用shared_ptr对象方法
- 将方法转换为调用该方法的成员函子对象会导致崩溃
- 检查哪个对象调用了另一个对象的对象方法
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 没有取消引用/解包对象的标准方法?
- 使用 gmock c++ 在真实对象上调用方法
- 当我调用对象的方法时,对象的成员会发生变化
- 根据对象类调用不同的方法
- 如何在C++中循环访问未知对象方法?
- 使用动态实例化的对象填充矢量的快速方法
- 对类中的对象使用方法