首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >const <type>& foo()与<type> foo()

const <type>& foo()与<type> foo()
EN

Stack Overflow用户
提问于 2010-01-11 21:27:56
回答 4查看 2.6K关注 0票数 3

非模板类中,是否有理由选择const <type>& foo();<type> foo();形式的函数返回签名?其中<type>是一个内在类型。如果<type>是一个类/struct对象呢?

还感兴趣的是,函数const是否起作用:const <type>& foo() const; to <type> foo() const;

例如,在非模板类中,非模板函数:

代码语言:javascript
运行
复制
const int& foo() const { return member_variable_; }

对比

代码语言:javascript
运行
复制
int foo() const { return member_variable_; }
EN

回答 4

Stack Overflow用户

发布于 2010-01-11 21:31:27

如果您需要返回一个值,则必须返回一个值-- const引用是不可接受的替代。但我怀疑你是在问这样的事:

代码语言:javascript
运行
复制
struct A {
   X x;
    ...
   X f1() { return x; }
   const X & f2() { return x; }
};

我从来没有想出一个万无一失的指导方针。

票数 0
EN

Stack Overflow用户

发布于 2010-01-11 21:38:29

这一切都取决于你到底想做什么。

如果要返回对用户代码使用的对象的引用,则:

代码语言:javascript
运行
复制
<type>& foo()  { ... }

如果希望以只读方式返回对对象的引用,只允许访问此对象类型的const函数,那么:

代码语言:javascript
运行
复制
const <type>& foo() { ... }

如果希望返回对用户代码使用的对象的引用,即使类实例用于只读(如const),则:

代码语言:javascript
运行
复制
<type>& foo() const { ... }

如果希望以只读方式返回对对象的引用,则只允许访问此对象类型的const函数,如果类实例用于只读(作为const),则允许事件:

代码语言:javascript
运行
复制
const <type>& foo() const { ... }

添加一个警告:不要返回对函数的变量的引用,它们不在函数之外.

票数 0
EN

Stack Overflow用户

发布于 2010-01-11 21:40:28

代码语言:javascript
运行
复制
const <type>& foo();

您可能有一个资源,如类中的元素容器,foo()返回特定的元素,如果您知道这些资源的可用时间足够长,您可能会将const引用返回容器中的元素,从而避免不必要的数据分配/复制。它可能是const或非foo(),这取决于您如何处理数据,如果您不希望通过foo()返回的引用修改数据,那么就让它成为const。也许你有一种情况,你想要修改资源和一些额外的工作需要做,你会使非const。您可以在您的api中两者都有,用户将根据usecase进行选择。

代码语言:javascript
运行
复制
<type> foo();

返回资源<type>的新副本。那意味着复制了一份。这对于简单的数据或值可能共享的位置都有好处,您希望确保<type>的每个实例都是独立的--不共享,就像某些字符串或int。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2045074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档