繁体   English   中英

我该什么时候应该回到T const&?

[英]When should I return by T const&?

我该什么时候应该回到T const& 如果我不打算修改对象,我看不出它与按值返回有什么不同。 并且通过const引用返回真的只意味着没有复制。 所以什么时候返回T const&有用。

有两个原因可以让你更喜欢按const&而不是按值返回。

首先是语义。 一个代码,它通过const&返回一些东西并明确告诉调用者,“这里是你要求的只读版本。如果你想永久存储它,或者对它进行更改,你有责任制作它的副本“。 此返回类型的语义非常清楚,并且易于实施。

第二是优化。 通过按值返回某些内容,可以从编译器中删除一些优化机会。 并不是说,由价值回归比返回低效率的const& (事实上,在情况相反可能是真实的-考虑到返回的功能char在64位系统上)。 它只是意味着您从编译器的优化工具箱中删除其中一个工具。 还有另一种工具可以替换它 - 即,将调用与复制省略一起内联 - 所以这可能是一种清洗。 这一切都取决于背景。

我提到“语义学”是第一个原因,因为我认为它是最重要的。 有很多变量需要优化和许多移动部件,因此通常很难知道编译器能够使用什么优化以及何时使用。 然而有一件事是certian - 人类比混乱的语义更容易理解清晰的语义。

您返回const T&常见情况是const getter成员函数:

T& get() { return m_some_private_member; }

const T& get() const { return m_some_private_member; }

在这种情况下,您通常不希望复制 - 您只想返回对某个对象的引用,并且为了const-correctness,您可能还需要提供一个const getter。

当你有一个足够稳定的物体。

一个简单的案例是集合以这种方式返回内容。 有点主要职位描述。

对于nonconst和另一个常见的情况是返回你在参数中得到的东西(包括隐藏的this指针)。 这可能适用于const&以类似的方式,但要注意风险,当你的param被绑定到一个临时的,将在短时间内消失。 如果你得到&并且在更改内容后返回const并且会更好。

您可以返回对数据成员的引用,但它符合“不要泄漏您的胆量”指南。

在任何情况下,如果您返回ref,您必须向客户提供有关有效性的文档。 如果您开始编写该描述,您将首先发现它是否有意义。

另一个明显的例子是身份对象,它可以(或假设)不被复制。 有必要使用访问器,一个返回const和主流使用,另一个具有写访问权限。

由于您指定的原因: 没有复制

如果要返回一个大对象,则返回一个const引用比该对象的副本更有效。

不制作副本更有效,特别是对于复杂类型或在其复制构造函数中执行大量工作的类型。

所以你可以避免你被误用,如下所示吗?

class A
{
int x;

public:

int show()
{
return x;
}

A(int a)
{
        x = a;
}

A const& operator+(A& inp)
{

inp.x = this->x + inp.x;

return inp;
}

};

int main()
{
A a(1),b(2),c(0),d(420);
a + b = d;
std::cout<<b.show();

}

这给出了420作为输出。 应该将重载用作d = a + b ,但没有任何内容阻止返回的引用分配另一个对象。

如果将函数的返回类型设为A const&返回的引用是常量,并且不能为其他任何对象分配。 因此,运算符必须仅用d = a + b而不允许a + b = d等。

g ++给出了错误error: passing 'const A' as 'this' argument of 'A& A::operator=(const A&)' discards qualifiers并有效地防止这种滥用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM