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()};
}
編譯器會我們省掉一些多余的結構函數與析構函數的調用。
什麼時分該運用值傳遞?什麼時分該運用援用傳遞?這次要取決於詳細的需求。但是相對不要前往一個部分變量的指針或援用,也不要前往一個部分靜態變量的指針或援用。