gpt4 book ai didi

c++ - 返回对数据成员的引用

转载 作者:太空狗 更新时间:2023-10-29 23:51:09 26 4
gpt4 key购买 nike

读完后:

Is the practice of returning a C++ reference variable, evil?

和其他一些引用资源,我想知道这样的事情是否可以,或者我应该返回一个指针吗?

#include <iostream>

class engine
{
public:
int cc;
};


class car
{
protected:
engine eng;

public:
car (void) : eng()
{
eng.cc = 500;
}

const engine& get_engine(void) const
{
return eng;
}
};


int main (void)
{
car c = car();

engine en = c.get_engine();


std::cout << en.cc << std::endl;
}

还有:

如果我换行会有什么不同

engine en = c.get_engine();

engine&en = c.get_engine();

两者都编译并给出相同的输出,但是否存在任何细微/不那么细微的差异?

编辑:正如来自莫斯科的 Vlad 所指出的,最后一个应该是 const engine& en = c.get_engine();

最佳答案

答案取决于您要建模的内容:

  • 如果引擎不能在其汽车的上下文之外存在,并且如果汽车没有引擎就不能存在,则返回引用就可以了 - 这意味着当您使用其引擎时,汽车将存在。
  • 如果引擎可以存在于其汽车环境之外,您最好返回一个指针(最好是智能指针)。这样删除相应的车不会删除引擎。
  • 如果一辆汽车没有引擎也能存在,情况也是如此:你需要返回一个指针,因为没有空引用这样的东西(这里 hack 不算数)

当然,这些只是现实中的模型——在现实中,没有引擎的汽车和没有引擎的汽车都存在。如果合适,您甚至可以在汽车之间更换发动机。但是,将现实建模到这个级别需要您付出更多的努力,因此您需要决定您的模型能走多远。

engine en = c.get_engine();engine &en = c.get_engine(); 的区别在于第一个表达式复制了 c 的引擎,而第二个引用引擎。除此之外,这意味着对引擎拷贝的操作不会自动反射(reflect)在原始引擎中,因为它们不是同一个对象。另一个结果是拷贝在删除汽车后仍然存在,而引用则不然。

关于c++ - 返回对数据成员的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23480092/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com