真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++Primer學(xué)習(xí)——6函數(shù)-創(chuàng)新互聯(lián)

6 函數(shù) 6.1 函數(shù)基礎(chǔ)

函數(shù)的調(diào)用完成兩項(xiàng)工作:

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)由有經(jīng)驗(yàn)的網(wǎng)站設(shè)計(jì)師、開(kāi)發(fā)人員和項(xiàng)目經(jīng)理組成的專(zhuān)業(yè)建站團(tuán)隊(duì),負(fù)責(zé)網(wǎng)站視覺(jué)設(shè)計(jì)、用戶(hù)體驗(yàn)優(yōu)化、交互設(shè)計(jì)和前端開(kāi)發(fā)等方面的工作,以確保網(wǎng)站外觀精美、網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作易于使用并且具有良好的響應(yīng)性。

1、實(shí)參初始化函數(shù)對(duì)應(yīng)的形參

2、將控權(quán)轉(zhuǎn)移給被調(diào)函數(shù)

形參和實(shí)參,盡管二者存在對(duì)應(yīng)關(guān)系,但是并沒(méi)有規(guī)定實(shí)參的求值順序

函數(shù)的返回類(lèi)型不可以是數(shù)組類(lèi)型,函數(shù)類(lèi)型,可以是指向數(shù)組或函數(shù)的指針

6.1.1 局部對(duì)象

局部變量:形參,函數(shù)體內(nèi)部定義的變量。局部變量會(huì)隱藏在外層作用域中同名的其他所有聲明

在所有函數(shù)體之外定義的對(duì)象存在于程序的整個(gè)執(zhí)行過(guò)程中

自動(dòng)對(duì)象:只存在于執(zhí)行期間的對(duì)象。當(dāng)塊的執(zhí)行結(jié)束后,塊中創(chuàng)建的自動(dòng)對(duì)象的值就變成未定義的了。形參就是一種自動(dòng)對(duì)象。

局部靜態(tài)對(duì)象:在程序的執(zhí)行路徑第一次經(jīng)過(guò)對(duì)象定義語(yǔ)句時(shí)初始化,并且直到程序終止才被銷(xiāo)毀,在此期間即使對(duì)象所在的函數(shù)結(jié)束執(zhí)行也不會(huì)對(duì)它有影響。

6.1.2 函數(shù)聲明

函數(shù)聲明也稱(chēng)函數(shù)原型,一般儲(chǔ)存在頭文件中

6.1.3 分離式編譯

要生成可執(zhí)行文件,必須告訴編譯器我們用到的代碼在哪里

$ CC factMain.cc fact.cc
$ CC factMain.cc fact.cc -o main

接下來(lái)運(yùn)行可執(zhí)行文件,就會(huì)執(zhí)行我們定義的main函數(shù)

6.2 參數(shù)傳遞

當(dāng)形參是引用類(lèi)型時(shí),我們說(shuō)它對(duì)應(yīng)的實(shí)參被引用傳遞或者函數(shù)被傳引用調(diào)用,也就是說(shuō)形參就是實(shí)參的別名

當(dāng)實(shí)參的值被拷貝給形參時(shí),形參和實(shí)參是兩個(gè)值。我們稱(chēng)之為值傳遞或者函數(shù)被傳值調(diào)用

6.2.1 傳值參數(shù)

當(dāng)初始化一個(gè)非引用類(lèi)型的變量時(shí),初始值拷貝給變量,此時(shí)對(duì)變量的改變不會(huì)影響實(shí)參。

指針形參,當(dāng)執(zhí)行拷貝操作時(shí),拷貝的是指針的值,這一點(diǎn)和非引用類(lèi)型一致。拷貝后就是兩個(gè)不同的指針,不過(guò)此時(shí)我們可以通過(guò)拷貝指針間接修改它所指向的對(duì)象

6.2.2 傳引用參數(shù)

使用引用可以避免拷貝

拷貝大的類(lèi)類(lèi)型對(duì)象或者容器對(duì)象比較低效,甚至有的類(lèi)類(lèi)型就不支持拷貝操作。當(dāng)類(lèi)型不支持拷貝操作時(shí),函數(shù)只能通過(guò)引用形參訪問(wèn)該類(lèi)型的對(duì)象。

**注意:**當(dāng)函數(shù)無(wú)需改變引用形參的值,最好將其聲明為常量引用

使用引用形參返回額外信息

一個(gè)函數(shù)只能返回一個(gè)值,如果需要同時(shí)返回多個(gè)值,此時(shí)可以考慮引用形參

string::size_type find_char(const string &s, char c, string::size_sype &occurs)//occurs用作返回次數(shù)

6.2.3 const形參和實(shí)參

實(shí)參初始化形參時(shí)會(huì)忽略頂層const(畢竟常量是可以初始化一個(gè)變量的)

void f(const int i) {}
void f(int i) {} //err 重復(fù)定義

盡量使用常量引用

1、把函數(shù)不會(huì)改變的形參定義成(普通)引用是一種比較常見(jiàn)的錯(cuò)誤,因?yàn)檫@樣會(huì)給函數(shù)的調(diào)用者一個(gè)誤導(dǎo),即函數(shù)可以修改它的實(shí)參的值。

2、使用普通引用也會(huì)極大地限制函數(shù)所能接受的實(shí)參類(lèi)型。例如:不可以把const對(duì)象、字面值或者需要類(lèi)型轉(zhuǎn)換的對(duì)象傳遞給普通的引用形參

6.2.4 數(shù)組形參

數(shù)組的兩個(gè)特殊性質(zhì):1、不允許拷貝。2、使用數(shù)組時(shí)通常會(huì)將其轉(zhuǎn)換成指針

**警告:**以數(shù)組作為形參的函數(shù)也必須確保使用數(shù)組時(shí)不會(huì)越界

數(shù)組形參和const

當(dāng)函數(shù)不需要對(duì)數(shù)組元素執(zhí)行寫(xiě)操作的時(shí)候,數(shù)組形參應(yīng)該時(shí)指向const的指針。只有當(dāng)函數(shù)確實(shí)要改變?cè)刂档臅r(shí)候,才把形參定義成指向非常量的指針

數(shù)組引用形參此時(shí),引用形參綁定到對(duì)應(yīng)的實(shí)參上,也就是綁定到數(shù)組上

//形參是數(shù)組的引用,維度是類(lèi)型的一部分
void print(int (&arr)[10]) {
    for (auto elem :arr)
        cout<< elem<< endl;
}
&arr兩端的括號(hào)必不可少
f(int &arr[10]) // err 將arr聲明成了引用的數(shù)組 不存在引用的數(shù)組
f(int (&arr)[10]) // arr是具有10個(gè)整數(shù)的整型數(shù)組的引用
但是這一做法限制了print函數(shù)的可用性,我們只能將函數(shù)作用于大小為10的數(shù)組
6.2.6 含有可變形參的函數(shù)

如果所有的實(shí)參類(lèi)型相同,可以傳遞一個(gè)名為initializer_list的標(biāo)準(zhǔn)庫(kù)類(lèi)型;如果實(shí)參的類(lèi)型不同,我們可以編寫(xiě)一種特殊的函數(shù),也就是可變參數(shù)模板

//類(lèi)似于vector,定義initializer_list對(duì)象時(shí),必須說(shuō)明列表中所含元素的類(lèi)型
initializer_listls; //initializer_list的元素類(lèi)型時(shí)string
void error_msg(initializer_listil) {
    for (auto beg = il.begin(); beg != il.end(); ++beg)
        cout<< *beg<< " ";
    cout<< endl;
}
//expected和actual是string對(duì)象
if (expected != actual)
    error_msg({"functionX", "expected", "actual"});
else
    error_msg({"functionX", "expected"});

省略形參:應(yīng)該僅僅應(yīng)用于C和C++通用的類(lèi)型。特別需要注意的是,大多數(shù)類(lèi)類(lèi)型的對(duì)象在傳遞給省略符形參時(shí)都無(wú)法正確拷貝

省略符形參只能出現(xiàn)在形參列表的最后一個(gè)位置

void foo(parm_list, ...); void foo( ...);

6.3 返回類(lèi)型和return語(yǔ)句

return語(yǔ)句有兩種形式:return; return expression;

6.3.2 有返回值函數(shù)

在含有return語(yǔ)句的循環(huán)后面應(yīng)該也有一條return語(yǔ)句,如果沒(méi)有的話該程序就是錯(cuò)誤的。

值是如何被返回的:返回的值用于初始化調(diào)用點(diǎn)的一個(gè)臨時(shí)量,該臨時(shí)量就是函數(shù)調(diào)用的結(jié)果

string f();返回一個(gè)副本或者一個(gè)未命名的string對(duì)象 拷貝

const string &f();返回const string的引用,不管是調(diào)用函數(shù)還是返回結(jié)果都不會(huì)真正拷貝string對(duì)象 不拷貝

不要返回局部對(duì)象的引用或指針

函數(shù)一旦完成,它所占用的儲(chǔ)存空間也就隨即釋放,那么局部變量的引用以及局部對(duì)象的指針也就不存在。

引用返回左值 調(diào)用一個(gè)返回引用的函數(shù)得到左值,其他返回類(lèi)型得到右值

列表初始化返回值 C++11新標(biāo)準(zhǔn)規(guī)定,函數(shù)可以返回花括號(hào)包圍的值的列表

6.3.3 返回?cái)?shù)組指針

定義一個(gè)返回?cái)?shù)組的指針或引用的函數(shù)比較繁瑣,但是有一些方法可以簡(jiǎn)化這一任務(wù),其中最直接的方法是使用類(lèi)型別名

typedef int arrT[10]; //arrT是一個(gè)類(lèi)型別名,它表示的類(lèi)型是含有10個(gè)整數(shù)的數(shù)組
using arrT = int[10]; //上述的等價(jià)聲明
arrT* func(int i);    //func返回一個(gè)指向含有10個(gè)整數(shù)的數(shù)組的指針

int arr[10];          //
int *p1[10];          //p1是一個(gè)含有10個(gè)指針的數(shù)組
int (*p1)[10] = &arr; //p2是一個(gè)指針,指向含有10個(gè)整數(shù)的數(shù)組  (同類(lèi)型別名)

int (*func(int i))[10];//同上

使用尾置返回類(lèi)型

C++11新標(biāo)準(zhǔn) 任何函數(shù)定義都能使用尾置返回,但是這種形式對(duì)于返回類(lèi)型比較復(fù)雜的函數(shù)最有效,比如返回類(lèi)型是數(shù)組的指針或數(shù)組的引用。

為了表示函數(shù)真正的返回類(lèi)型跟在形參列表之后,我們?cè)诒緫?yīng)該出現(xiàn)返回類(lèi)型的地方放置一個(gè)auto

auto func(int i) ->int(*) [10]真正的返回類(lèi)型int(*) [10]

使用decltype(返回操作數(shù)的具體類(lèi)型)

int odd[] = {1,2,3,4};
decltype(odd) *arrPtr(int i){ }
//decltype并不負(fù)責(zé)把數(shù)組類(lèi)型轉(zhuǎn)換成對(duì)應(yīng)的指針,所以decltype的結(jié)果是數(shù)組,另外要再加一個(gè)*
6.4 函數(shù)重載

如果同一作用域內(nèi)的幾個(gè)函數(shù)名字相同但形參列表不同,我們稱(chēng)之為重載函數(shù)。不允許兩個(gè)函數(shù)除了返回類(lèi)型外其他所有的要素都相同。

重載和const形參

一個(gè)擁有頂層const的形參無(wú)法和另一個(gè)沒(méi)有頂層const的形參區(qū)分開(kāi)來(lái)

int f(Phone);
int f(const Phone);   //重復(fù)聲明了int f(Phone);

int f(Phone*);
int f(Phone* const);   //重復(fù)聲明了int f(Phone*);

int f(Phone&);
int f(const Phone&);   //新函數(shù),作用于常量引用

int f(Phone*);
int f(const Phone*);   //新函數(shù),作用于指向常量的指針

編譯器可以通過(guò)實(shí)參是否是常量來(lái)推斷應(yīng)該調(diào)用哪個(gè)函數(shù)。

const_cast和重載

const_cast的目的是重載

調(diào)用重載函數(shù)時(shí)有三種可能:最佳匹配、誤匹配、二義性調(diào)用

6.4.1 重載于作用域

如果我們?cè)賰?nèi)層作用域中聲明名字,它將隱藏外層作用域中聲明的同名實(shí)體。

6.5 特殊用途語(yǔ)言特性 6.5.1 默認(rèn)實(shí)參

一旦某個(gè)形參被賦予了默認(rèn)值,它后面的所有形參就必須有默認(rèn)值

當(dāng)設(shè)計(jì)含有默認(rèn)實(shí)參的函數(shù)時(shí),其中一項(xiàng)任務(wù)是合理設(shè)置形參的順序,盡量讓不怎么使用默認(rèn)值的形參出現(xiàn)在前面,而讓使用默認(rèn)值的形參出現(xiàn)在后面。另外,函數(shù)的后續(xù)聲明只能為之前那些沒(méi)有默認(rèn)值的形參添加默認(rèn)實(shí)參,而且該形參右側(cè)的所有形參都必須有默認(rèn)值。

6.5.2 內(nèi)聯(lián)函數(shù)和constexpr函數(shù)

將函數(shù)指定為內(nèi)聯(lián)函數(shù),通常就是將它在每個(gè)調(diào)用點(diǎn)上“內(nèi)聯(lián)地”展開(kāi)。一般來(lái)說(shuō),內(nèi)聯(lián)機(jī)制用于優(yōu)化規(guī)模小、流程直接、頻繁調(diào)用地函數(shù)。

constexpr函數(shù)是指能用于常量表達(dá)式(不一定必須是常量表達(dá)式)的函數(shù)。函數(shù)的返回類(lèi)型及所有形參的類(lèi)型都得是字面值類(lèi)型,而且函數(shù)中必須有且只有一條return語(yǔ)句

6.5.3 調(diào)試幫助

assert預(yù)處理宏

所謂預(yù)處理宏就是一個(gè)預(yù)處理變量,類(lèi)似于內(nèi)聯(lián)函數(shù)。

NDEBUG預(yù)處理變量

如果定義了NDEBUG,assert什么也不做

$ CC -D NDEBUG main.C 等價(jià)于在main.c文件一開(kāi)始寫(xiě)#define NDEBUG

6.6 函數(shù)匹配

1、選定本次調(diào)用對(duì)應(yīng)重載函數(shù)集,集合中的函數(shù)稱(chēng)為候選函數(shù)

2、考察本次調(diào)用提供的實(shí)參,然后從候選函數(shù)中選出能被實(shí)參調(diào)用的函數(shù),新選出的函數(shù)稱(chēng)為可行函數(shù)

3、從可行函數(shù)中尋找本次調(diào)用最匹配的函數(shù)

匹配成功的條件:

  • 該函數(shù)每個(gè)實(shí)參的匹配都不劣于其他可行函數(shù)需要的匹配
  • 至少有一個(gè)實(shí)參的匹配優(yōu)于其他可行函數(shù)提供的匹配
6.7 函數(shù)指針

bool (*pf)(const string&, const string&); //未初始化

(*pf)兩端的括號(hào)必不可少,不然就是一個(gè)返回值為bool指針的函數(shù)

函數(shù)指針形參

形參可以是指向函數(shù)的指針

返回指向函數(shù)的指針

using F = int(int*, int);    //F是函數(shù)類(lèi)型,不是指針
using PF = int(*)(int*, int); //PF是指針類(lèi)型

法1:
PF f1(int);  
F f1(int);  //err 不可以返回一個(gè)函數(shù)
F *f1(int);

法2:
int (*f1(int))(int*, int);

法3:尾置返回
auto f1(int) ->int (*)(int*, int);

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


分享題目:C++Primer學(xué)習(xí)——6函數(shù)-創(chuàng)新互聯(lián)
轉(zhuǎn)載來(lái)源:http://weahome.cn/article/djogsj.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部