zoukankan      html  css  js  c++  java
  • EC笔记:第4部分:21、必须返回对象时,别返回引用

    使用应用可以大幅减少构造函数与析构函数的调用次数,但是引用不可以滥用。

    如下:

    struct St {

        int a;

    };

     

    St &func(){

        St t;

        return t;

    }

    在返回t以后,t会被销毁,但是它的引用还在外面被使用,这样的操作是不可预料的。

    那么,我们返回一个指针如何?

    struct St {

        int a;

    };

     

    St*& func(){

        St *t=new St;

        return t;

    }

    这样,从语法角度上来说没有问题,但是,在堆上分配的内存该有谁释放呢???

    那么,再试试静态变量:

    struct St {

        int a;

    };

     

    St& func(){

        static St t;

        return t;

    }

    这样会存在什么问题呢?

    问题就是,某些调用下可能得不到正确的结果:

    例如我们对此程序做一下修改:

    #include <iostream>

    #include <cstdlib>

     

    using namespace std;

     

    struct St {

        int a;

    };

     

    St& func(){

        static St t;

        t.a=rand();

        return t;

    }

     

    int main(int argc, char *argv[]) {

        St &t=func();

        cout<<t.a<<endl;

        func();

        cout<<t.a<<endl;

    }

     

    输出的结果是:

    41

    18467

    我们没有对t,使用赋值操作,但是t的值却变了。这是因为这里的t相当于一个全局变量,我们再次调用func()时,就会改变t的值。

    那么看来只能返回值了:

    struct St {

        int a;

    };

     

    St func(){

        St t;

        t.a=rand();

        return t;

    }

     

    但是这样并不好,会多次调用构造和析构函数。怎样做到效率高而且又正确呢?

    struct St {

        int a;

    };

     

    St func(){

        return St{rand()};

    }

    编译器会我们省掉一些多余的构造函数与析构函数的调用。

     

    什么时候该使用值传递?什么时候该使用引用传递?这主要取决于具体的需求。但是绝对不要返回一个局部变量的指针或引用,也不要返回一个局部静态变量的指针或引用。

  • 相关阅读:
    汇编(一)续
    汇编(一)
    Ubuntu 安装配置Dosbox
    Linux系统安装Dos系统(虚拟机里装)
    .bundle文件如何安装
    Linux(Fedora)系统下配制8086汇编环境
    Linux常用命令
    linux下安装nginx
    缓存雪崩、缓存穿透、缓存击穿是什么?如何解决?
    Maven 实战
  • 原文地址:https://www.cnblogs.com/SkyFireITDIY/p/6246599.html
Copyright © 2011-2022 走看看