亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++中函數的使用方法

2020-02-24 14:31:44
字體:
來源:轉載
供稿:網友

函數在C++中是必不可少的存在,而函數一般是由函數的返回類型、函數名和函數的形參表這三個部分組成,而且不同的函數定義可以還會稍有不同,那么我們要怎么使用函數呢?現在我們去看看C++中函數的使用方法。

一、參數傳遞

我們將函數定義或聲明里的參數叫形參,而在調用函數時傳入的參數叫實參。那么根據形參類型的不同,有幾下形式的參數傳遞。

1,非引用形參

1)普通的內置類型

普通非引用類型的參數通過復制對應的實參實現形參的初始化。當用實參的副本初始化形參時,函數并沒有訪問調用所傳遞的實參的本身,因此函數不可能改實參的值。比如下面的交換兩個數的程序:

?

?

void swap(int v1, int v2)
{
??? int temp = v1;
??? v2 = v1;
??? v1 = temp;
}

?

swap(a, b);// 調用swap

?

上面程序中,實參為a與b,但是在調用時,v1與v2接受的是a與b的副本,所以實際上a與b的值沒有變化。

2)指針形參

函數的形參可以是指針,此時將復制實參指針,其實這類跟1)原理類似,函數內并無法改變實參的指針值。只是函數可以通過復制到的地址改變實參指針所指向的值。

?

?

void swap(int* v1, int* v2)
{
??? int temp = *v2;
??? *v2 = *v1;
??? *v1 = temp;
}
int main()
{
??? int a = 10,b = 20;
??? int *p1 = &a,*p2 = &b;
??? swap(p1,p2);
??? return 0;
}

?

上面程序中定義的swap的形參為指針類型,main中調用swap,實際上swap并不能改變p1與p2的值,只是改變了它們所指向的值。

3)const 形參

對于普通的非引用類型用const修飾實際上是沒有意義的,因為本來函數就不會改變實參的值。像下面的定義,實際中編譯器會忽略const的定義,而將其視為int型。

?

?

void fcn(const int i);

?

2,引用形參

1)在上面的程序中我們看到,如果想交換兩個變量的值,通過調用普通的非引用類型形參的函數,并不能實現。用它們的指針可以,同時我們也可以用引用。

?

?

void swap(int& v1, int& v2)
{
??? int temp = v2;
??? v2 = v1;
??? v1 = temp;
}
int main()
{
??? int a = 10,b = 20;
??? swap(a,b);
??? return 0;
}

?

在實際調用swap時,v1與v2實際相當于a與b的另一個名字。

2)在有的時候我們需要向函數傳遞大型對象,需要使用引用形參,如果直接使用復制實參的形式可以,但是它的效率太低了,甚至有些對象是無法復制的。但是使用引用形參時,我們不希望函數改變了實參傳入的值,我們就可以使用const來限定形參。下面程序用來判斷哪個字符串更長,明顯我們不希望函數會改變字符串的內容,我們就可以用const引用型的形參。

?

?

bool isLonger(const string &s1, const string &s2)
{
??? return s1.size() > s2.size();
}

?

所以,如果使用引用形參的惟一的目的是避免復制實參時,則應將形參定義為const引用。

3)在使用引用形參函數時,有兩點值得注意:

不要用const限定的實參或字面值來調用非const引用形參函數。因為這樣函數內,可以改變實參的值,這不合法。

非const引用形參只能與完全同類型的非const對象關聯。

4)傳遞指向指針的引用

如下有下面的程序:

?

?

void swap(int* &v1, int* &v2)
{
??? int* temp = v2;
??? v2 = v1;
??? v1 = temp;
}
int main()
{
??? int a = 10,b = 20;
??? int* p1 = &a, *p2 = &b;
??? swap(p1,p2);
??? return 0;
}

?

上面的程序依然不能改變a與b的值,但是它改變了p1與p2的值,現在p1指向了b,而p2指向了a。

3,其他類型的形參

1)vector和其他類型的形參:一般在這種類型作為形參時,為了避免復制應該考慮形參聲明為引用類型。C++程序員傾向于傳遞容器中需要處理的元素的迭代器來傳遞容器。

2)數組形參:由于數組不能復制,所以不能直接編寫數組類型的形參函數,一般通過傳遞指向數組的元素的指針來處理數組。值得注意的是在通過引用傳遞數組時,在調用函數時形參與實參的類型要匹配。

?

?

void printValues(int (&ar)[10]);
int main()
{
??? int i = 0, j[2] = { 0, 1 };
??? int k[10] = {0,1,2,3,4,5,6,7,8,9};
??? printValues(i);? //error int不能初始化 int(&)[10]
??? printValues(j);? //error int[2] 不能初始化 int(&)[10]
??? printValues(k);?? // ok
??? return 0;
}

?

二、函數的返回值

1)沒有返回值

很多函數并沒有返回值,尤其是現在C++風格,習慣于把需要的結果作為引用形參。這類型函數一般沒有return語句,有時候有return是使函數中途中斷執行。

2)返回非引用類型

這種情況在函數調用處,程序會用一個臨時變量復制函數的返回值。

3)返回引用

當函數返回引用類型時,并沒有復制返回值。相反,返回的是對象本身。

在返回引用這種情況下,注意不要返回局部變量的引用,因為局部變量在函數體內定義,當函數執行完后就銷毀了,所謂的引用也就沒有意義了。同理,不要返回指向局部變量的指針。

三、重載函數

出現在相同作用域中的兩個函數,如果具有相同的名字而形參不同,則稱為重載函數。

1)注意區分函數重載與重復聲明

有些看起來不同的形參,本質是相同的。下面代碼中的都是重復聲明的例子

?

?

typedef double newDouble;
int func(double i);
int func(newDouble i);? // 沒有新類型

?

int func1(int, int = 1); //只是提供默認參數
int func1(int ,int);

int func2(int);
int func2(const int);? //對于普通非引用形參用cosnt修飾是沒有意義的

?

2)重載與作用域

局部聲明的函數,將屏蔽所有全局作用的同名函數。下面例子顯示,即使全局作用的函數更加匹配調用的實參類型,但是仍然調用的是局部的函數。

?

?

void print(int);
int main()
{
??? void print(double);
??? print(42);
??? return 0;
}

?

上面程序中,將調用void print(double)函數,雖然42是int型。

3)重載確定的三個步驟

如果定義了眾多的函數重載,將存在函數調用到底與哪個重載函數相匹配的問題。我們通過下面的示例代碼來說明問題:

?

?

void f();? // 1
void f(int);// 2
void f(double);// 3
void f(int, int);// 4
void f(double, double);// 5

?

第一步:確定候選函數

假如我們調用f(4.2),那么先找到同名函數,并且在作用域內可見,上面例子中5個函數都滿足。

第二步:選擇可行的函數

必須滿足2個條件:一是函數形參與該調用實參個數相同;第二,每個實參的類型必須與對應的類型匹配,或者可以被隱式轉換為對應的形參類型。這里我們再調用f(4.2)時,排除了1、4、5號函數,只剩下2與3。其中2號函數可以通過類型轉換來滿足。

第三步:尋找最佳匹配

在經過第二步確定后,剩下2與3函數,那么2需要進行類型轉換,顯然3是最佳匹配了。

但是如果這樣調用f(42,4.2)。這時候就會出現二義性,編譯器將提示。

還有一種要注意的就是有默認參數的函數,比如我們定義6號函數為void f(double,int =1);那么在調用f(4.2)時就會有二義性。

可基于函數的引用形參是指向const對象還是指向非const對象實現函數重載。

以上介紹的就是C++中函數的使用方法,看完我們討論函數的調用時需要注意的一些問題后,我們在C++函數的使用中就要注意咯。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲高清一区二| 亚洲性线免费观看视频成熟| 俺去啦;欧美日韩| xxx成人少妇69| 久久精品亚洲精品| 亚洲欧美日韩精品久久亚洲区| 亚洲一级免费视频| 黄色一区二区在线观看| 中文亚洲视频在线| 国产精品高潮粉嫩av| 97精品一区二区视频在线观看| 亚洲成人精品久久| 久久久国产精品x99av| 久久久久久久久久久亚洲| 7777精品久久久久久| 高清视频欧美一级| 91色视频在线观看| 亚洲性视频网站| 中文字幕亚洲国产| 欧美激情综合色综合啪啪五月| 黑人狂躁日本妞一区二区三区| 成人精品一区二区三区| 午夜精品久久久久久久99黑人| 性欧美在线看片a免费观看| 国产精品老女人精品视频| 91影视免费在线观看| 中文字幕日韩欧美精品在线观看| 成人黄色片在线| 亚洲视频在线看| 亚洲日本中文字幕免费在线不卡| 亚洲国产精品电影在线观看| 亚洲视频欧美视频| 国产成人精品日本亚洲专区61| 国产国语videosex另类| 欧美视频在线观看免费网址| 欧洲永久精品大片ww免费漫画| 欧美性xxxxhd| 97超碰国产精品女人人人爽| 国产精品视频一区国模私拍| 欧美日韩中文字幕在线| 亚洲mm色国产网站| 欧美一区亚洲一区| 91视频8mav| 久久精品国产亚洲7777| 国产精品网红福利| 欧美日韩成人黄色| 欧美剧在线观看| 日韩精品亚洲精品| 亚洲色图50p| 久久精品国产视频| 高清一区二区三区日本久| 91天堂在线视频| 成人在线观看视频网站| 7777免费精品视频| 国产欧美日韩91| 日韩国产高清污视频在线观看| 成人在线一区二区| 欧美成人免费播放| 欧美午夜精品久久久久久久| 亚洲a∨日韩av高清在线观看| 一区二区三区久久精品| 亚洲天堂网站在线观看视频| 国产亚洲人成网站在线观看| 欧美日韩国产限制| 欧美日韩人人澡狠狠躁视频| 日韩电影在线观看免费| 国产日韩精品电影| 国产成人综合精品| 国产精品视频资源| 亚洲午夜精品久久久久久久久久久久| 日日狠狠久久偷偷四色综合免费| 亚洲新中文字幕| 九九久久久久久久久激情| 日本午夜精品理论片a级appf发布| 亚洲天堂av在线播放| 91精品国产91久久久久久最新| 日韩一区二区av| 岛国av在线不卡| 亚洲成人动漫在线播放| 久久午夜a级毛片| 久久综合久久美利坚合众国| 亚洲欧美日韩天堂一区二区| 亚洲性av在线| 2018国产精品视频| 国产精品色悠悠| 欧美黄色成人网| 亚洲美女又黄又爽在线观看| 97视频免费看| 一区二区三区国产在线观看| 超在线视频97| 亚洲在线视频观看| 日韩av片永久免费网站| 中日韩午夜理伦电影免费| 欧美一级电影在线| 欧美激情视频网| 2018中文字幕一区二区三区| 日韩美女主播视频| www.99久久热国产日韩欧美.com| 日韩中文字幕欧美| 亚洲国产精品999| 在线国产精品播放| 日本精品久久久| 亚洲国产高潮在线观看| 亚洲乱码国产乱码精品精天堂| 久久久国产精品一区| 亚洲片国产一区一级在线观看| 国产精品一区二区三区在线播放| 欧美极品少妇xxxxⅹ裸体艺术| 国产91色在线播放| 91九色精品视频| 精品久久香蕉国产线看观看gif| 日本三级韩国三级久久| 国产精品久久久999| 91chinesevideo永久地址| 欧美性生交大片免费| 国产精品com| 国产成人精品久久二区二区91| 欧美另类xxx| 亚洲美女性视频| 91精品国产91久久| 庆余年2免费日韩剧观看大牛| 中文字幕不卡av| 性色av香蕉一区二区| 在线观看日韩专区| 久久影视电视剧免费网站清宫辞电视| 久久久久久高潮国产精品视| 国产亚洲欧洲在线| 97人人爽人人喊人人模波多| 中文字幕一区日韩电影| 成人在线国产精品| 一二美女精品欧洲| 日韩视频在线免费| 欧美日韩黄色大片| 国产成人一区二| 日韩成人黄色av| 91色琪琪电影亚洲精品久久| 久久国产精品久久国产精品| 国产国语刺激对白av不卡| 日本精品久久中文字幕佐佐木| 亚洲精品www久久久| 国产精品成人免费电影| 国产精品亚洲欧美导航| 国产成人精品国内自产拍免费看| 韩剧1988免费观看全集| 色噜噜亚洲精品中文字幕| 欧美性生交大片免费| 亚洲字幕一区二区| 91高清视频免费观看| 黄色精品一区二区| 亚洲石原莉奈一区二区在线观看| 日韩电影免费在线观看中文字幕| 日本a级片电影一区二区| 黄色一区二区在线观看| 亚洲精品在线观看www| 精品久久久久久久久久ntr影视| 日韩三级成人av网| 欧美自拍视频在线观看| 日韩欧美国产免费播放| 国产精品久久婷婷六月丁香| 国外成人免费在线播放| 国内精品一区二区三区| 精品日韩中文字幕| 97精品伊人久久久大香线蕉| 欧美激情视频在线免费观看 欧美视频免费一|