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

时间:2018-11-04 21:09:27

标签: c++

return $('.highlight').length

这给出了:

[ 3, 3, 3, 2 ]

此代码如何/为什么起作用?我想知道是因为# include <iostream> # include <string> using std::string; using std::cout; using std::endl; string func() { string abc = "some string"; return abc; } void func1(string s) { cout << "I got this: " << s << endl; } int main() { func1(func()); } 超出范围并在对$ ./a.out I got this: some string 的调用完成后就被销毁了。因此,{/ {1}}的副本不能/不应该在函数abc的变量func()中可用这种理解正确吗?

2 个答案:

答案 0 :(得分:4)

从本地变量复制返回值,从而有效地创建一个新的字符串对象。

但是,RVO(返回值优化)应消除此步骤。

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

答案 1 :(得分:1)

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

“调用func1,为了使func1正常工作,我必须收到一个字符串,我们可以通过在该字符串上调用 copy构造子来使用该字符串。func1的参数我们想从func的返回值(自明确定义后,我们知道它必须是字符串。”

只有在对func()的返回值(传递字符串的值)调用复制构造函数之后,

abc才超出范围。从理论上讲,您可以通过引用或常量引用来传递它:

void func1(string& s) {
cout << "I got this: " << s << endl;
} 

这允许func1通过指针直接访问内存中的字符串(如果需要,还可以更改它。)

void func1(string const& s) {
cout << "I got this: " << s << endl;
} 

哪个提供对func()中字符串的恒定引用。这样可以确保您获得指向数据的指针,并且不会更改其内容。通常希望通过常量引用(const&)传递数据,因为它非常快,并且可以防止代码意外更改不应这样做的数据。

如果要在将数据传递给新函数后进行操作,则实际上只需要按值传递即可,从而节省了创建另一个新容器来处理操作的资源:

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;
}