gpt4 book ai didi

c++ - const & foo() 与 foo()

转载 作者:太空狗 更新时间:2023-10-29 21:30:43 25 4
gpt4 key购买 nike

非模板 类中,是否有任何理由更喜欢 const <type>& foo(); 形式的函数返回签名?与 <type> foo(); ?在哪里<type>是一个内在类型。如果 <type> 呢?是一个类/结构对象?

还对const 函数是否有所不同感兴趣:const <type>& foo() const;<type> foo() const;

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

const int& foo() const { return member_variable_; }

对比

int foo() const { return member_variable_; }

最佳答案

对于原始类型,只需按值返回。没有理由通过 const 引用返回原语。

对于非原始类型,视情况而定。

如果返回值是函数的局部变量,那么必须按值返回。否则,在调用者可以使用返回的引用之前变量将被销毁。

如果返回的值是类数据成员,那么您可以选择。

通过 const 引用返回避免了复制,这可能是一个性能优势。但是,它将您的接口(interface)与实现联系在一起,即数据成员和返回值必须是同一类型。它也不太安全,因为调用者可以保留比对象生命周期更长的引用,例如:

const X& x = y->foo();
delete y;
// use x, oops!

按值返回会产生一个或两个拷贝,具体取决于您是否可以利用返回值优化(这可能适用于像这样的简单 get() 方法)。此外,可以更有效地复制使用默认复制构造函数的对象拷贝(想想:编译器可以简单地 memcpy 数据)。

建议:从按值返回开始,只有在确定该调用/复制已知是性能问题后才切换到按常量引用返回。

最后,另一种选择是通过参数返回,这对于更复杂的对象(例如字符串)很有用:

void foo(X& return_val) { return_val = member_variable_; }

或:

void foo(X* return_val) {
assert(return_val != 0);
*return_val = member_variable_;
}

关于c++ - const <type>& foo() 与 <type> foo(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2045074/

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