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

2018-06-17 23:26:42来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

考虑以下场景:

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

}

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:游走 BZOJ 3143

下一篇:用apt-file解决找不到头文件的问题