分類: 基礎程式設計
2009-10-11 20:55
2601人閱讀收藏
舉報c++
string
float
編譯器儲存
reference
1.有時候返回引用可以提高效率,有些情況不能返回引用
類的賦值運算子函式中,返回物件的引用可以顯著提高效率。
[cpp]view plain
copy
class
string
string & string::operate=(const
string &other)
上面如果用「值傳遞」的方式,雖然功能仍然正確,但由於return語句要把 *this拷貝到儲存返回值的外部儲存單元之中,增加了不必要的開銷,降低了賦值函式的效率。
string的相加函式operate + 的實現如下:
[cpp]view plain
copy
string operate+(
const
string &s1,
const
string &s2)
對於相加函式,應當用「值傳遞」的方式返回string物件。如果改用「引用傳遞」,那麼函式返回值是乙個指向區域性物件temp的「引用」。由於temp在函式結束時被自動銷毀,將導致返回的「引用」無效。
設想一下,相加運算子過載函式應該是引數列表中的兩個物件相加,必須產生乙個新的物件並返回它。這區別於+=運算子,+=運算子是將右邊的物件累加到左邊的物件上,因此+=的實現應當返回運算子左邊物件的引用。
2. 返回靜態區域性變數的引用往往會帶來問題
上面已經說了operator+函式中不能返回臨時物件的引用,那麼返回靜態區域性變數的引用呢?靜態區域性變數的生命不會隨著函式消失而結束,返回其引用似乎可行,但這樣做往往會給程式帶來問題。
[cpp]view plain
copy
const
rational& operator*(
const
rational& lhs,
const
rational& rhs)
下面if恒為真,靜態區域性變數對全域性可見,每次operator*返回的是它的引用,相當於是返回它的「新值」。
[cpp]view plain
copy
bool
operator==(
const
rational& lhs,
const
rational& rhs);
// an operator== for rationals
rational a, b, c, d;
...
if((a * b) == (c * d))
else
3. 返回臨時物件,不要定義區域性物件返回
string temp(s1 + s2);
return temp;
上述**將發生三件事。首先,temp物件被建立,同時完成初始化;然後拷貝建構函式把temp拷貝到儲存返回值的外部儲存單元中;最後,temp在函式結束時被銷毀(呼叫析構函式)。然而,建立乙個臨時物件並返回它:return temp(s1 + s2);,編譯器直接把臨時物件建立並初始化在外部儲存單元中,省去了拷貝和析構的化費,提高了效率。
由於內部資料型別如int,float,double的變數不存在建構函式與析構函式,雖然該「臨時變數的語法」不會提高多少效率,但是程式更加簡潔易讀。
4. 注意不要返回棧指標和常量字串
不要用return語句返回指向「棧記憶體」的指標,因為該內存在函式結束時自動消亡。
[cpp]view plain
copy
char
*getstring(
void
)
void
test4(
void
)
函式test5執行雖然不會出錯,但是函式getstring2的設計概念卻是錯誤的。因為getstring2內的「hello world」是常量字串,位於靜態儲存區,它在程式生命期內恆定不變。無論什麼時候呼叫getstring2,它返回的始終是同乙個「唯讀」的記憶體塊。
[cpp]view plain
copy
char
*getstring2(
void
)
void
test5(
void
)
5. 謹慎返回物件內部成員物件的引用
有時候希望使得類物件占用空間較小,通常可以使用乙個指向物件資料的指標作為該類的資料成員,如rectangle類的成員指標pdata。類的成員函式upperleft和lowerright僅僅是想獲取類的資料內容而不想修改其內容,因此函式結尾使用了const表示類的資料成員不可更改。然而卻不能達到設計的目的,雖然成員是私有,然而卻通過公有函式返回了可以修改它的引用。如可以這樣修改它:rectangle r(&rd); r.upperleft().setx(5);
[cpp]view plain
copy
class
point
void
setx(
float
f)
void
sety(
float
f)
private
: float
x, y;
};
struct
rectdata
point ulhc, lrhc;
};
class
rectangle
point& upperleft() const
point& lowerright() const
private
: rectdata *pdata;
};
因此需要將兩函式改為,這樣想試圖修改點的資料內容時,編譯器會報錯。
[cpp]view plain
copy
const
point& upperleft()
const
const
point& lowerright()
const
effective c++
高質量 c/c++ 程式設計指南
C 函式返回值。
一 params.可變引數,無論有幾個引數,必須出現在引數列表的最後,可以為可變引數直接傳遞乙個對應型別的陣列。class program test msg intarry static void test string msg,params int args 二 ref 引用傳遞 三 out ou...
主函式的返回值返回給誰 主函式返回值
responsebody報406 原因是 要返回的物件沒有setget方法sdfsdf 自定義視 析器和缺省視 析器需同時使用才好用 如果以redireci或forward字首,那麼 走缺省視 析器 return redirect index.jsp return forward index 需寫全...
函式返回值
這裡接著探求被調函式的返回值是如何傳遞到主調函式中的,下面為c程式。add函式通過直接返回a b的,而add1函式先定義乙個區域性變數c,儲存a b的值,然後再返回c的值。其中a b可以當成乙個臨時變數,其結果是暫時存放在暫存器中的 eax 參照反匯程式設計序,可以看出函式的值並不是通過壓棧 基址定...