EC笔记:第4部分:20、传递引用代替传值

时间:2021-02-27 08:42:30

考虑以下场景:

#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;

}