跳转到内容

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;
}

graph LR A[调用函数] -->|传值| B[创建副本] A -->|传引用| C[直接操作原始变量] A -->|传指针| D[通过地址访问]

默认参数[编辑 | 编辑源代码]

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++代码的基础,应根据具体需求选择合适的参数传递方式。