理解函数参数并传递值

问题描述 投票:0回答:1

我目前正在学习有关函数和传递值的部分。

在本节中,讲师正在教授形式参数与实际参数。他提到“主函数”“外部”的“函数”是副本。然后,当在 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()
c++ function parameters pass-by-value
1个回答
0
投票
main()

函数具有局部变量,它们在调用时分配,然后在返回时释放。函数本身只是存储在某处等待执行的代码。每次调用有一个分配,这意味着函数可以调用自身,并且局部变量会有两份副本,但每次调用的函数代码只能看到一份。

函数可以有参数。调用时,参数的值在括号中给出,这是函数的参数。
虽然它们位于函数声明中,但默认情况下函数的参数是局部变量。唯一的区别是,在调用函数时,参数会被复制到参数变量,但在函数内部,它们可以更改(如果不是 

const

)并像任何其他局部变量一样使用。当函数返回时,参数变量与其他变量一起被释放。

我在那里说“默认”是因为参数可以声明为引用参数。这些是相同的,除非您修改一个更改“传递”到调用代码并更改参数变量(如果它是引用参数,它必须是一个变量)。

最后,如果参数是指针(或其他变量的某种容器),则指针的值将复制到参数,这意味着它指向与原始参数相同的东西,而不是副本。该函数可以使用该指针来更改它指向的内容(这就是引用参数在幕后工作的方式)。当函数返回时,指针被释放,变化仍然存在。

我认为这涵盖了所有评论。

© www.soinside.com 2019 - 2024. All rights reserved.