【cpp Trip第4站】函数参数传递
cpp函数参数传递方式
在 C++ 中,函数参数传递主要有三种方式:传值(Pass by Value)、传引用(Pass by Reference) 和 传指针(Pass by Pointer)。它们各有特点和适用场景,下面详细解释:
1. 传值(Pass by Value)
- 机制:将实际参数的值复制给形式参数,函数内对形参的修改不会影响实参。
- 优点:简单安全,避免了原始数据被意外修改。
- 缺点:对于大型结构体或对象,复制开销较大。
- 示例:
void modify(int x) {x = 10; // 只修改局部副本 } int main() {int a = 5;modify(a);cout << a; // 输出 5(未被修改) }
2. 传引用(Pass by Reference)
- 机制:形式参数是实际参数的别名(引用),函数内对形参的修改直接影响实参。
- 优点:
- 避免复制开销(尤其适合大型对象)。
- 允许函数修改实参(可通过
const
引用避免修改)。
- 示例:
void modify(int &x) {x = 10; // 修改实参 } int main() {int a = 5;modify(a);cout << a; // 输出 10(已被修改) }
- 常量引用(
const T&
):用于只读访问,避免复制且防止修改:void print(const std::string &s) {cout << s; // 不能修改 s }
3. 传指针(Pass by Pointer)
- 机制:传递实参的地址(指针),函数内通过解引用(
*
)修改实参。 - 优点:
- 明确表示参数可能被修改(需检查代码逻辑)。
- 可以传递“空指针”(
nullptr
)表示可选参数。
- 缺点:语法稍复杂,需注意空指针安全问题。
- 示例:
void modify(int *x) {if (x) *x = 10; // 检查空指针后修改 } int main() {int a = 5;modify(&a); // 传递地址cout << a; // 输出 10 }
对比与选择建议:
方式 | 是否修改实参 | 复制开销 | 安全性 | 适用场景 |
---|---|---|---|---|
传值 | 否 | 有 | 高(隔离修改) | 基本类型、小型结构体 |
传引用 | 是(除非const) | 无 | 需注意(可能误修改) | 需要修改实参或避免复制的大型对象 |
传指针 | 是(需解引用) | 无 | 需检查空指针 | 明确需修改、可选参数或C风格接口 |
补充:C++11 后的移动语义(Move Semantics)
对于大型对象(如 std::vector
),除了传引用,还可以使用传值 + 移动语义(通过 std::move
)避免复制:
void process(std::string s) { // 传值,但接受移动构造// 使用 s(可能被移动而来)
}
int main() {std::string data = "hello";process(std::move(data)); // 移动而非复制
}
总结:
- 优先使用 传引用(特别是
const T&
)来避免复制。 - 需要修改实参时,用非常量引用或指针(指针更明确,但引用更简洁)。
- 基本类型(如
int
)可直接传值。 - 考虑移动语义(C++11+)来优化大型对象的传值。
根据具体需求(是否修改、性能要求、代码清晰度)灵活选择!