在 C++ 里,对象作为函数的参数和返回值,有值传递、指针传递和引用传递这三种传递方式,下面为你详细介绍。
1.值传递
在值传递时,把实参对象的值复制给形参对象,函数会接收实参的一个副本,而非实参本身。函数内对形参的修改不会影响到实参。
#include <iostream>
using namespace std;
class MyClass {
public:int value;MyClass(int val) : value(val) {}
};// 值传递
void modifyValue(MyClass obj) {obj.value = 20;
}int main() {MyClass obj(10);modifyValue(obj);cout << "Value after modification: " << obj.value << endl; // 输出 10return 0;
}
但是对象占用内存都比较大,一般都不传对象本身,而改为传对象引用或者对象指针。
2.指针传递
指针传递时,函数接收的是实参的地址。通过指针,函数能够直接修改实参对象。
#include <iostream>
using namespace std;
class MyClass {
public:int value;MyClass(int val) : value(val) {}
};// 指针传递
void modifyValue(MyClass* objPtr) {if (objPtr != nullptr) {objPtr->value = 20;}
}int main() {MyClass obj(10);modifyValue(&obj);cout << "Value after modification: " << obj.value << endl; // 输出 20return 0;
}
3.引用传递
函数接收的是实参的引用,也就是实参的别名。函数内对引用的修改会直接影响到实参。
使用对象引用作为函数参数最常见,它不但有指针作为参数的优点,而且比指针作为参数更简单、更方便。
#include <iostream>
using namespace std;
class MyClass {
public:int value;MyClass(int val) : value(val) {}
};// 引用传递
void modifyValue(MyClass& objRef) {objRef.value = 20;
}int main() {MyClass obj(10);modifyValue(obj);cout << "Value after modification: " << obj.value << endl; // 输出 20return 0;
}
4.三种传递方式比较
从代码效率上看,用对象值传递的方式的效率相对低一些,它需要创建新的对象来接收实参传来的值,用指针或者引用效率更高。
值传递较为安全,不会影响原始对象;指针传递和引用传递能直接修改原始对象,不过使用指针时需要注意空指针的情况。引用比指针使用起来更加简洁,方便,在C++中更常用。当然如果实参数据不能被修改,可以(应该)在前面加上const所以一般更建议用引用。