函式返回值是乙個類物件時,有以下幾種選擇:
1,返回物件或者物件的引用 2,它們是const的or not
1,返回物件的const引用,舉例:
#include #include using namespace std;
class complx //建構函式
complx(double r, double i): real(r), imag(i) {}//帶引數的建構函式
complx operator+(const complx & c) const
complx & operator=(const complx &c;)
friend ostream& operator<<(ostream &os;, const complx &c;);
double size() const
};ostream & operator<<(ostream &os;, const complx & c)
/*方式1,直接返回類物件
complx maximum(const complx &c1;, const complx &c2;)
*///方式二,返回類物件的引用
const complx & maximum(const complx &c1;, const complx &c2;)
int main( )
得到以下結果:
c1 = (10,30)
c2 = (13,25)
maximum(c1,c2) = (10,30)
(20,40) got its value from c3
c6 (c1+c2) = (23,55)
上面的方式12都可以,我們用的方式2.因為用引用省去了拷貝(即呼叫拷貝建構函式)的過程。(返回值型別是引用:那就返回物件的引用;返回值型別直接是類物件:返回的是物件的副本。所以用引用會效率高一些,不用拷貝)另外,因為我們的引數使用的是const型的引用,所以返回值也是const型的,以匹配。(這句話我沒懂,為什麼返回值非得匹配呢)
2,返回物件的非cons引用
這種用法常見於過載賦值操作符=,和流操作符<<,過載它們,其實返回物件或物件引用都行,引用好一些。關於這部分,建議複習一下操作符過載。
比如鏈式的賦值:
complx c3 (20,40);
complx c4,c5;
c5 = c4 = c3;
c4=c3也就是c4.operator=(c3)也就是operator=(complx &c4,complx &c3)也就是
complx &operator=(complx &c4,complx &c3)
被賦給c5。這個例子裡返回值型別就不是const的,因為c4是要被改變的。
鏈式的輸出:
cout << c4 << " got its value from c3" << endl;
cout<
3,返回類物件
如果返回的物件是所呼叫函式的區域性物件,那它就不應該被以引用的方式返回,因為在這個函式呼叫結束的時候區域性物件會自動消除,所以不用我們管。也因此,我們絕對不能返回乙個區域性物件的引用,因為函式呼叫完的時候它已經不存在了。
舉例:
const complx &complxreturn;(const complx & c)
這裡complxobj就是乙個區域性變數,我們想得到它,只能返回它的拷貝,不能返回引用。
4,返回const類物件
通常,不建議用
const
修飾函式的返回值型別為某個物件或對某個物件引用的情況。
原因如下:如果返回值為某個物件為
const
(const a test = a
例項)或某個物件的引用為
const
(const a& test = a
例項) ,則返回值具有
const
屬性,則返回例項只能訪問類
a中的公有(保護)資料成員和
const
成員函式,並且不允許對其進行賦值操作,這在一般情況下很少用到。
總結:1,如果函式返回的是區域性變數,那麼返回值型別不能是引用或指標。
2,如果函式返回的是類物件,但是該類沒有public的拷貝建構函式,比如ostream類,那就返回引用。
3,有的函式,比如過載的=,可以返回物件也可以返回引用,引用比較好,因為效率高。
再總結:除了返回區域性物件,一般都是返回引用。
(寫的比較亂,還會再改)
C 類成員函式返回類的物件
1.類成員函式臨時物件 2.類成員函式返回持久物件 3.類成員函式返回指標 類成員函式返回類的物件 include include using namespace std class a str1 無參構造str1 str2 無參構造str2 cout 無參構造呼叫 void setarr a in...
C 返回物件
使用const引用的常見原因在於提高效率。方式1vector max const vector v1,const vector v2 方式2 const vector max const vector v1,const vector v2 這裡需要注意三點 首先,返回物件將會呼叫複製建構函式,而返回...
C 返回物件和返回引用
最大的區別在於,返回物件的話會在記憶體中根據返回的型別開闢一塊區域,用返回的值對該記憶體進行初始化,如果是返回的物件,利用拷貝構造來初始化這個區域,但是這塊區域並沒有名字,就是說之後使用者沒辦法訪問到這個區域,也成為無名變數,它只能在接下來的 中進行一次性的用途,要不作為引數傳遞,或者將值列印,再之...