zoukankan      html  css  js  c++  java
  • 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;

    }

     

  • 相关阅读:
    如果一切需要重学,2014年应该学哪些技术?
    LINUX 更新
    LINUX学习
    判断设备是笔记本,还是台式机
    DUILIB 实现微信气泡聊天效果
    OC学习1
    DUILIB 背景贴图
    DUILIB CDialogBuilder 使用问题
    my english dream
    oracle 函数
  • 原文地址:https://www.cnblogs.com/SkyFireITDIY/p/6243565.html
Copyright © 2011-2022 走看看