您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++中的函數概念有哪些”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C++中的函數概念有哪些”文章能幫助大家解決問題。
函數的定義不能嵌套但調用可以嵌套
在函數調用時,如某一默認參數要指明一個特定值,則有其之前所有參數都必須賦值
賦默認實參時 一旦某個形參被賦予了默認值,它后面的所有形參都必須有默認值,因為設置默認參數的順序是自右向左;且注意默認值不可以是局部變量
函數參數的默認值可以是表達式
如果在函數定義時設置了默認參數,則就不能在函數聲明時再次設置,反之亦然
函數只有一個 返回值,除void類型函數
函數調用可以出現在執行語句中,也可以出現在表達式中,甚至還可以作為一個函數的實參,但不可作為函數的形參,因為函數返回值存在寄存器中, 沒有地址, 不能作為形參
函數是一種特殊的數據類型,正確
當函數不是void類型且函數體內沒有return語句時,此時函數的返回值與返回類型相同但內容卻是隨機的一個值
C++所有的函數本質上都是外部函數(可延申至其他文件中使用),故extern關鍵字可省略
如果函數的形參是指向普通變量的指針變量,實參只能用指向普通變量的指針,不能用指向const變量的指針,反之則都可以用
當函數自變量個數不確定時,系統不自動檢測自變量
13. 函數三種傳參:
① 值傳遞:會為形參重新分配內存空間 ,將實參的值拷貝給形參,形參的改變不會影響實參的值,函數被調用結束后,形參被釋放。
② 地址的傳遞:形參為指針變量,將實參的地址傳遞給函數,可以在函數中改變實參的值。調用時為形參指針變量分配內存,結束時釋放指針變量。
③ 引用傳遞:不會為形參重新分配內存空間,形參只是實參的別名,形參的改變只會影響實參的值,函數調用結束后,形參不會被釋放。
建立自定義函數,調用時只需要明白函數的功能即可,故提高了程序的可讀性
sizeof 返回的值表示的含義如下(單位字節):
數組 —— 編譯時分配的數組空間大小;
指針 —— 存儲該指針所用的空間大小(存儲該指針的地址的長度,是長整型,應該為 4 );
類型 —— 該類型所占的空間大小;
對象 —— 對象的實際占用空間大小;
函數 —— 函數的返回類型所占的空間大小。函數的返回類型不能是 void
sizeof(float)是(整型)類型表達式
Math.floor() 表示向下取整,返回double類型
Math.ceil() 表示向上取整,返回double類型
Math.round() 四舍五入,返回int類型
用戶可以重載(不能重定義)標準庫函數,若如此,該函數將失去原有含義;但若已包含標準庫頭文件及相關命名空間,則系統不允許用戶重新定義標準庫函數,因為兩個相同作用域內的函數 如果除了返回值類型外 的函數要素都相同 那么編譯器會報重定義錯誤
函數返回值作為右值,被const修飾無效,故此時const相當于沒修飾
如果參數類型不一致,則函數調用時按形參類型隱式類型轉換實參
main函數默認返回一個int類型的值
將一個字符串傳遞到函數中,傳遞的是地址,則函數形參既可以用字符數組,又可以用指針變量
函數的返回值可以是引用類型且函數返回引用可以作為左值
函數的返回類型可以是結構體類型,這時函數將返回一個結構體對象
所有的函數在定義它的程序中都是可見的
預處理命令行不能以分號結尾
預處理命令行可以出現在程序的最后一行
預處理命令行作用域是從出現位置開始到源程序文件末尾
凡是以#號開頭的行,不一定都為編譯預處理命令行
在源文件的一行上不可以有多條預處理命令
預處理不做語法檢查
C++在編譯前由預處理器對預處理命令進行處理(故在編譯前被執行),編譯時進行語法分析
宏替換不占用程序的運行時間,只占編譯時間
內聯函數在運行時可調試,而宏定義不可以;
編譯器會對內聯函數的參數類型做安全檢查或自動類型轉換(同普通函數),而宏定義則不會;
內聯函數可以訪問類的成員變量,宏定義則不能;
在類中聲明同時定義的成員函數,自動轉化為內聯函數。
宏做的是簡單的字符串替換(注意是字符串的替換,不是其他類型參數的替換),而函數的參數的傳遞,參數是有數據類型的,可以是各種各樣的類型.
宏的參數替換是不經計算而直接處理的,而函數調用是將實參的值傳遞給形參,既然說是值,自然是計算得來的.
宏在編譯之前進行,即先用宏體替換宏名,然后再編譯的,而函數顯然是編譯之后,在執行時,才調用的.因此,宏占用的是編譯的時間,而函數占用的是執行時的時間.
宏的參數是不占內存空間的,因為只是做字符串的替換,而函數調用時的參數傳遞則是具體變量之間的信息傳遞,形參作為函數的局部變量,顯然是占用內存的.
函數的調用是需要付出一定的時空開銷的,因為系統在調用函數時,要保留現場,然后轉入被調用函數去執行,調用完,再返回主調函數,此時再恢復現場,這些操作,顯然在宏中是沒有的.
宏替換不占用程序的運行時間
宏與類型無關,但是c++中函數必須指定返回類型,故宏可以做函數不能做的事
1.函數模板的格式如下:
Template <class 形參名,class 形參名,......> 返回類型函數名(參數列表){函數體}
其中,class可以用typename關鍵字代替
函數模板調用時不需要顯式指定類型,系統自動匹配參數類型,若沒有合適的,會進行報錯。而類模板使用需要顯式指定類型,且對于函數模板注意要返回值和參數的類型一致
模板函數和普通函數都符合條件時,優先執行普通函數
模板特化:(當函數模板需要對某些類型進行特化處理,稱為函數模板的特化,類模板的特化同理)
① 因為很多時候,我們既需要一個模板能應對各種情形,又需要它對于某個特定的類型有著特別的處理,故出現了模板特化
① 特化整體上分為全特化和偏特化
② 全特化:就是模板中模板參數全被指定為確定的類型。 全特化也就是定義了一個全新的類型,全特化的類中的函數可以與模板類不一樣
③ 偏特化:模板中的模板參數沒有被全部確定,需要編譯器在編譯時進行確定
④ 對主版本模板類、全特化類、偏特化類的調用優先級從高到低進行排序是:全特化類>偏特化類>主版本模板類
⑤ 當函數調用發現有特化后的匹配函數時,會優先調用特化的函數,而不再通過函數模版來進行實例化
⑥ 模板特化相當于在聲明了類模板等后聲明需要模板特化然后讓接下來的代碼自己使用一個類型,故不能單獨使用,例;![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps386C.tmp.jpg)
5. 模板特化實現:template<> + 完全和模板類型沒有一點關系的類實現或者函數定義;
① 特化為絕對類型(全特化):例:template<>class Compare{...}; // 特化為float類型,此為函數模板特化;函數模板只能全特化,沒有偏特化
② 特化為引用,指針類型(半特化、偏特化):例:template struct iterator_traits<_Tp*> {};
③ 特化為另外一個類模板(偏特化):例:template class Compare<vector>{};
類模板的成員函數都是函數模板;沒使用過的成員函數(即函數模板)不會被實例化
函數模板必須由程序員實例化為可執行的函數
函數模板的虛擬類型名是在編譯階段確定實際類型的
使用重載函數編程序的目的是:使用相同的函數名調用功能相似的函數;使用方便,提高可讀性
重載函數的形參(個數或類型)必須不同
void x(int,char ch=’a’)與void x(int)可以在同一程序中定義,但不可以重載
1. 內聯(置)函數inline:
引入內聯函數的目的是為了解決程序中函數調用的效率問題;程序在編譯器編譯的時候,編譯器將程序中出現的內聯函數的調用表達式用內聯函數的函數體進行替換,而對于其他的函數,都是在運行時候才被替代。這其實就是個空間代價換時間的節省(弊:代碼被多次復制,增加了代碼量,占用更多的內存空間),故在當函數代碼較小并且被頻繁調用的時候。在使用內聯函數時要留神:
① 使用基類指針或引用來調用虛函數時,它都不能為內聯函數(因為調用發生在運行時)。但是,使用類的對象(不是指針或引用)來調用時,可以當做是內聯,因為編譯器在編譯時確切知道對象是哪個類的
② 默認情況下,在類體中定義的成員函數若不包括循環等控制結構,符合內聯函數要求時,C++會自動將它們作為內聯函數處理(不是所有成員函數都是內聯函數)
③ 內聯函數在編譯時是將該函數的目標代碼插入每個調用該函數的地方,不是運行時
④ 內聯函數在編譯時做參數類型檢查
⑤ 在內聯函數中不允許使用循環語句(for,while)和switch結果,帶有異常接口聲明的函數也不能聲明為內聯函數。另外,遞歸函數(自己調用自己的函數)是不能被用來做內聯函數的。內聯函數只適合于只有1~5行的小函數
⑥ 內聯函數的定義必須出現在內聯函數第一次調用之前
⑦ 定義內聯函數inline寫類型前面
⑧ 關鍵字inline 必須與函數定義體放在一起才能使函數成為內聯,僅將inline 放在函數聲明前面不起任何作用
⑨ 如果在類外定義inline函數,則必須將類定義和成員函數定義放在同一頭文件中,否則編譯時無法進行置換
⑩ 頭文件中不僅要包含 inline 函數的聲明,而且必須包含定義,且在定義時必須加上 inline
? 不管是 class 聲明中定義的 inline 函數,還是 class 實現中定義的 inline 函數,不存在優先不優先的問題
? 內置函數不需要使用堆棧進行現場的保護與恢復
? 用 inline 修飾的函數原型其對應的函數也將成為內聯函數 - 錯(自己理解:inline為建議型關鍵字)
? 內聯函數可以是靜態的
關于“C++中的函數概念有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。