c++primer第6章函數(shù)-創(chuàng)新互聯(lián)

文章目錄
  • 第6章 函數(shù)
    • 6.1 函數(shù)基礎(chǔ)
      • 6.1.1 局部對象
      • 6.1.2 函數(shù)聲明
      • 6.1.3 分離式編譯
    • 6.2 參數(shù)傳遞
      • 6.2.1 傳值參數(shù)
      • 6.2.2 傳引用參數(shù)
      • 6.2.3 const形參和實參
      • 6.2.4 數(shù)組形參
      • 6.2.5 main處理命令行選項
      • 6.2.6 含可變形參的函數(shù)
    • 6.3 返回類型和return語句
      • 6.3.1 無返回值函數(shù)
      • 6.3.2 有返回值函數(shù)
      • 6.3.3 返回數(shù)組指針
    • 6.4 函數(shù)重載
      • 6.4.1 重載與作用域
      • 6.5 特殊用途語言特性
      • 6.5.1 默認實參
      • 6.5.2 內(nèi)聯(lián)函數(shù)和constexpr函數(shù)
      • 6.5.3 調(diào)試幫助
    • 6.6 函數(shù)匹配
      • 6.6.1 實參類型轉(zhuǎn)換
    • 6.7 函數(shù)指針
    • 小結(jié)
    • 術(shù)語表

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:主機域名、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、秦州網(wǎng)站維護、網(wǎng)站推廣。第6章 函數(shù)
  • 函數(shù)定義和聲明(函數(shù)傳參/返回值/重載(調(diào)用匹配)/函數(shù)指針)
  • 函數(shù) 命名了的代碼塊 可以有0/多個參數(shù) 通常產(chǎn)生一個結(jié)果 可以重載
6.1 函數(shù)基礎(chǔ)
  • 函數(shù)定義:返回類型、函數(shù)名字和0個或者多個形參組成的列表以及函數(shù)體
  • 調(diào)用運算符:調(diào)用運算符的形式是一對圓括號,它作用于一個表達式,該表達式是函數(shù)或者指向函數(shù)的指針,圓括號之內(nèi)是用逗號隔開的實參列表,用實參初始化函數(shù)的形參
  • 編寫函數(shù)
  • 調(diào)用函數(shù)
      1. 用實參初始化函數(shù)對應(yīng)的形參
      1. 將控制權(quán)轉(zhuǎn)移給被調(diào)用函數(shù)
    • 主調(diào)函數(shù)執(zhí)行被中斷,被調(diào)函數(shù)開始執(zhí)行
    • return語句:
        1. 返回return語句中的值
        1. 將控制權(quán)從被調(diào)函數(shù)轉(zhuǎn)移回主調(diào)函數(shù)
  • 形參和實參
    • 實參是形參的初始值(沒有規(guī)定實參的求值順序)
    • 實參的類型必須與對應(yīng)的形參類型匹配(實參數(shù)目)
  • 函數(shù)的形參列表
    • 可以為空 但不能省略
    • 形參列表中的形參用逗號隔開 每個形參都是含有一個聲明符的聲明
    • 任意形參不能同名,函數(shù)最外層作用域局部變量也不能與形參同名
    • 形參名可選 但必須為它提供一個實參
  • 函數(shù)返回類型
    • 返回類型不能是數(shù)組類型或者函數(shù)類型,但可以是指向數(shù)組或者函數(shù)的指針
6.1.1 局部對象
  • 名字作用域:程序文本一部分,名字在其中可見
  • 對象生命周期:程序執(zhí)行過程中對象存在的一段時間
  • 局部變量:形參和函數(shù)體內(nèi)部定義的變量(會隱藏在外層作用域中同名的其他所有聲明)
  • 自動對象
    • 普通局部變量如形參
  • 局部靜態(tài)對象
    • static類型:令局部變量的生命周期貫穿函數(shù)調(diào)用及之后的時間
    • 若沒有顯式初始值將執(zhí)行值初始化 內(nèi)置類型局部靜態(tài)變量初始化為0
6.1.2 函數(shù)聲明
  • 函數(shù)聲明(也稱函數(shù)原型)無需函數(shù)體(無須形參名字)
  • 函數(shù)三要素:返回類型/函數(shù)名/形參類型
  • 在頭文件中進行函數(shù)聲明
    • 頭文件聲明,源文件定義,源文件包含頭文件,編譯器驗證函數(shù)定義與聲明是否匹配
6.1.3 分離式編譯
  • 編寫程序時按照邏輯關(guān)系將其劃分開來,每個文件獨立編譯
  • 編譯和鏈接多個源文件
    • $:系統(tǒng)提示符;CC:編譯器名字;#:命令行下的注釋語句
    • 若修改了其中一個源文件,只需重新編譯改動了的文件,產(chǎn)生.o/.obj文件(該文件包含對象代碼)
    • 編譯器負責(zé)把對象文件鏈接在一起形成可執(zhí)行文件
6.2 參數(shù)傳遞
  • 每次調(diào)用函數(shù)都會重新創(chuàng)建它的形參 用傳入的實參對形參進行初始化(初始化機理與變量初始化一樣)
  • 引用/傳引用傳遞:形參為引用類型,將綁定到對應(yīng)的實參上(引用形參是對應(yīng)實參別名)
  • 值/傳值傳遞:形參和實參是兩個相互獨立的對象,實參的值被拷貝給形參
6.2.1 傳值參數(shù)
  • 初始化非引用類型變量 初始值被拷貝給變量,對變量的改動不會影響初始值
  • 指針形參
    • 指針行為與其他非引用類型一樣:執(zhí)行指針拷貝時,拷貝的是指針的值,拷貝后兩個指針是不同的指針(但他們指向的地址是相同的)
    • c程序員常使用指針類型形參訪問函數(shù)外部對象,c++建議使用引用類型形參代替指針
6.2.2 傳引用參數(shù)
  • 對引用的操作實際上是作用在引用所引的對象上
  • 使用引用避免拷貝
    • 當(dāng)某種類型不支持拷貝操作時,只能使用引用形參訪問該類型對象
    • 如無需改變形參對象的內(nèi)容,可將其定義為對常量的引用(當(dāng)函數(shù)無需修改引用形參的值時最好將其聲明為常量引用)
  • 使用引用形參返回額外信息
    • 返回多個結(jié)果可以定義一個新的數(shù)據(jù)類型,讓它包含多個成員
    • 給函數(shù)傳入額外的引用實參
6.2.3 const形參和實參
  • 與其他初始化一樣,用實參初始化形參時會忽略掉頂層const,當(dāng)形參有頂層const時,可以傳給它常量或者非常量對象。(因為頂層const被忽略所以在函數(shù)重載時,有無頂層const的形參是一樣的,不能進行這樣的重載)
  • 指針或引用形參與const
    • 形參的初始化方式和變量的初始化方式是一樣的
    • tip:
      • 不能用字面值初始化一個非常量引用(但可以初始化常量引用)
      • 不能把普通引用綁定到const對象上
      • 不能把普通引用綁定到字面值上
  • 盡量使用常量引用
    • 使用引用而非常量引用會極大限制函數(shù)所能接受的實參類型
      • 例如不能把const對象/字面值/需要類型轉(zhuǎn)換的對象傳遞給普通引用對象
6.2.4 數(shù)組形參
  • 數(shù)組特殊性質(zhì)
    • 不允許拷貝數(shù)組
    • 使用數(shù)組時通常會將其轉(zhuǎn)換為指針(指向數(shù)組首元素的指針)
  • 但是可以將形參寫成類似數(shù)組的形式,如(const int[])/(const int[10])但最終唯一形參都是(const int*)
  • 數(shù)組的大小對函數(shù)調(diào)用沒有影響(但須確保使用數(shù)組時不會越界)。因數(shù)組以指針形式傳遞給數(shù)組,函數(shù)不知道數(shù)組數(shù)組尺寸,調(diào)用者須為此提供些額外信息
  • 管理指針形參的三種常用技術(shù)
    • 使用標(biāo)記指定數(shù)組長度
      • 適用于有明顯結(jié)束標(biāo)記且該標(biāo)記不會與普通數(shù)據(jù)混淆的情況,如C風(fēng)格字符串末尾空字符
    • 使用標(biāo)準庫規(guī)范
      • 傳遞指向數(shù)組首元素和尾后元素的指針(begin end)
    • 顯示傳遞一個表示數(shù)組大小的形參
      • 通過形參確定數(shù)組元素個數(shù),如個數(shù)可為end(j)-begin(j)
  • 數(shù)組形參和const
    • 當(dāng)函數(shù)不需要對數(shù)組元素執(zhí)行寫操作的時候,數(shù)組形參應(yīng)該是指向const的指針
    • 只有當(dāng)函數(shù)確實需要改變元素值的時候才把形參定義成指向非常量的指針
  • 數(shù)組引用形參
    • c++允許將變量定義成數(shù)組的引用,形參也可以是數(shù)組的引用(數(shù)組名(int (&arr)[10])兩端的括號必不可少)
    • 數(shù)組的大小是構(gòu)成數(shù)組類型的一部分,只要不超過維度在函數(shù)體內(nèi)就可以放心的使用數(shù)組
  • 傳遞多維數(shù)組
    • 多維數(shù)組其實是數(shù)組的數(shù)組
    • 將多維數(shù)組傳遞給函數(shù)時,真正傳遞的是指向數(shù)組首元素的指針
    • 數(shù)組第二維(以及后面所有維度)的大小都是數(shù)組類型的一部分不能省略
void print(int (*matrix)[10],int rowSize){...}//matrix指向含有10個整數(shù)的數(shù)組的指針
void print(int matrix[][10],int rowSize){...}//與上式等價
6.2.5 main處理命令行選項
//argc表示數(shù)組中字符串的數(shù)量 argv是一個數(shù)組它的元素是指向C風(fēng)格字符串的指針
int main(int argc,char *argv[]){...}
//與上式等效 其中argv指向cahr* argv的第一個元素指向程序的名字或者一個空字符串
//接下來的元素依次傳遞命令行提供的實參 最后一個指針之后的元素值保證為0
int main(int argc,char **argv){...}
6.2.6 含可變形參的函數(shù)
  • 所有實參類型相同,可以傳遞一個名為initializer_list的標(biāo)準庫類型
  • 如果實參類型不同 則編寫一種特殊函數(shù) 即可變參數(shù)模板
  • 特殊形參類型:省略符,可傳遞可變數(shù)量實參
  • initializer_list形參
    • 實參數(shù)量未知,但全部實參的類型都相同
    • 用于表示某種特定類型的值的數(shù)組
    • 是一種模板類型 但對象中的元素永遠是常量值 無法修改對象元素的值
    • initializer_list包含begin和end成員,可以使用范圍for循環(huán)
initializer_list提供的操作
initializer_listlst;默認初始化;T類型元素的空列表
initializer_listlst{a,b,c...};lst的元素數(shù)量和初始值一樣多;lst的元素是對應(yīng)初始值的副本;列表中的元素是const
lst2(lst)拷貝或賦值一個initializer_list對象不會拷貝列表中的元素;拷貝后,原始列表和副本共享元素
lst2 = lst-
lst.size()列表中的元素數(shù)量
lst.begin()返回指向lst中首元素的指針
lst.end()返回指向lst中微元素下一位置的指針
  • 省略符形參
    • 便于c++程序訪問某些特殊C代碼設(shè)置的,這些代碼使用名為varags的C標(biāo)準庫功能
    • 僅適用于c和c++通用的類型,大多數(shù)類類型對象傳遞省略符形參時都無法正確拷貝
    • 省略符形參只能出現(xiàn)在形參列表最后一個位置
    • 省略符形參無需類型檢查
6.3 返回類型和return語句
  • return語句終止當(dāng)前正在執(zhí)行的函數(shù)并將控制權(quán)返回到調(diào)用該函數(shù)的地方
  • 兩種形式return;return expression;
6.3.1 無返回值函數(shù)
  • 只能用于返回類型是void的函數(shù),返回void的函數(shù)不要求非有return因為這類函數(shù)最后一句會隱式執(zhí)行return
  • 如果在void函數(shù)中間位置提前退出可以使用return
  • 返回類型為void的函數(shù)return語句若有expression必須是另一個返回void的函數(shù)
6.3.2 有返回值函數(shù)
  • 只要函數(shù)返回值不是void,return就必須返回一個值,返回值類型必須相同或者能隱式地轉(zhuǎn)換為函數(shù)的返回類型
  • 在含有return語句的循環(huán)后面應(yīng)該也有一條return語句
  • 值是如何被返回的
    • 返回一個值的方式和初始化一個變量或形參的方式完全一樣
  • 不要返回局部對象的引用或者指針
    • 函數(shù)終止意味著局部變量的引用將指向不再有效的內(nèi)存區(qū)域
  • 返回類類型的函數(shù)和調(diào)用運算符
    • 調(diào)用運算符的優(yōu)先級與點運算符和箭頭運算符相同,且也符合左結(jié)合律
  • 引用返回左值
    • 調(diào)用一個返回引用的函數(shù)得到左值,其他返回類型得到右值
    • 可以像使用其他左值那樣來使用返回引用的函數(shù)的調(diào)用,并且能夠為返回類型是非常量引用的函數(shù)的結(jié)果賦值,如果返回類型是常量引用則不能給調(diào)用的結(jié)果賦值
  • 列表初始化返回值
    • 函數(shù)可以返回花括號包圍的值的列表,用來對表示函數(shù)返回的臨時量進行初始化
    • 如果列表為空,臨時量執(zhí)行值初始化,否則返回的值由返回類型決定
    • 如果函數(shù)返回內(nèi)置類型,則花括號包圍列表最多包含一個值,而且該值所占空間不應(yīng)該大于目標(biāo)類型的空間;如果返回的是類類型,由類本身定義初始值如何使用
  • 主函數(shù)main的返回值
    • 允許main函數(shù)沒有return語句直接結(jié)束,控制到達結(jié)尾也沒return語句編譯器將隱式地插入一條返回0的return語句
    • cstdlib頭文件定義了兩個預(yù)處理變量,表示成功與失敗,因為是預(yù)處理變量所以不能在前面加std::,也不能在using聲明中出現(xiàn)
      • EXIT_FAILURE
      • EXIT_SUCCESS
  • 遞歸
    • 一個函數(shù)調(diào)用它自身,一定有某條路徑是不包含遞歸調(diào)用的
    • 遞歸循環(huán)
      • 函數(shù)不斷調(diào)用它自身直到程序棧空間耗盡為止
    • main函數(shù)不能調(diào)用它自己
6.3.3 返回數(shù)組指針
  • 數(shù)組不能被拷貝,所以函數(shù)不能返回數(shù)組,不過可以返回數(shù)組的指針或引用
  • 可以使用類型別名簡化返回數(shù)組的指針或者引用
  • 聲明一個返回數(shù)組指針的函數(shù)
    • 想定義一個返回數(shù)組指針的函數(shù),數(shù)組維度必須跟在函數(shù)名字之后
    • 函數(shù)的形參列表也跟在函數(shù)名字后面并且形參列表應(yīng)該先于數(shù)組的維度
Type (*function(parameter_list))[dimension]
  • 使用尾置返回類型
    • 跟在形參列表后面并且以一個->符號開頭
    • auto func(int i)->int(*)[10]
  • 使用decltype
    • 已知函數(shù)返回的指針將指向哪個數(shù)組,就可以使用decltype關(guān)鍵字聲明返回類型
    • decltype并不負責(zé)把數(shù)組類型轉(zhuǎn)換成對應(yīng)的指針,所以decltype的結(jié)果是一個數(shù)組,要想表示返回指針還需在函數(shù)聲明時加一個*
6.4 函數(shù)重載
  • 同一作用域內(nèi)幾個函數(shù)名字相同但形參列表不同
  • 編譯器會根據(jù)傳遞的實參類型推斷想要的函數(shù)
  • main函數(shù)不能重載
  • 定義重載函數(shù)
    • 重載函數(shù) 形參數(shù)量或者形參類型上有所不同
    • 不允許兩個函數(shù)除了返回類型外其他所有的要素都相同
  • 判斷兩個形參的類型是否相異
    • 形參名字僅起到助記的作用 有沒有它并不影響形參列表的內(nèi)容
    • 使用類型別名本質(zhì)上形參列表也沒什么不同
  • 重載和const形參
    • 頂層const不影響傳入函數(shù)的對象(一個有頂層const的形參無法和另一個沒有頂層const的形參區(qū)分開來)
    • 若形參是某種類型的指針或引用,則通過區(qū)分其指向的是常量對象還是非常量對象可以實現(xiàn)函數(shù)重載,此時const是底層的。編譯器可以通過實參是否是常量來推斷應(yīng)該調(diào)用哪個函數(shù)
    • const不能轉(zhuǎn)換為其他類型,但非常量可以轉(zhuǎn)換為const。當(dāng)傳遞一個非常量對象或者指向非常量對象的指針時,編譯器會優(yōu)先選用非常量版本的函數(shù)
  • 是否重載函數(shù)要看哪個更容易理解
  • const_cast和重載
    • 當(dāng)實參不是常量時首先將實參強制轉(zhuǎn)換為對const的引用,然后調(diào)用函數(shù)的const版本,const版本返回對const type的引用,這個引用實際綁定在了某個初始的非常量實參上,因此可以將其轉(zhuǎn)換回一個普通的type& 這是安全的
  • 調(diào)用重載的函數(shù)
    • 函數(shù)匹配/重載確定:把函數(shù)調(diào)用與一組重載函數(shù)中的某一個關(guān)聯(lián)起來(參數(shù)數(shù)量不同/參數(shù)類型無關(guān))
    • 重載函數(shù)三種可能:
      • 最佳匹配
      • 無匹配:找不到任何一個函數(shù)與調(diào)用的實參匹配
      • 二義性調(diào)用:有多余一個函數(shù)可以匹配,但每一個都不是明顯的最佳選擇
6.4.1 重載與作用域
  • 如果在內(nèi)層作用域中聲明名字,它將隱藏外層作用域中聲明的同名實體。在不同的作用域中無法重載函數(shù)名
  • 一旦在作用域中找到了所需的名字,編譯器就會忽略掉外層作用域中的同名實體,然后檢測函數(shù)調(diào)用是否有效
  • c++名字查找發(fā)生在類型檢查之前
6.5 特殊用途語言特性
  • 函數(shù)相關(guān)語言特性:默認實參/內(nèi)聯(lián)函數(shù)/constexpr函數(shù)
6.5.1 默認實參
  • 默認實參:在函數(shù)的很多次調(diào)用中都被賦予一個相同的值,在調(diào)用含默認實參的函數(shù)時,可以包含該實參也可以省略該實參。
  • 可以定義一個或多個形參定義默認值,一旦某個形參被賦予了默認值,它后面的所有形參都必須有默認值
  • 使用默認實參調(diào)用函數(shù)
    • 在調(diào)用函數(shù)時省略該實參就行
    • 函數(shù)調(diào)用實參按位置解析,默認實參負責(zé)填補函數(shù)調(diào)用缺少的尾部實參
    • 合理設(shè)置形參的順序,讓不怎么使用默認值的形參出現(xiàn)在前面,讓經(jīng)常使用默認值的形參出現(xiàn)在后面
  • 默認實參聲明
    • 在給定作用域中一個形參只能被賦予一次默認實參,函數(shù)后續(xù)聲明只能為之前沒有默認值的形參添加默認實參,且該形參右側(cè)所有形參都必須有默認值
    • 通常應(yīng)該在函數(shù)聲明中指定默認實參,并將聲明放在合適的頭文件中
  • 默認實參初始值
    • 局部變量不能作為默認實參,除此之外,只要表達式類型能夠轉(zhuǎn)換成形參所需的類型,該表達式就能作為默認形參
    • 用作默認實參的名字在函數(shù)聲明所在作用域內(nèi)解析,求值過程發(fā)生在函數(shù)調(diào)用時
6.5.2 內(nèi)聯(lián)函數(shù)和constexpr函數(shù)
  • 定義為函數(shù)的好處:
    • 容易閱讀理解
    • 確保行為的統(tǒng)一
    • 修改函數(shù)比等價表達式容易
    • 可以被重復(fù)利用
  • 缺點:
    • 函數(shù)比求等價表達式的值要慢一些
    • 函數(shù)調(diào)用包括:
      • 調(diào)用前保存寄存器,返回時恢復(fù)
      • 可能需要拷貝實參
      • 程序轉(zhuǎn)向一個新的位置繼續(xù)執(zhí)行
  • 內(nèi)聯(lián)函數(shù)可避免函數(shù)調(diào)用的開銷
    • inline 讓函數(shù)在調(diào)用點內(nèi)聯(lián)地展開可消除函數(shù)運行時的開銷
    • 內(nèi)聯(lián)函數(shù)只是向編譯器發(fā)出的一個請求,編譯器可以選擇忽略
    • 內(nèi)聯(lián)機制用于優(yōu)化規(guī)模較小、流程直接、頻繁調(diào)用的函數(shù)
    • 很多編譯器都不支持內(nèi)聯(lián)遞歸函數(shù)
  • constexpr函數(shù)
    • 用于常量表達式的函數(shù),返回類型以及所有形參的類型都得是字面值類型,函數(shù)體中有且只有一條return語句
    • constexpr函數(shù)被隱式地指定為內(nèi)聯(lián)函數(shù)
    • constexpr函數(shù)不一定返回常量表達式
  • 把內(nèi)聯(lián)函數(shù)和constexpr函數(shù)放在頭文件內(nèi)
    • 內(nèi)聯(lián)函數(shù)和constexpr函數(shù)可以在程序中多次定義,但多個定義必須完全一致,通常定義于頭文件中
6.5.3 調(diào)試幫助
  • 頭文件保護等,程序可包含一些用于調(diào)試的代碼,但只在開發(fā)時使用,發(fā)布時屏蔽掉。兩項預(yù)處理功能:assert和NDEBUG
  • assert預(yù)處理宏
    • 預(yù)處理名字由預(yù)處理器而非編譯器管理,可以直接使用預(yù)處理名字而無須提供using聲明。與預(yù)處理變量一樣,宏名字在程序內(nèi)必須唯一。
    • assert(expr)如果表達式為假,assert輸出信息并終止程序的執(zhí)行,如果表達式為真則什么也不做
    • assert宏常用于檢查 不能發(fā)生 的條件
  • NDEBUG預(yù)處理變量
    • 如果定義了NDEBUG,assert什么也不做;如果沒定義NDEBUG則assert將執(zhí)行運行時檢查
    • 使用#define NDEBUG關(guān)閉調(diào)試狀態(tài)
    • 定義自己的調(diào)試代碼,若未定義NDEBUG則執(zhí)行#ifndef和#endif之間的代碼;若定義了NDEBUG則這些代碼被忽略掉
    • c++編譯器定義
      • _ _func_ _函數(shù)名字
    • 預(yù)處理器定義程序調(diào)試時有用的名字
      • _ _FILE_ _文件名字符串字面值
      • _ _LINE_ _當(dāng)前行號整型字面值
      • _ _TIME_ _編譯時間字符串字面值
      • _ _DATE_ _編譯日期字符串字面值
6.6 函數(shù)匹配
  • 當(dāng)函數(shù)形參數(shù)量相等以及某些形參的類型可以由其他類型轉(zhuǎn)換得來時如何確定重載函數(shù)
  • 確定候選函數(shù)和可行函數(shù)
    • 候選函數(shù):與被調(diào)用函數(shù)同名;聲明在調(diào)用點可見
    • 可行函數(shù):形參數(shù)量與本次提供的實參數(shù)量相等;每個實參類型與形參類型相同或能夠轉(zhuǎn)換為形參的類型
    • 如果沒找到可行函數(shù),編譯器將報告無匹配函數(shù)的錯誤
  • 尋找最佳匹配
    • 逐一檢查函數(shù)提供的實參,尋找形參類型與實參類型最匹配的那個可行函數(shù)
    • 實參與形參類型越接近則匹配的越好;精確匹配比需要類型轉(zhuǎn)換的匹配更好
  • 含有多個形參的函數(shù)匹配
    • 編譯器選擇形參數(shù)量滿足要求且實參類型和形參類型能夠相匹配的函數(shù),依次檢查每個實參以確定哪個函數(shù)是最佳匹配,如果有且只有一個函數(shù)滿足下列要求,則匹配成功
      • 該函數(shù)每個實參的匹配都不劣于其他可行函數(shù)需要的匹配
      • 至少有一個實參的匹配優(yōu)于其他可行函數(shù)提供的匹配
  • 調(diào)用重載時應(yīng)該盡量避免強制類型轉(zhuǎn)換,形參設(shè)計的合理性
6.6.1 實參類型轉(zhuǎn)換
  • 實參到形參的類型轉(zhuǎn)換等級
      1. 精確匹配
      • 實參類型和形參類型相同
      • 實參從數(shù)組或函數(shù)類型轉(zhuǎn)換為對應(yīng)指針類型
      • 向?qū)崊⑻砑禹攲觕onst或者從實參中刪除頂層const
      1. const轉(zhuǎn)換實現(xiàn)的匹配
      1. 類型提升實現(xiàn)的匹配
      1. 算術(shù)類型轉(zhuǎn)換/指針轉(zhuǎn)換
      1. 類類型轉(zhuǎn)換
  • 需要類型提升和算術(shù)類型轉(zhuǎn)換的匹配
    • 小整形提升到int類型或者更大的整數(shù)類型
    • 存在兩種可能的算術(shù)類型轉(zhuǎn)換時調(diào)用具有二義性
  • 函數(shù)匹配和const實參
    • 調(diào)用時編譯器通過實參是否是常量來決定選擇哪個函數(shù)
    • 不能將普通引用綁定到const對象上
    • 非常量對象可用于初始化常量引用和非常量引用,但非常量對象初始化常量引用需要類型轉(zhuǎn)換,出于精確匹配的目的選用非常量版本的函數(shù)
6.7 函數(shù)指針
  • 函數(shù)指針指向特定類型,函數(shù)類型由它的返回值類型和形參類型共同決定,與函數(shù)名無關(guān)
  • 想聲明一個可以指向該函數(shù)的指針,只需用指針替換函數(shù)名,如
bool (*pf)(const string&,const string&);
//pf前有一個*,故pf為指針,右側(cè)為形參列表,表示pf指向的是函數(shù),左側(cè)函數(shù)返回值是布爾值
//pf指向一個形參是兩個const string的引用,返回類型是bool的函數(shù)
//*pf兩端的括號不可少,不加括號的話則pf是一個返回值為bool指針的函數(shù)
  • 使用函數(shù)指針
    • 將函數(shù)名作為值使用時,函數(shù)自動轉(zhuǎn)換為指針
    • 直接使用只愛那個函數(shù)的指針調(diào)用函數(shù)可無須提前解引用
    • 指向不同函數(shù)類型的指針間不存在轉(zhuǎn)換規(guī)則,但可以為函數(shù)指針賦值nulllptr或0,表示該指針沒有指向任何一個函數(shù)
  • 重載函數(shù)的指針
    • 編譯器通過指針類型決定選用哪個函數(shù),指針類型必須與重載函數(shù)中的某一個精確匹配
  • 函數(shù)指針形參
    • 雖然不能定義數(shù)組和函數(shù)類型的形參。但形參可以是指向函數(shù)的指針
    • 形參看起來像是函數(shù)類型,實際上是當(dāng)成指針使用
    • 可以直接把函數(shù)當(dāng)作實參使用,它自動轉(zhuǎn)換成指針
    • 類型別名可用于簡化使用函數(shù)的指針,如
//Func和Func2是函數(shù)類型
//調(diào)用Func作為參數(shù)時編譯器自動將Func表示的函數(shù)類型轉(zhuǎn)換為指針
typedef bool Func(const string&,const string&);
typedef decltype(lengthCompare) Func2;//與上式等價
//FuncP和FuncP2是指向函數(shù)的指針
typedef bool (*FuncP)(const string&,const string&);
typedef decltype(lengthCompare) *FuncP2;//與上式等價
//decltype返回函數(shù)類型,不會自動將函數(shù)類型轉(zhuǎn)換為指針類型,只有在結(jié)果前面加*才能得到指針
  • 返回指向函數(shù)的指針
    • 和數(shù)組類似,雖然不能返回一個函數(shù),但能夠返回指向函數(shù)類型的指針,必須把返回值類型寫成指針形式
    • 通過類型別名可以某符號定義成函數(shù)或者指向函數(shù)的指針類型
    • 和函數(shù)類型的形參不一樣,返回類型不會自動地轉(zhuǎn)換成指針,必須顯示地將返回類型指定為指針
    • 可以使用尾置返回類型的方式聲明一個返回函數(shù)指針的函數(shù)
  • 將auto和decltype用于函數(shù)指針指針類型
    • 明確知道返回函數(shù)是哪一個就能使用decltype簡化函數(shù)指針返回類型
    • 將decltype作用于某個函數(shù)時,它返回的是函數(shù)類型而非指針類型,需要顯示地加上*以表明我們需要返回的指針而非函數(shù)本身。
小結(jié)
  • 函數(shù):命名了的計算單元,對程序結(jié)構(gòu)化至關(guān)重要
  • 函數(shù)包含:返回類型/名字/形參列表/函數(shù)體
  • 函數(shù)可以被重載:同一個名字可用于定義多個函數(shù),只要形參數(shù)量或類型不同就行,編譯器自動選定被調(diào)用函數(shù)
  • 函數(shù)匹配:從一組重載函數(shù)中選取最佳函數(shù)
術(shù)語表
  • 二義性調(diào)用:函數(shù)在匹配時兩個或多個函數(shù)提供的匹配一樣好,編譯器找不到唯一的最佳匹配
  • 自動對象:僅存在于函數(shù)執(zhí)行過程中的對象。當(dāng)程序控制流經(jīng)過此類對象定義語句時創(chuàng)建該對象,當(dāng)?shù)竭_定義所在塊末尾時銷毀該對象
  • 函數(shù)原型:函數(shù)聲明包含返回類型/名字/形參類型

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站題目:c++primer第6章函數(shù)-創(chuàng)新互聯(lián)
新聞來源:http://www.muchs.cn/article4/ddshie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、外貿(mào)建站、建站公司、網(wǎng)站維護、App開發(fā)網(wǎng)站設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)