c++++ 中有四种函数调用约定:通过值传递、通过指针传递、通过引用传递和通过 rvo 传递。通过值传递传递参数的副本,通过指针传递传递参数的地址,通过引用传递传递参数的引用,而通过 rvo 传递则在特定条件下直接移动对象的内容。
C++ 函数调用约定
函数调用约定规定了如何在函数调用过程中传递参数,以及在调用返回时如何返回结果。C++ 中有四种主要的函数调用约定:
1. 通过值传递(pass-by-value)
- 参数的副本传递给函数。
- 函数对副本进行操作,不影响原始值。
- 对于基本类型(int、float 等)高效。
2. 通过指针传递(pass-by-pointer)
- 参数的地址传递给函数。
- 函数可以通过指针指向并修改原始值。
- 允许函数返回可变数量的参数。
3. 通过引用传递(pass-by-reference)
- 参数的引用(别名)传递给函数。
- 函数可以通过引用指向并修改原始值。
- 比通过指针传递效率更高(避免了指针解引用)。
4. 通过 RVO 传递(return value optimization,返回值优化)
- 当一个函数返回一个非引用对象且该对象尚未被任何其他对象引用时,则编译器会执行 RVO。
- 在 RVO 中,函数直接将对象的内容移动到调用者的上下文中,而不是创建并返回一个临时副本。
实战案例
// 通过值传递整数 void func_by_val(int val) { val++; // 不会影响原始值 } // 通过指针传递整数 void func_by_ptr(int *val) { (*val)++; // 会影响原始值 } // 通过引用传递整数 void func_by_ref(int &val) { val++; // 会影响原始值 } int main() { int a = 5; func_by_val(a); std::cout << a << std::endl; // 输出 5 func_by_ptr(&a); std::cout << a << std::endl; // 输出 6 func_by_ref(a); std::cout << a << std::endl; // 输出 7 }