2026-01-04 21:38:50
在 C++ 中,函数参数的传递方式主要有两种:值传递和引用传递。这两种方式在行为和效率上有显著差异,正确选择传递方式对程序的正确性和性能至关重要。
值传递在值传递中,函数接收到的是参数的副本。这意味着函数内部对参数的任何修改都不会影响原始变量。
特点:
示例:
void printValue(int x) { x *= 2; // 修改的是副本}int main() { int a = 5; printValue(a); // 传递 a 的副本 std::cout << a << std::endl; // 输出 5,原始变量未被修改 return 0;}引用传递在引用传递中,函数接收到的是参数的引用,即原始变量的别名。这意味着函数内部对参数的修改会直接影响原始变量。
特点:
示例:
void printAndDoubleValue(int& x) { std::cout << x << std::endl; // 输出原始变量 x *= 2; // 修改原始变量}int main() { int a = 5; printAndDoubleValue(a); // 传递 a 的引用 std::cout << a << std::endl; // 输出 10,原始变量被修改 return 0;}选择传递方式的依据选择值传递还是引用传递,取决于具体的需求:
保护原始变量:
如果需要确保原始变量不被修改,使用值传递。
示例:在函数中只需要读取参数而不修改它时。
修改原始变量:
如果需要函数修改原始变量,使用引用传递。
示例:在函数中需要更新调用者的变量时。
提高效率:
对于大型对象(如结构体、类对象),使用引用传递可以避免复制的开销,提高效率。
示例:传递大型数据结构时。
假设有一个需要修改输入字符串大小写的函数:
值传递(保护原始字符串):
void printLowercase(const std::string& input) { std::string lower = input; std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower); std::cout << lower << std::endl;}使用 const std::string& 避免复制,同时保护原始字符串不被修改。
引用传递(修改原始字符串):
void toUppercase(std::string& input) { std::transform(input.begin(), input.end(), input.begin(), ::toupper);}直接修改原始字符串,适用于需要更新调用者字符串的场景。
正确选择传递方式可以提升代码的健壮性和性能。