Posted on 2007-08-13 10:21
寶杉 閱讀(214)
評論(0) 編輯 收藏 引用 所屬分類:
C++
缺省值
提高程序易用性,避免每次調用函數(shù)參數(shù)都相同的情況。
缺省值只能出現(xiàn)在函數(shù)聲明中,不能在函數(shù)定義中。
兩個原因:
一是函數(shù)的實現(xiàn)(定義)本來就與參數(shù)是否有缺省值無關,所以沒有必要讓缺省值出現(xiàn)在函數(shù)的定義體中。
二是參數(shù)的缺省值可能會改動,顯然修改函數(shù)的聲明比修改函數(shù)的定義要方便。
規(guī)則:參數(shù)從后向前缺省
正確的示例如下:
void Foo(int x, int y=0, int z=0);
錯誤的示例如下:
void Foo(int x=0, int y, int z=0);
但要避免二義性
C++exams\default_para
運算符重載及其規(guī)則
運算符即可定義為成員函數(shù),也可定義為全局函數(shù)。
規(guī)則如下:
運算符
|
規(guī)則
|
所有的一元運算符
|
建議重載為成員函數(shù)
|
= () [] ->
|
只能重載為成員函數(shù)
|
+= -= /= *= &= |= ~= %= >>= <<=
|
建議重載為成員函數(shù)
|
所有其它運算符
|
建議重載為全局函數(shù)
|
不能重載的運算符
(1)不能改變C++內部數(shù)據(jù)類型(如int,float等)的運算符。
(2)不能重載‘.’,因為‘.’在類中對任何成員都有意義,已經(jīng)成為標準用法。
(3)不能重載目前C++運算符集合中沒有的符號,如#,@,$等。原因有兩點,一是難以理解,二是難以確定優(yōu)先級。
(4)對已經(jīng)存在的運算符進行重載時,不能改變優(yōu)先級規(guī)則,否則將引起混亂。
函數(shù)內聯(lián)
目的:提高執(zhí)行效率。
宏
Q為什么要用?
A提高執(zhí)行效率。
Q如何提高?
A宏代碼本身不是函數(shù),但使用起來象函數(shù)。預處理器用復制宏代碼的方式代替函數(shù)調用,省去了參數(shù)壓棧、生成匯編語言的CALL調用、返回參數(shù)、執(zhí)行return等過程,從而提高了速度。
Q缺點?
使用宏代碼最大的缺點是容易出錯,預處理器在復制宏代碼時常常產生意想不到的邊際效應。
例如:
#define MAX(a, b) (a) > (b) ? (a) : (b)
語句
result = MAX(i, j) + 2 ;
將被預處理器解釋為
result = (i) > (j) ? (i) : (j) + 2 ;
由于運算符‘+’比運算符‘:’的優(yōu)先級高,所以上述語句并不等價于期望的
result = ( (i) > (j) ? (i) : (j) ) + 2 ;
如果把宏代碼改寫為
#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
則可以解決由優(yōu)先級引起的錯誤。但是即使使用修改后的宏代碼也不是萬無一失的,例如語句result = MAX(i++, j);
將被預處理器解釋為
result = (i++) > (j) ? (i++) : (j);
對于C++ 而言,使用宏代碼還有另一種缺點:無法操作類的私有數(shù)據(jù)成員。