我已经看到了以与execute()函数的以下实现类似的方式传递参数的代码。它完全合法还是可以接受?它似乎工作,但它是否正确?你能解释一下值向量是怎么回事吗?
#include <vector>
#include <iostream>
using namespace std;
vector<string> GetValues()
{
return vector<string> {"hello", "world"};
}
void execute(vector<string>* values)
{
*values = GetValues();
}
int main()
{
vector<string> values;
execute(&values);
for (size_t i = 0; i < values.size(); ++i)
{
cout << values[i].c_str() << endl;
}
return 0;
}
答案 0 :(得分:0)
这是合法的,虽然当然是一个人为的例子。
记住CompSci中术语“堆栈”的含义。它是一个包含多个元素的容器,但是一个元素被指定为顶部。使用推送和弹出操作更改哪个元素。因此,它是典型的“后进先出”数据结构。
这也是我们讨论函数调用堆栈的原因。函数调用和函数返回的工作方式与push和pop相同。最后调用的函数是“top”,这就是代码执行的地方。此外,对于调用堆栈上的所有函数,局部变量都是有效的,但只有顶层函数的那些函数可以直接访问 。
我已经“直接”加粗了,因为您的示例显示了一种解决方法。您将指针从main
传递到execute
,以便在values
运行时间接访问main
中的execute
。这是安全的,因为它是一个堆栈。 main
运行时execute
无法返回; execute
必须回头。因此execute
可以安全地使用values
中的main
。
由于堆栈语义,这一切都是安全的。但如果你开始偏离这个,例如通过存储指针,您需要开始担心对象的生命周期。这有点复杂,因为C ++没有垃圾收集。尽可能使用堆栈语义,它更容易。