C++ 字符串作为c++;功能
这是一个基本问题,但我并不完全理解。 当我有一个函数,如:C++ 字符串作为c++;功能,c++,string,function,return-value,C++,String,Function,Return Value,这是一个基本问题,但我并不完全理解。 当我有一个函数,如: string func(){ string result; result = "resultString"; return result; } 这是正常的还是字符串结果只是一个局部变量(可能超出范围) 如果可以,为什么?这是按值返回的吗 C++中的哪些类型是由值返回的,引用什么? 这是确定的还是字符串结果只是一个局部变量 这很好。返回一个值,但该值可能受NRVO约束 如果可以,为什么
string func(){
string result;
result = "resultString";
return result;
}
这是正常的还是字符串结果只是一个局部变量(可能超出范围)
如果可以,为什么?这是按值返回的吗
<> C++中的哪些类型是由值返回的,引用什么?
这是确定的还是字符串结果只是一个局部变量
这很好。返回一个值,但该值可能受NRVO约束
如果可以,为什么?这是按值返回的吗
对。您编写了string
作为返回类型,这意味着一个值
<> C++中的哪些类型是由值返回的,引用什么?
在C++中,你可以很好地控制它。代码>字符串f()表示返回类型为string
的值的函数<代码>字符串&f()代码>返回对该值的引用
如果可以,为什么?这是按值返回的吗
作为对前面答案的补充,我认为结果是一个局部变量;由于函数()原型指定返回是按值,而不是引用,所以C++编译器实际上调用STD::String复制构造函数来初始化函数()返回值,并使用结果局部变量的副本(谨防如果代码没有复制构造,C++编译器将创建一个,只实现浅拷贝)谷歌:移动语义并按值返回您所做的一切都很好。除了返回引用之外,C++中的所有东西都是按值返回的。引用在返回时,实际上是复制到内存中的,就像指针一样。从技术上讲,您仍然返回一个值。@ LukPik它与C++标准中的不同。它的实现方式可能与指针返回相同,但也可能不同。例如,语义差异对于优化非常重要。由于NRVO或move语义,可能无法调用复制构造函数。根据上面代码中的事实,它很可能不会被调用。没错,复制构造函数不会一直被调用,这取决于编译器的行为。