程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> EC筆記:第4部分:21、必須返回對象時,別返回引用,ec筆記

EC筆記:第4部分:21、必須返回對象時,別返回引用,ec筆記

編輯:C++入門知識

EC筆記:第4部分:21、必須返回對象時,別返回引用,ec筆記


使用應用可以大幅減少構造函數與析構函數的調用次數,但是引用不可以濫用。

如下:

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

}

編譯器會我們省掉一些多余的構造函數與析構函數的調用。

 

什麼時候該使用值傳遞?什麼時候該使用引用傳遞?這主要取決於具體的需求。但是絕對不要返回一個局部變量的指針或引用,也不要返回一個局部靜態變量的指針或引用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved