使用應用可以大幅減少構造函數與析構函數的調用次數,但是引用不可以濫用。
如下:
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()};
}
編譯器會我們省掉一些多余的構造函數與析構函數的調用。
什麼時候該使用值傳遞?什麼時候該使用引用傳遞?這主要取決於具體的需求。但是絕對不要返回一個局部變量的指針或引用,也不要返回一個局部靜態變量的指針或引用。