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;

}

 

posted @ 2017-01-02 23:44  SkyFireITDIY  阅读(316)  评论(0编辑  收藏  举报