Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么按值传递局部变量有效?_C++ - Fatal编程技术网

C++ 为什么按值传递局部变量有效?

C++ 为什么按值传递局部变量有效?,c++,C++,此代码如何/为什么工作?我很奇怪,因为对func()的调用一完成,abc就超出了范围并被销毁了。因此,函数func1中变量s中不能/不应该有abc的副本,这种理解正确吗?返回值是从局部变量复制的,有效地创建了一个新的字符串对象 然而,RVO(返回值优化)应该消除这个步骤 尝试在调试器中单步执行代码。您应该看到为返回行调用的std::string copy构造函数。确保在启用调试和关闭优化器的情况下编译 您的代码本质上是在询问: “调用func1,为了使func1工作,我必须接收一个字符串,我们可

此代码如何/为什么工作?我很奇怪,因为对
func()
的调用一完成,
abc
就超出了范围并被销毁了。因此,函数
func1
中变量
s
中不能/不应该有
abc
的副本,这种理解正确吗?

返回值是从局部变量复制的,有效地创建了一个新的字符串对象

然而,RVO(返回值优化)应该消除这个步骤


尝试在调试器中单步执行代码。您应该看到为返回行调用的std::string copy构造函数。确保在启用调试和关闭优化器的情况下编译

您的代码本质上是在询问:

“调用func1,为了使func1工作,我必须接收一个字符串,我们可以通过调用该字符串的复制构造函数来使用该字符串。我们希望func1的参数来自func的返回值(我们知道它必须是一个字符串,因为它是显式定义的)。”

只有在对传递字符串值的func()的返回值调用复制构造函数后,abc才会超出范围。理论上,您可以通过引用或常量引用编写它:

$ ./a.out 
I got this: some string
void func1(字符串&s){

如果你的理解正确,那么C++根本就不起作用,不是吗?@ JuangopaZAZ.Sun足够公平,任何指向阅读材料的指针,我能在这里澄清吗?我认为任何C++初学者都会做的。看看这是不是真的,你不能使用<代码>返回< /代码>。
$ ./a.out 
I got this: some string
void func1(string& s) {
cout << "I got this: " << s << endl;
} 
void func1(string const& s) {
cout << "I got this: " << s << endl;
} 
void func1(string s) {
s += " some extra stuff to add to the end of the string";  //append some new data
cout << "I got this: " << s << endl;
}