gpt4 book ai didi

C++最佳实践: Returning reference vs.对象

转载 作者:IT老高 更新时间:2023-10-28 14:01:18 25 4
gpt4 key购买 nike

我正在尝试学习 C++,并尝试理解返回的对象。我似乎看到了两种方法,需要了解什么是最佳做法。

选项 1:

QList<Weight *> ret;
Weight *weight = new Weight(cname, "Weight");
ret.append(weight);
ret.append(c);
return &ret;

选项 2:

QList<Weight *> *ret = new QList();
Weight *weight = new Weight(cname, "Weight");
ret->append(weight);
ret->append(c);
return ret;

(当然,我也可能不明白)。

哪种方式被认为是最佳实践,应该遵循?

最佳答案

选项 1 有缺陷。当你声明一个对象时

QList<Weight *> ret;

它只存在于本地范围内。它在函数退出时被销毁。但是,您可以使用

return ret; // no "&"

现在,虽然 ret 已被销毁,但首先会创建一个拷贝并将其传回给调用者。

这是通常首选的方法。事实上,复制和销毁操作(实际上什么也没做)通常是 elided, or optimized out你会得到一个快速、优雅的程序。

选项 2 有效,但是你有一个指向堆的指针。看待 C++ 的一种方式是,该语言的目的是避免诸如此类的手动内存管理。有时您确实想管理堆上的对象,但选项 1 仍然允许:

QList<Weight *> *myList = new QList<Weight *>( getWeights() );

getWeights 是您的示例函数。 (在这种情况下,您可能必须定义一个复制构造函数 QList::QList( QList const & ),但与前面的示例一样,它可能不会被调用。)

同样,您可能应该避免使用指针列表。该列表应直接存储对象。尝试使用 std::list... 练习语言特性比练习实现数据结构更重要。

关于C++最佳实践: Returning reference vs.对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2497541/

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