過載和內聯

老司機的詩和遠方發表於2020-04-06

過載

函式過載的話意味著一個函式有多個同名形式。通過引數的不同來辨別,C++區別不同的同名函式靠的就是引數,而返回值是無法辨別因為呼叫一個函式的時候我們不一定會用它的返回值。

當心隱式型別轉換導致過載函式產生二義性
這裡寫圖片描述
當output寫0.5的時候,編譯器不知道該將0.5轉換成int還是float型別引數。

成員函式過載、覆蓋與隱藏
成員函式的過載、覆蓋與隱藏很容易混淆。
(1)過載和覆蓋
成員函式被過載的特徵:
<1>相同的範圍(同一個類中)
<2>函式名字相同
<3>引數不同
<4>virtual關鍵字可有可無。
覆蓋是指派生類函式覆蓋基類函式,特徵是:
<1>不同的範圍,分別位於派生類與基類
<2>函式名字相同
<3>引數相同
<4>基類函式必須有virtual關鍵字
(2)令人迷惑的隱藏規則
這裡的隱藏是指派生類的函式遮蔽了與其同名的基類函式,規則如下:
<1>如果派生類的函式與基類的函式同名,但是引數不同,此時不論有無virtual關鍵字,基類的函式將就隱藏!
<2>如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關鍵字,此時基類的函式被隱藏

引數的預設值
(1)引數預設值只能出現在函式的宣告中,而不能出現在定義體中。規定在申明好處就是修改方便,使用者容易得知。
(2)如果函式有多個引數,引數只能從後向前挨個兒預設,否則將導致函式呼叫語句怪模怪樣。引數的預設值將可能導致過載函式產生二義性。

不能被過載的運算子
(1)不能改變C++內部資料型別,如int,float
(2)不能過載‘.’,因為‘.’在類中任何成員都有意義,已經成為標準用法。
(3)不能過載目前C++運算子集合中沒有的符號,@#等,難以理解同時難以確定優先順序。
(4)已經存在的運算子進行過載時,不能改變優先順序規則,否則將引起混亂。

函式內聯

(1)用行內函數取代巨集程式碼,C++支援內聯,其目的是為了提高函式的執行效率。
(2)行內函數關鍵字inline必須與函式定義體放在一起才能使函式成為內聯。

慎用內聯
既然內聯可以提高效率,為何不把所有的函式定義成為行內函數。當然是不行的!
內聯是以程式碼膨脹複製為代價,僅僅省去了函式呼叫的開銷。從而提高效率。因此要是每一處都做行內函數,那麼將使得程式總程式碼量增大,消耗更多的記憶體空間,一下情況不宜使用內聯:
(1)如果函式體內的程式碼比較長,使用內聯將導致記憶體消耗代價較高。
(2)如果函式體內出現迴圈,那麼執行函式體內程式碼的時候要比函式呼叫的開銷大。

相關文章