对象作为函数的参数和返回值的传递方式有三种:值传递、指针转递、和引用传递
1、值传递
当对象作为值传递时,将创建该对象副本,并将副本传递给函数。在函数内部对对象的任何修改都不会影响原始对象。
void func(SomeClass obj) {
// 对obj进行操作,但不会影响原始对象
}
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
string name;
int age;
void makeOlder(Person person);
};
void makeOlder(Person person) {
person.age += 1;
cout << person.name << "is now " << person.age << "year old" << endl;
}
int main() {
Person p;
p.name = "张三";
p.age = 20;
makeOlder(p);
cout << p.name << "is till " << p.age << "year old" << endl;
}
输出:
从运行结果可以看出对象作为函数参数,形参对象的值的改变不会影响到实参对象。
2、引用传递、指针传递
当对象作文引用传递时,函数接收一个指向原始对象的引用。
当对象作为指针传递时,函数接收一个指向对象的指针。
在函数内部对对象所指向的任何内容的修改都将影响原始对象。
#include <iostream>
using namespace std;
class Square
{
private:
double length;
public:
Square(double len);
void Add(Square* s);
void Output();
};
Square::Square(double len) :length(len) {
}
void Square::Add(Square* s)
{
s->length = s->length + 1.0;
}
void Square::Output()
{
cout << "Square Area:" << length * length << endl;
}
int main() {
Square s(2.5);
cout << "add before" << endl;
s.Output();
s.Add(&s);
cout << "add after" << endl;
s.Output();
return 0;
}
可见当对象作为指针和引用传递时,形参对象的改变将会影响到实参对象。
3、三种传递方式比较
1)、值传递是单向的,形参的改变并不能引起实参的改变。而指针和引用传递是双向的,开以将改变由形参“传给”实参。
2)、引用是C++中的概念。初学者容易把引用和指针混淆一起。int m;int &n = m; n相当于m的别名或者绰号,对n的任何操作就是对m的操作。所以n既不是m的拷贝,也不是指向m的指针,其实n就是m本身。引用的主要功能是传递函数的参数和返回值。
实际上"引用"可以做的任何事情"指针"也都能够做。
3)、指针能够毫无约束地操作内存中的任何东西。指针虽然功能强大,但是用起来十分危险,所以如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,以免发生意外。
4)、使用引用作为函数参数与使用指针作为函数参数相比,前者更容易使用、更清晰,而且当参数传递的数据量较大时,引用传递参数的效率高且所占存储空间更小。