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

EC筆記:第4局部:21、必需前往對象時,別前往援用

編輯:關於C++

EC筆記:第4局部:21、必需前往對象時,別前往援用。本站提示廣大學習愛好者:(EC筆記:第4局部:21、必需前往對象時,別前往援用)文章只能為提供參考,不一定能成為您想要的結果。以下是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()};

}

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

 

什麼時分該運用值傳遞?什麼時分該運用援用傳遞?這次要取決於詳細的需求。但是相對不要前往一個部分變量的指針或援用,也不要前往一個部分靜態變量的指針或援用。

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