第三課 函式的公升級(上)

2021-07-28 04:43:00 字數 2197 閱讀 1182

常量與巨集回顧

c++中const常量可以替代巨集常數定義,如:const int a=3;->#define a 3;

c++中是否有解決方案替代巨集**片段呢?

替代巨集片段就可以避免巨集的***!

內聯函式

(1)c++中推薦使用內聯函式替代巨集**片段;

(2)c++中使用inline關鍵字宣告內聯函式;

inline int func(int a,int b)

內聯函式宣告時inline關鍵字必須和函式定義結合在一起,否則編譯器會直接忽略內聯請求。

編譯器會將內聯函式的內部直接插入到函式呼叫的地方。

內聯函式比巨集**安全,沒有***。

內聯函式

(1)c++編譯器可以將乙個函式進行內聯編譯;

(2)被c++編譯器內聯編譯的函式叫做內聯函式;

(3)內聯函式在最終生成的**中是沒有定義的;

(4)c++編譯器直接將函式體插入函式呼叫的地方;

(5)內聯函式沒有普通函式呼叫時的額外開銷(壓棧、跳轉、返回)。

c++編譯器不一定准許函式的內聯請求!!會當成普通函式處理。

(1)內聯函式是一種特殊的函式,具有普通函式的特徵(引數檢查,返回型別等);

(2)內聯函式是一種對編譯器的請求,因此編譯器可能拒絕這種請求;

(3)內聯函式由編譯器處理,直接將編譯後的函式體插入呼叫的地方;

巨集**片段由預處理器處理,進行簡單的文字替換,沒有任何編譯過程。

(4)現代c++編譯器能夠進行編譯優化,因此一些函式即使沒有inline宣告,也可能對編譯器內聯編譯;

(5)另外,一些現代c++編譯器提供了拓展語法,能夠對函式進行強制內聯,如:g++中的_attribute_((always_inline))屬性。

內聯函式限制

c++中對內聯函式的限制

(1)不能存在任何形式的迴圈語句;

(2)不能存在過多的條件判斷語句;

(3)函式體不能過於龐大;

(4)不能對函式進行取址操作;一旦進行取址操作,編譯器將拒絕函式進行內聯。

(5)函式內聯宣告必須在呼叫語句之前;

編譯器對於內聯函式的限制並不是絕對的,內聯函式相對於普通函式的優勢只是省去了函式呼叫時的壓棧、挑戰和返回的開銷。因此,當函式體 的執行開銷遠大於壓棧、跳轉和返回所用的開銷時,那麼內聯將毫無意義。

函式預設引數

(1)c++中可以在函式宣告時為引數提供了乙個預設值,當函式呼叫時沒有指定這個引數的值,編譯器會自動用預設值代替。

int mul(int x=0);//宣告時指定預設引數值

(2)只有引數列表後面部分的引數才可以提供預設引數值,一旦在乙個函式呼叫中開始使用預設引數值,那麼這個引數後的所有引數都必須使用預設引數值。

int add(int a ,int b=0,int c=0)

(3)在c++中可以為函式提供佔位引數

站位引數只有引數型別宣告,而沒有引數名宣告;

一般情況下,在函式體內部無法使用佔位引數;

int func(int a,int b,int)

在呼叫這個函式的時候必須提供三個實參。

c++支援這樣的函式佔位引數有什麼意義?

可以將佔位引數和預設引數結合起來使用。意義:為以後程式的擴充套件留下線索,相容c語言程式中可能出現的不規範寫法

int func(int a,int b,int = 0)

小結(1)c++中可以通過inline宣告內聯函式

(2)內聯函式在編譯時直接將函式體插入函式呼叫的地方

(3)inline只是一種請求,編譯器不一定允許這種請求

(4)內聯函式省去了普通函式呼叫時的壓棧、跳轉和返回時的開銷

(5)c++中在宣告函式的時候指定引數的預設值

(6)c++可以宣告佔位符引數,佔位符引數一般用於程式擴充套件和對c**相容。

python第三課答案 python第三課

字串操作 s alexwusir s1 s.capitalize 首字母大寫 print s1 全大寫,全小寫 s2 s.upper s21 s.lower print s2,s21 大小寫翻轉 s3 s.swapcase print s3 每個隔開 特殊字元或數字 的單詞首字母大寫 s alex ...

python第三課答案 python第三課筆記

以下哪個變數的命名不正確?為什麼?a mm 520 b mm520 c 520 mm d 520 mm 答 c不正確,不能數字開頭 在不上機的情況下,以下 你能猜到螢幕會列印什麼內容嗎?myteacher 小甲魚 yourteacher myteacher yourteacher 黑夜 print ...

python第三課答案 python第三課

1.迴圈物件,主要呼叫next 2.迭代器iterator 在理解上可以和迴圈物件理解為乙個東西。3.生成器 generator 自定義的迴圈物件。4.表推導 list comprehension 是快速生成表的方法。表推導用中括號。l x 2 for x in range 10 練習 f open...