字符串作为c ++函数中的返回值

Posted

技术标签:

【中文标题】字符串作为c ++函数中的返回值【英文标题】:string as a return value in c++ function 【发布时间】:2015-10-14 11:12:39 【问题描述】:

这是一个基本问题,但我并不完全理解。 当我有这样的功能时:

string func()
        string result;
        result = "resultString";

        return result;

这样可以还是字符串结果只是一个局部变量(可以超出范围)?

如果可以,为什么?这是价值回报吗?

c++中哪些类型是按值返回的,按引用返回什么?

【问题讨论】:

Google for:RVO,移动语义并按值返回 你正在做的很好。在 C++ 中,一切都是按值返回的。 @LukePark 除了返回一个参考。 引用实际上是在返回时复制到内存中的,就像一个指针一样。 从技术上来说,你仍然在返回一个值。 @LukePark 它与 C++ 标准中指定的不同。它可能以与例如相同的方式实现。指针返回,但可能不会。例如,语义差异对于优化很重要。 【参考方案1】:

这样可以还是字符串结果只是一个局部变量?

这很好。返回一个值,尽管它可能受 NRVO 约束。

如果可以,为什么?这是价值回报吗?

是的。您将string 写为返回类型,这意味着一个值。

c++中哪些类型是按值返回的,按引用返回什么?

在 C++ 中,您可以很好地控制它。 string f(); 表示返回 string 类型值的函数。 string& f(); 返回对此类值的引用。

【讨论】:

【参考方案2】:

如果可以,为什么?这是价值回报吗?

作为对先前答案的补充,我想说 result 是一个局部变量;由于 func() 原型指定返回是按值,而不是引用,c++ 编译器实际上将调用 std::string 复制构造函数以使用结果局部变量的副本初始化 func() 返回值(请注意,如果由你的代码,c++编译器会创建一个,只实现浅拷贝)

【讨论】:

由于 NRVO 或移动语义,可能无法调用复制构造函数。事实上,在上面的代码中,它很可能不会被调用。 没错,复制构造函数不会总是被调用,它取决于编译器的行为。

以上是关于字符串作为c ++函数中的返回值的主要内容,如果未能解决你的问题,请参考以下文章

c语言中的RETURN()返回值是啥意思?

从c ++中的函数返回数组向量[重复]

C语言中,sizeof返回值代表啥意思?

在Python中如何理解返回值?

C语言中的main()函数返回值是啥?

C语言试题二十二之定义了3×3的二维数组,并在主函数中赋值。函数的功能使求出数组周边元素的平均值并作为函数值返回给主函数中的s。