過載和內聯
過載
函式過載的話意味著一個函式有多個同名形式。通過引數的不同來辨別,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)如果函式體內出現迴圈,那麼執行函式體內程式碼的時候要比函式呼叫的開銷大。
相關文章
- 塊狀元素、內聯元素和內聯塊狀元素
- C++ 過載運算子和過載函式C++函式
- HTML 塊級元素和內聯元素HTML
- 塊級、內聯、內聯塊級
- 內聯和巢狀名稱空間巢狀
- 指標運算子過載(* 和 ->)指標
- 開心檔之C++ 過載運算子和過載函式C++函式
- 內聯元素和塊級元素相互轉換
- nameko 的內聯繫結和 Dependency 解讀
- springboot引導上下文載入過程和配置載入過程Spring Boot
- 過載和重寫的區別
- C++ 函式過載和模板C++函式
- Java中的過載和重寫Java
- iframe內聯框架框架
- 聯絡網際網路和汽車的紐帶:國內車載小程式市場現狀和發展趨勢
- 下拉表關聯非同步載入- 引數動態過濾非同步
- Python中有重寫和過載的方法嗎?Python
- C++之過載覆蓋和隱藏C++
- 物聯網的演變,物聯網的過去、現在和未來
- C++ 函式過載,函式模板和函式模板過載,選擇哪一個?C++函式
- 內聯元素與流
- GCC 內聯彙編GC
- ios和android內嵌h5頁面聯調小結iOSAndroidH5
- 可以給內聯元素設定寬和高嗎?為什麼?
- 過載的奧義之函式過載函式
- CSS塊級/內聯元素CSS
- C++——內聯,友元C++
- 內聯的優缺點
- Java中的方法內聯Java
- 64位內聯彙編
- javaScript過載JavaScript
- Admaster:2019社交和內容趨勢觀察(附下載)AST
- @Validated和@Valid的區別?校驗級聯屬性(內部類)
- Linux shell指令碼中內聯輸入 <<- EOF和 <<EOF的區別Linux指令碼
- C++過載的奧義之運算子過載C++
- 過載(Overload)和重寫(Override)的區別。過載的方法能否根據返回型別進行區分IDE型別
- pip安裝python庫時使用國內映象資源加速下載過程Python
- C++行內函數、函式過載與函式預設引數C++函數函式