我目前正在学习有关函数和传递值的部分。
在本节中,讲师正在教授形式参数与实际参数。他提到“主函数”“外部”的“函数”是副本。然后,当在 Main 中调用该函数时,副本将被删除并替换为在 main 中初始化的当前变量。 我并没有真正理解他教给我的概念。 据我了解,Main函数中的变量优先于
main之外的函数。
下面的代码是课程内容中使用的示例源代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
/*function prototypes*/
void pass_by_value1 (int num);
void pass_by_value2 (string s);
void pass_by_value3 (vector <string> v);
void print_vector (vector <string> v);
void pass_by_value1(int num)
{
num = 1000;
}
void pass_by_value2(string s)
{
s = "Changed";
}
void pass_by_value3 (vector <string> v)
{
v.clear();
}
void print_vector(vector<string>v)
{
for (auto s:v) {
cout << s << " ";
cout << endl;
}
}
int main()
{
int num {10};
int another_num {20};
cout << "num before calling pass_by_value1: " << num << endl; //expect 10
pass_by_value1(num);
cout << "num after calling pass_by_value1: " << num << endl;
cout << "\nAnother_num before calling pass_by_value1: " << another_num << endl;
pass_by_value1(another_num);
cout << "another_num after calling pass_by_value1: " << another_num << endl;
string name {"Frank"};
cout << "\nName before calling pass_by_value2: " << name << endl;
pass_by_value2(name);
cout << "Name after calling pass_by_value2: " << name << endl;
vector<string> stooges {"Larry", "Moe", "Curly"};
cout << "\nStooges before calling pass_by_value3: ";
print_vector (stooges);
pass_by_value3(stooges);
cout << "Stooges after calling pass_by_value3: ";
print_vector (stooges);
cout << endl;
return 0;
}
如果有一个更简单的术语来解释这一点,我们将不胜感激。
我认为评论需要总结一下。
main()
main()
。
函数具有局部变量,它们在调用时分配,然后在返回时释放。函数本身只是存储在某处等待执行的代码。每次调用有一个分配,这意味着函数可以调用自身,并且局部变量会有两份副本,但每次调用的函数代码只能看到一份。
函数可以有参数。调用时,参数的值在括号中给出,这是函数的参数。虽然它们位于函数声明中,但默认情况下函数的参数是局部变量。唯一的区别是,在调用函数时,参数会被复制到参数变量,但在函数内部,它们可以更改(如果不是const
)并像任何其他局部变量一样使用。当函数返回时,参数变量与其他变量一起被释放。
我在那里说“默认”是因为参数可以声明为引用参数。这些是相同的,除非您修改一个更改“传递”到调用代码并更改参数变量(如果它是引用参数,它必须是一个变量)。
最后,如果参数是指针(或其他变量的某种容器),则指针的值将复制到参数,这意味着它指向与原始参数相同的东西,而不是副本。该函数可以使用该指针来更改它指向的内容(这就是引用参数在幕后工作的方式)。当函数返回时,指针被释放,变化仍然存在。
我认为这涵盖了所有评论。