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()};

}

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

 

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

posted @ 2017-01-03 21:51  SkyFireITDIY  阅读(304)  评论(0编辑  收藏  举报