C++ 中,函数参数是函数在被调用时从调用者接收的数据。这些数据可以是各种类型,包括基本数据类型(int, float, char 等)、自定义数据类型(类、结构体)、数组、指针等等。函数参数是函数定义中用于传递数据的变量。这些参数可以是值传递、引用传递或指针传递,每种方式具有不同的行为和效率特点。本文主要介绍C++ 中函数参数。

1、函数形参或函数实参

函数形参和函数实参可用于同一事物:传递到函数中的数据。

从函数的角度来看:函数形参是在函数定义的括号内列出的变量,函数实参是在调用时发送给函数的值。

在函数名称后的括号内指定参数。可以根据需要添加任意数量的参数,只需用逗号将它们分开即可,

语法:

#include <iostream>
using namespace std;
void functionName(parameter1, parameter2, parameter3) {
  // 代码
}

以下示例具有一个函数,该函数将一个string fname作为参数。调用该函数时,我们传递一个名字,该名字在函数内部用于打印全名。

1)值传递

通过值传递时,函数接收参数的副本,对副本的修改不会影响原始参数。

例如,

#include <iostream>
using namespace std;
void myFunction(string fname) {
  cout << fname << " is cjavapy\n";
}
int main() {
  myFunction("C");
  myFunction("Java");
  myFunction("Python");
  return 0;
}

2) 常量引用传递

常量引用传递通常用于传递大型对象(如字符串或容器)以避免复制,同时防止在函数中修改原始对象。

例如,

#include <iostream>
using namespace std;

void func(const int& x) {
    // x = 10;  // 错误,不能修改常量引用
    std::cout << "Inside func: " << x << std::endl;
}

int main() {
    int a = 5;
    func(a);  // 传递的是 a 的常量引用
    return 0;
}

2、函数默认参数值

还可以通过使用等号(=)来使用默认参数值。如果调用不带参数的函数,它将使用默认值。

例如,

#include <iostream>
using namespace std;
void myFunction(string lang = "cjavapy") {
  cout << lang << "\n";
}
int main() {
  myFunction("C");
  myFunction("Java");
  myFunction();
  myFunction("Python");
  return 0;
}

注意:具有默认值的参数通常称为“可选参数”。在上面的示例中, lang是可选参数,并且"cjavapy"是默认值。

3、函数返回值

使用的void关键字表示函数不应该返回值。如果想让函数返回一个值,可以使用一个数据类型(比如int, string,等等)来代替void,并在函数内部使用return关键字。

例如,

#include <iostream>
using namespace std;
int myFunction1(int x) {
  return 4 + x;
}
int myFunction2(int x, int y) {
  return x + y;
}
int main() {
  cout << myFunction1(5) << endl;
  cout << myFunction2(5,8);
  return 0;
}

4、函数引用参数

在向函数传递参数时可以使用普通变量。还可以向函数传递一个引用。当需要改变实参的值时,可以使用。通过引用传递时,函数接受的是参数的引用,对引用的修改会影响到原始参数。

例如,

#include <iostream>
using namespace std;
void swapNums(int &x, int &y) {
  int z = x;
  x = y;
  y = z;
}
int main() {
  int firstNum = 10;
  int secondNum = 20;
  cout << "执行 swap 之前: " << "\n";
  cout << firstNum << secondNum << "\n";
  // 调用该函数,它将更改firstNum和secondNum的值
  swapNums(firstNum, secondNum);
  cout << "执行 swap 之后: " << "\n";
  cout << firstNum << secondNum << "\n";
  return 0;
}

5、参数包和变长模板(Variadic Templates)

C++11 引入了变长模板(variadic templates),可以允许函数接受任意数量的参数。

#include <iostream>
using namespace std;

template<typename... Args>
void func(Args... args) {
    (std::cout << ... << args) << std::endl;  // 展开参数包
}

int main() {
    func(1, 2, 3, "Hello", 4.5);
    return 0;
}

相关文档:

C++ 引用变量

C++ 函数

推荐文档