1. 形参与实参的本质区别
在C++函数调用过程中,形参(formal parameter)和实参(actual argument)这对概念困扰着无数初学者。我见过太多人在面试或代码评审时,面对"请解释二者的区别"这个问题支支吾吾。其实只要抓住几个关键点,这个知识点就能彻底掌握。
形参是函数定义时声明的变量,它们存在于函数的局部作用域中。当我们在函数头写下void foo(int x, string s)时,x和s就是形参。它们本质上是对函数将要接收数据的"占位符声明",在函数被实际调用前,这些变量并没有真实的内存分配。
实参则是函数调用时实际传入的值或表达式。调用foo(42, "hello")时,42和"hello"就是实参。关键点在于:实参会在函数调用时被求值,然后将求值结果传递给形参。这个过程就像把货物(实参)装进集装箱(形参)运往目的地(函数体)。
重要提示:形参和实参的类型必须兼容,但不必完全相同。C++允许隐式类型转换,比如实参是short而形参是int时,编译器会自动进行整型提升。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 参数传递的三种核心方式
2.1 传值调用(Call by Value)
这是C++默认的参数传递方式。当使用传值调用时,实参的值会被复制到形参中。函数内对形参的任何修改都不会影响原始实参。例如:
cpp复制void increment(int x) {
x++;
}
int main() {
int a = 5;
increment(a);
cout << a; // 输出仍然是5
}
传值调用的特点:
- 实参可以是常量、变量或表达式
- 函数内获得的是实参的独立副本
- 适用于小型数据(基本类型、小型结构体)
- 避免意外的副作用(函数不会修改原始数据)
2.2 传引用调用(Call by Reference)
通过在形参类型后添加&符号实现。此时形参成为实参的别名,对形参的操作直接影响原始数据:
cpp复制void increment(int &x) {
x++;
}
int main() {
int a = 5;
increment(a);
cout << a; // 输出变为6
}
引用调用的关键
