EC笔记:第4部分:20、传递引用代替传值
考虑以下场景:
#include <iostream>
#include <string>
using namespace std;
struct Person {
string name;
int age;
};
class Manager{
private:
Person person;
public:
Person get_person(){
return person;
}
};
int main(int argc, char *argv[]) {
Manager m;
m.get_person().name="SkyFire";
m.get_person().age=24;
Person p=m.get_person();
cout<<p.name<<endl<<p.age<<endl;
return 0;
}
这段代码想用get接口返回管理的对象,然后修改其内部值,但是这段代码不能达成目的,而且编译都不会通过,因为返回的对象并不是实际管理的对象,而是person对象的副本了。
但是如果将Person get_person()这个接口改为Person& get_person(),那这段代码就没什么问题了。此时返回的是person对象的引用,可以直接改变其值。
另外,考虑一种情况:
#include <iostream>
#include <string>
using namespace std;
struct Person {
string name;
int age;
};
void func(Person p){
}
int main(int argc, char *argv[]) {
Person p;
//对p进行一些操作,改变name的值,使它的长度足以影响到效率
func(p);
return 0;
}
这个函数在调用时,会将p复制一份,这回使效率大打折扣,所以建议改成:
#include <iostream>
#include <string>
using namespace std;
struct Person {
string name;
int age;
};
void func(const Person &p){
}
int main(int argc, char *argv[]) {
Person p;
//对p进行一些操作,改变name的值,使它的长度足以影响到效率
func(p);
return 0;
}