CPPLearningManual

在 C++ 中,函数传参主要有传值、传指针和传引用三种方式

  1. 传值(Pass by Value)
    • 原理:函数会复制实参的值来创建一个新的局部变量,对这个局部变量的修改不会影响到原始的实参。
    • 优点:简单直观,不会意外修改原始数据。
    • 缺点:对于大型对象或复杂数据结构,复制可能会导致性能开销较大。
    • 示例: ```cpp void modifyValue(int num) { num = 10; }

    int main() { int num = 5; modifyValue(num); std::cout « num « std::endl; // 输出 5 return 0; } ```

  2. 传指针(Pass by Pointer)
    • 原理:将实参的地址传递给函数,函数通过指针间接访问和修改实参的值。
    • 优点:可以避免大型对象的复制,能直接修改原始数据,效率较高。
    • 缺点:需要注意指针的合法性和内存管理,使用不当可能导致内存错误。
    • 示例: ```cpp void modifyValueByPointer(int* num) { *num = 10; }

    int main() { int num = 5; modifyValueByPointer(&num); std::cout « num « std::endl; // 输出 10 return 0; } ```

  3. 传引用(Pass by Reference)
    • 原理:给实参起一个别名,在函数内部对引用的操作就是对原始实参的操作。
    • 优点:避免了复制,能直接修改原始数据,使用上比指针更简洁和安全。
    • 缺点:引用在创建后不能重新绑定到其他对象。
    • 示例: ```cpp void modifyValueByReference(int& num) { num = 10; }

    int main() { int num = 5; modifyValueByReference(num); std::cout « num « std::endl; // 输出 10 return 0; } ```

选择传参方式时,需要根据具体的需求和场景来决定,以达到性能和代码安全性的平衡。

函数对传入值的影响,举例说明

如果传入的对象是由多个 int 组成,并且在函数中修改了其中一个 int 的值,那么原来的对象是否会改变,取决于对象的传递方式(传值、传指针或传引用)。

为了更清楚地说明这三种传递方式的区别,下面是一个示例代码:

#include <iostream>

// 定义一个包含多个 int 的结构体
struct MyStruct {
    int a;
    int b;
    int c;
};

// 按值传递结构体
void modifyStructByValue(MyStruct s) {
    s.a = 10;
}

// 按指针传递结构体
void modifyStructByPointer(MyStruct* s) {
    s->a = 20;
}

// 按引用传递结构体
void modifyStructByReference(MyStruct& s) {
    s.a = 30;
}

int main() {
    MyStruct originalStruct = {1, 2, 3};

    std::cout << "Before modification by value: " << originalStruct.a << std::endl;
    modifyStructByValue(originalStruct);
    std::cout << "After modification by value: " << originalStruct.a << std::endl;

    std::cout << "Before modification by pointer: " << originalStruct.a << std::endl;
    modifyStructByPointer(&originalStruct);
    std::cout << "After modification by pointer: " << originalStruct.a << std::endl;

    std::cout << "Before modification by reference: " << originalStruct.a << std::endl;
    modifyStructByReference(originalStruct);
    std::cout << "After modification by reference: " << originalStruct.a << std::endl;

    return 0;
}

在上述代码中,定义了一个名为 MyStruct 的结构体,其中包含三个 int 类型的成员变量 abc。然后,定义了三个函数 modifyStructByValuemodifyStructByPointermodifyStructByReference,分别用于按值、指针和引用的方式传递结构体并修改其中一个成员变量的值。

main 函数中,创建了一个 MyStruct 类型的变量 originalStruct,并初始化其成员变量。然后,分别调用三个函数对 originalStruct 进行修改,并输出修改前后的成员变量 a 的值。

通过运行上述代码,可以看到不同传递方式下对原始对象的影响:

综上所述,如果传入的对象是由多个 int 组成,并且在函数中修改了其中一个 int 的值,那么原来的对象是否会改变,取决于对象的传递方式。在实际编程中,需要根据具体情况选择合适的传递方式,以确保函数对对象的修改符合预期。同时,对于需要修改原始对象的情况,建议使用指针或引用传递,以避免不必要的对象复制和提高程序的性能。