C++ 函数参数
外观
C++函数参数[编辑 | 编辑源代码]
C++函数参数是函数定义中声明的变量,用于接收调用函数时传递的值。参数允许函数处理不同的输入数据,是函数灵活性和复用性的核心机制。本文将全面介绍C++函数参数的类型、传递方式、默认参数、可变参数等关键概念。
基本概念[编辑 | 编辑源代码]
函数参数在函数声明或定义时指定,格式为:
返回类型 函数名(参数类型1 参数名1, 参数类型2 参数名2, ...)
示例:
#include <iostream>
using namespace std;
// 声明带参数的函数
void printSum(int a, int b) {
cout << "Sum: " << (a + b) << endl;
}
int main() {
printSum(5, 3); // 传递参数5和3
return 0;
}
输出:
Sum: 8
参数传递方式[编辑 | 编辑源代码]
C++支持三种参数传递方式:
1. 传值 (Pass by Value)[编辑 | 编辑源代码]
创建参数的副本传递给函数,函数内修改不影响原始变量。
void modifyValue(int x) {
x = 10; // 只修改局部副本
}
int main() {
int num = 5;
modifyValue(num);
cout << num; // 输出5,原始值未改变
return 0;
}
2. 传引用 (Pass by Reference)[编辑 | 编辑源代码]
直接操作原始变量,使用引用符号&
。
void modifyReference(int &x) {
x = 10; // 修改原始变量
}
int main() {
int num = 5;
modifyReference(num);
cout << num; // 输出10
return 0;
}
3. 传指针 (Pass by Pointer)[编辑 | 编辑源代码]
通过内存地址间接访问变量。
void modifyPointer(int *x) {
*x = 10; // 解引用并修改值
}
int main() {
int num = 5;
modifyPointer(&num);
cout << num; // 输出10
return 0;
}
默认参数[编辑 | 编辑源代码]
C++允许为参数指定默认值,当调用时省略参数则使用默认值。
void greet(string name = "Guest") {
cout << "Hello, " << name << "!" << endl;
}
int main() {
greet(); // 输出: Hello, Guest!
greet("Alice"); // 输出: Hello, Alice!
return 0;
}
规则:
- 默认参数必须从右向左连续定义
- 通常在函数声明中指定默认值
函数重载[编辑 | 编辑源代码]
相同函数名不同参数列表构成重载:
void print(int i) {
cout << "Integer: " << i << endl;
}
void print(double f) {
cout << "Float: " << f << endl;
}
int main() {
print(5); // 调用print(int)
print(3.14); // 调用print(double)
return 0;
}
可变参数[编辑 | 编辑源代码]
C++11引入的变参模板可处理任意数量参数:
#include <iostream>
#include <initializer_list>
void printArgs(initializer_list<int> args) {
for (auto arg : args) {
cout << arg << " ";
}
cout << endl;
}
int main() {
printArgs({1, 2, 3}); // 输出: 1 2 3
printArgs({10, 20, 30, 40}); // 输出: 10 20 30 40
return 0;
}
实际应用案例[编辑 | 编辑源代码]
场景:实现数学库中的向量点积计算
#include <vector>
#include <iostream>
double dotProduct(const vector<double>& v1, const vector<double>& v2) {
if (v1.size() != v2.size()) {
throw invalid_argument("Vectors must be of equal length");
}
double result = 0.0;
for (size_t i = 0; i < v1.size(); ++i) {
result += v1[i] * v2[i];
}
return result;
}
int main() {
vector<double> a = {1.0, 2.0, 3.0};
vector<double> b = {4.0, 5.0, 6.0};
cout << "Dot product: " << dotProduct(a, b) << endl;
return 0;
}
输出:
Dot product: 32
参数传递效率比较[编辑 | 编辑源代码]
方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
传值 | 简单安全 | 复制开销大 | 小型数据 |
传引用 | 无复制开销 | 可能意外修改 | 大型对象/需要修改 |
传指针 | 灵活可控 | 需处理空指针 | 需要显式表示可选参数 |
高级主题:完美转发[编辑 | 编辑源代码]
C++11的完美转发保持参数的左值/右值特性:
template<typename T>
void wrapper(T&& arg) {
// std::forward保持参数原始类型
process(std::forward<T>(arg));
}
总结[编辑 | 编辑源代码]
- 传值适合小型数据,传引用/指针适合大型对象
- 默认参数提高接口灵活性
- 函数重载实现多态行为
- 现代C++提供了更安全的参数处理方式(如
std::string_view
)
理解参数传递机制是编写高效、安全C++代码的基础,应根据具体需求选择合适的参数传递方式。