11 21 位操作 函式過載 引用 內聯函式

2021-10-10 20:44:02 字數 2782 閱讀 9464

1.操作符優先順序

單目運算子》雙目運算子》移位》大與小

2.移位操作

邏輯移位和算術移位

邏輯移位:針對的是無符號型別的資料

左移:丟棄最高位,低位補0

右移:丟棄最低位,高位補0

算術移位:針對的是有符號型別的資料

左移:丟棄最高位,低位補0

右移:丟棄最低位,如果該數字是正數高位補0,如果是負數高位補1

3.預設引數

(1)概念:在宣告或定義函式時,給函式的引數設定乙個預設值,當使用者對函式進行呼叫時,如果傳遞了實參,則使用使用者傳遞的實參;如果沒有傳遞則使用預設值,例子:備胎

(2)分類:

全預設引數—所有引數都帶有預設值

半預設引數—部分引數帶有預設值–規則:必須從右往左依次給出

(3)特性

~預設引數必須從右往左給出

~不能在函式宣告和定義的位置同時給出

~預設引數在提供時–常量||全域性變數

~c語言不支援

4.函式過載呼叫原理:編譯器在編譯**期間,需要對函式的實參型別進行推演,根據推演的結果選擇對應合適型別的函式進行呼叫。

**注意:**有該函式存在則直接呼叫,如果不存在型別完全匹配的函式,則編譯器會嘗試進行隱式型別轉換,轉換完成後,如果有對應型別的函式則進行呼叫,否則,編譯失敗

(3)底層實現原理

c和c++命名規則

c語言:只是在函式名字前加_,c語言不支援函式過載

c++:例如如下函式中

int

add(

int left,

int right)

在vs下命名規則為?add@@yahhh@z,其中add為函式名,hhh為int型別,nnn為

double型別

(4)extern"c"

在乙個c++工程中呼叫別人採用c語言寫的第三方庫

作用:告訴編譯器,將**按照c語言的風格進行處理

5.引用

(1)概念

引用是乙個別名,不是新定義乙個變數,編譯器不會給引用變數重新分配空間,引用變數與其引用的實體公用同乙份記憶體空間

例子:別名

(2)特性

引用變數在定義時必須要初始化

乙個變數可以有多個引用----乙個人可以有多個別名

引用變數一旦引用乙個實體之後,就不能再去引用其他的實體

(3)三種傳參方式區別

傳值優點:可以對外部實參起到保護作用

缺點:不能通過形參改變外部的實參(因為形參是實參的乙份拷貝,在函式體中修改形參實際修改的是實參的乙份拷貝),傳參的效率低下,而且浪費空間

傳引用:形參是實參的別名—對形參進行修改可以達到對實參的改變,對於不需要通過形參改變外部實參:const,傳參效率高,節省空間,**可讀性高

**注意:**在c++中,一般情況下傳參時盡量使用引用

內建型別:

如果需要通過形參改變外部的實參—優先使用引用

如果不需要通過形參改變外部的實參—傳值,傳引用+const

自定義型別:傳參都使用引用—>t&和const t&

6.指標和引用的區別

實現引用技術:指標方式來實現的

說明:引用和指標在底層實現方式是完全相同的,引用就是按照指標的方式來實現的

從底層實現上看:沒有任何區別

(2)在概念和特性以及使用方式上:

~引用概念上定義乙個變數的別名,指標儲存乙個變數位址

~引用在定義時必須初始化,指標沒有要求

~引用在初始化時引用乙個實體後,就不能再引用其他實體,而指標可以在任何時候指向任何乙個同型別實體

~沒有null引用,但有null指標

~在sizeof中含義不同:引用結果為引用型別的大小,但指標始終是位址空間所佔位元組個數

~引用自加即引用的實體增加1,指標自加即指標向後偏移乙個型別的大小

~有多級指標,但是沒有多級引用

~訪問實體方式不同,指標需要顯式解引用,引用編譯器自己處理

~引用比指標使用起來相對更安全

7.巨集的優缺點

(1)巨集常量

優點:一改全改,常量名字具有一定的含義

缺點:巨集常量沒有型別的—不會參與到型別檢測中—**的安全性降低,而且一旦編譯報錯,報錯的位置不準確

(2)巨集函式

優點:巨集函式不是乙個真正的函式,在預處理階段,預處理器已經將巨集函式採用巨集體進行替換了,少了函式呼叫引數壓棧,開闢棧幀,返回等的開銷了,**的執行效率提高

缺點:~在實現時,可能會比較麻煩,要匯出加括號

~巨集函式也沒有引數型別–不會有引數型別檢測–安全性不高

~巨集函式在預處理階段會展開–不能除錯

~巨集函式具有***

注意:

c++如何解決巨集的缺陷

~巨集常量—const常量:可以達到巨集替換的效果–而且具有型別,更加安全

~巨集函式—內聯函式

內聯函式:在c++中被inline關鍵字修飾的函式稱為內聯函式,如果成員函式在類中定義,編譯器也可能會將其當成內聯函式來處理

特性:在編譯階段,如果編譯器將乙個函式當成是內聯函式的情況下,在編譯**時會對內聯函式進行展開,少了函式呼叫的開銷,程式的執行效果提高了

inline:是乙個建議性的關鍵字,當修飾函式時,建議編譯器將該函式當成內聯函式來進行處理,即:在編譯階段,將該函式展開

inline函式具有檔案作用域

函式過載 引用 內聯函式

預設引數 在定義或者宣告乙個函式的時候,給它的形參賦上乙個預設值,呼叫這個函式的時候,如果沒有把實參傳入,函式就會使用我們指定的預設引數,如果傳入實參,就會使用傳入的引數。預設引數可分為 全預設引數 在這個函式中,給所有的形參都指定了預設值。半預設引數 在這個函式中,只給一部分的形參指定了預設值。注...

C 函式過載 引用 內聯函式

2 函式過載 3 引用 4 內聯函式 在宣告或定義函式時,給函式的引數設定乙個預設值,當使用者對函式進行呼叫時,如果傳遞了實參,則使用使用者傳遞的實參 如果沒有傳遞則使用預設值。預設引數必須從右往左給出 不能在函式宣告和定義的位置同時給出 預設引數在提供時 常量 全域性變數 c語言不支援。相同作用域...

C 命名空間 函式過載 引用 內聯函式

c 關鍵字 c 98 有63個 命名空間解決了 名字衝突,有作用域的作用 命名空間的使用格式 namespace n1使用方法 1.n1 變數 2.using n1 變數 3.using namespace n1 c 的輸入輸出 標頭檔案 iostream 命名空間 using namespace ...