字符串作为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语言中函数返回值可以是数组、字符串和结构体吗?

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

VFP中函数SELECT(0)的返回值为多少?

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

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

在Python中如何理解返回值?