欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中函數(shù)的用法小結(jié)

 更新時(shí)間:2014年02月25日 14:36:37   作者:  
這篇文章主要為大家分享下本人在閱讀《C++ Primer》函數(shù)一章時(shí)的讀書(shū)總結(jié),需要的朋友可以參考下

函數(shù)在C++中的使用,無(wú)非2種地方,一處是函數(shù)的定義,一處是函數(shù)的調(diào)用。而函數(shù)的定義則非常簡(jiǎn)單,由三個(gè)部分組成:函數(shù)的返回類(lèi)型、函數(shù)名和函數(shù)的形參表。當(dāng)然,這里不同的函數(shù)定義可以還會(huì)稍有不同,比如類(lèi)的成員函數(shù)、內(nèi)聯(lián)函數(shù)等。這里我們主要討論函數(shù)的調(diào)用時(shí)需要注意的一些問(wèn)題。

一、參數(shù)傳遞

我們將函數(shù)定義或聲明里的參數(shù)叫形參,而在調(diào)用函數(shù)時(shí)傳入的參數(shù)叫實(shí)參。那么根據(jù)形參類(lèi)型的不同,有幾下形式的參數(shù)傳遞。

1,非引用形參

1)普通的內(nèi)置類(lèi)型

普通非引用類(lèi)型的參數(shù)通過(guò)復(fù)制對(duì)應(yīng)的實(shí)參實(shí)現(xiàn)形參的初始化。當(dāng)用實(shí)參的副本初始化形參時(shí),函數(shù)并沒(méi)有訪(fǎng)問(wèn)調(diào)用所傳遞的實(shí)參的本身,因此函數(shù)不可能改實(shí)參的值。比如下面的交換兩個(gè)數(shù)的程序:

復(fù)制代碼 代碼如下:

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

swap(a, b);// 調(diào)用swap

上面程序中,實(shí)參為a與b,但是在調(diào)用時(shí),v1與v2接受的是a與b的副本,所以實(shí)際上a與b的值沒(méi)有變化。

2)指針形參

函數(shù)的形參可以是指針,此時(shí)將復(fù)制實(shí)參指針,其實(shí)這類(lèi)跟1)原理類(lèi)似,函數(shù)內(nèi)并無(wú)法改變實(shí)參的指針值。只是函數(shù)可以通過(guò)復(fù)制到的地址改變實(shí)參指針?biāo)赶虻闹怠?/P>

復(fù)制代碼 代碼如下:

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的形參為指針類(lèi)型,main中調(diào)用swap,實(shí)際上swap并不能改變p1與p2的值,只是改變了它們所指向的值。

3)const 形參

對(duì)于普通的非引用類(lèi)型用const修飾實(shí)際上是沒(méi)有意義的,因?yàn)楸緛?lái)函數(shù)就不會(huì)改變實(shí)參的值。像下面的定義,實(shí)際中編譯器會(huì)忽略const的定義,而將其視為int型。

復(fù)制代碼 代碼如下:

void fcn(const int i);

2,引用形參

1)在上面的程序中我們看到,如果想交換兩個(gè)變量的值,通過(guò)調(diào)用普通的非引用類(lèi)型形參的函數(shù),并不能實(shí)現(xiàn)。用它們的指針可以,同時(shí)我們也可以用引用。

復(fù)制代碼 代碼如下:

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;
}

在實(shí)際調(diào)用swap時(shí),v1與v2實(shí)際相當(dāng)于a與b的另一個(gè)名字。

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

復(fù)制代碼 代碼如下:

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

所以,如果使用引用形參的惟一的目的是避免復(fù)制實(shí)參時(shí),則應(yīng)將形參定義為const引用。

3)在使用引用形參函數(shù)時(shí),有兩點(diǎn)值得注意:

不要用const限定的實(shí)參或字面值來(lái)調(diào)用非const引用形參函數(shù)。因?yàn)檫@樣函數(shù)內(nèi),可以改變實(shí)參的值,這不合法。

非const引用形參只能與完全同類(lèi)型的非const對(duì)象關(guān)聯(lián)。

4)傳遞指向指針的引用

如下有下面的程序:

復(fù)制代碼 代碼如下:

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的值,現(xiàn)在p1指向了b,而p2指向了a。

3,其他類(lèi)型的形參

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

2)數(shù)組形參:由于數(shù)組不能復(fù)制,所以不能直接編寫(xiě)數(shù)組類(lèi)型的形參函數(shù),一般通過(guò)傳遞指向數(shù)組的元素的指針來(lái)處理數(shù)組。值得注意的是在通過(guò)引用傳遞數(shù)組時(shí),在調(diào)用函數(shù)時(shí)形參與實(shí)參的類(lèi)型要匹配。

復(fù)制代碼 代碼如下:

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;
}

二、函數(shù)的返回值

1)沒(méi)有返回值

很多函數(shù)并沒(méi)有返回值,尤其是現(xiàn)在C++風(fēng)格,習(xí)慣于把需要的結(jié)果作為引用形參。這類(lèi)型函數(shù)一般沒(méi)有return語(yǔ)句,有時(shí)候有return是使函數(shù)中途中斷執(zhí)行。

2)返回非引用類(lèi)型

這種情況在函數(shù)調(diào)用處,程序會(huì)用一個(gè)臨時(shí)變量復(fù)制函數(shù)的返回值。

3)返回引用

當(dāng)函數(shù)返回引用類(lèi)型時(shí),并沒(méi)有復(fù)制返回值。相反,返回的是對(duì)象本身。

在返回引用這種情況下,注意不要返回局部變量的引用,因?yàn)榫植孔兞吭诤瘮?shù)體內(nèi)定義,當(dāng)函數(shù)執(zhí)行完后就銷(xiāo)毀了,所謂的引用也就沒(méi)有意義了。同理,不要返回指向局部變量的指針。

三、重載函數(shù)

出現(xiàn)在相同作用域中的兩個(gè)函數(shù),如果具有相同的名字而形參不同,則稱(chēng)為重載函數(shù)。

1)注意區(qū)分函數(shù)重載與重復(fù)聲明

有些看起來(lái)不同的形參,本質(zhì)是相同的。下面代碼中的都是重復(fù)聲明的例子

復(fù)制代碼 代碼如下:

typedef double newDouble;
int func(double i);
int func(newDouble i);  // 沒(méi)有新類(lèi)型

int func1(int, int = 1); //只是提供默認(rèn)參數(shù)
int func1(int ,int);

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

2)重載與作用域

局部聲明的函數(shù),將屏蔽所有全局作用的同名函數(shù)。下面例子顯示,即使全局作用的函數(shù)更加匹配調(diào)用的實(shí)參類(lèi)型,但是仍然調(diào)用的是局部的函數(shù)。

復(fù)制代碼 代碼如下:

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

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

3)重載確定的三個(gè)步驟

如果定義了眾多的函數(shù)重載,將存在函數(shù)調(diào)用到底與哪個(gè)重載函數(shù)相匹配的問(wèn)題。我們通過(guò)下面的示例代碼來(lái)說(shuō)明問(wèn)題:

復(fù)制代碼 代碼如下:

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

第一步:確定候選函數(shù)

假如我們調(diào)用f(4.2),那么先找到同名函數(shù),并且在作用域內(nèi)可見(jiàn),上面例子中5個(gè)函數(shù)都滿(mǎn)足。

第二步:選擇可行的函數(shù)

必須滿(mǎn)足2個(gè)條件:一是函數(shù)形參與該調(diào)用實(shí)參個(gè)數(shù)相同;第二,每個(gè)實(shí)參的類(lèi)型必須與對(duì)應(yīng)的類(lèi)型匹配,或者可以被隱式轉(zhuǎn)換為對(duì)應(yīng)的形參類(lèi)型。這里我們?cè)僬{(diào)用f(4.2)時(shí),排除了1、4、5號(hào)函數(shù),只剩下2與3。其中2號(hào)函數(shù)可以通過(guò)類(lèi)型轉(zhuǎn)換來(lái)滿(mǎn)足。

第三步:尋找最佳匹配

在經(jīng)過(guò)第二步確定后,剩下2與3函數(shù),那么2需要進(jìn)行類(lèi)型轉(zhuǎn)換,顯然3是最佳匹配了。

但是如果這樣調(diào)用f(42,4.2)。這時(shí)候就會(huì)出現(xiàn)二義性,編譯器將提示。

還有一種要注意的就是有默認(rèn)參數(shù)的函數(shù),比如我們定義6號(hào)函數(shù)為void f(double,int =1);那么在調(diào)用f(4.2)時(shí)就會(huì)有二義性。

可基于函數(shù)的引用形參是指向const對(duì)象還是指向非const對(duì)象實(shí)現(xiàn)函數(shù)重載。

相關(guān)文章

  • C語(yǔ)言之飛機(jī)大戰(zhàn)游戲

    C語(yǔ)言之飛機(jī)大戰(zhàn)游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言之飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++實(shí)現(xiàn)車(chē)票管理系統(tǒng)

    C++實(shí)現(xiàn)車(chē)票管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)車(chē)票管理系統(tǒng),連接數(shù)據(jù)庫(kù)MySQL,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 一文學(xué)會(huì)數(shù)據(jù)結(jié)構(gòu)-堆

    一文學(xué)會(huì)數(shù)據(jù)結(jié)構(gòu)-堆

    本文主要介紹了數(shù)據(jù)結(jié)構(gòu)-堆,文中通過(guò)圖片和大量的代碼講解的非常詳細(xì),需要學(xué)習(xí)的朋友可以參考下這篇文章,希望可以幫助到你
    2021-08-08
  • C語(yǔ)言逆向分析語(yǔ)法超詳細(xì)分析

    C語(yǔ)言逆向分析語(yǔ)法超詳細(xì)分析

    這篇文章主要介紹了C語(yǔ)言逆向分析語(yǔ)法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-11-11
  • C語(yǔ)言棧的表示與實(shí)現(xiàn)實(shí)例詳解

    C語(yǔ)言棧的表示與實(shí)現(xiàn)實(shí)例詳解

    這篇文章主要介紹了C語(yǔ)言棧的表示與實(shí)現(xiàn),對(duì)于數(shù)據(jù)結(jié)構(gòu)與算法的研究有一定的借鑒價(jià)值,需要的朋友可以參考下
    2014-07-07
  • C++實(shí)現(xiàn)俄羅斯方塊源碼

    C++實(shí)現(xiàn)俄羅斯方塊源碼

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)俄羅斯方塊源碼完整版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++實(shí)現(xiàn)AVL樹(shù)的基本操作指南

    C++實(shí)現(xiàn)AVL樹(shù)的基本操作指南

    AVL樹(shù)是高度平衡的而二叉樹(shù),它的特點(diǎn)是AVL樹(shù)中任何節(jié)點(diǎn)的兩個(gè)子樹(shù)的高度最大差別為1,下面這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)AVL樹(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • C++模擬實(shí)現(xiàn)string的方法詳解

    C++模擬實(shí)現(xiàn)string的方法詳解

    標(biāo)準(zhǔn)庫(kù)類(lèi)型string表示可變長(zhǎng)的字符序列,使用string類(lèi)型必須首先包含string的頭文件。本文將利用C++模擬實(shí)現(xiàn)string,需要的可以參考一下
    2022-11-11
  • C++泛型編程綜合講解

    C++泛型編程綜合講解

    泛型編程與面向?qū)ο缶幊痰哪繕?biāo)相同,即使重用代碼和抽象通用概念的技術(shù)更加簡(jiǎn)單。但是面向?qū)ο缶幊虖?qiáng)調(diào)編程的數(shù)據(jù)方面,泛型編程強(qiáng)調(diào)的是獨(dú)立于特定數(shù)據(jù)類(lèi)型
    2022-12-12
  • C++ TinyXML解析案例詳解

    C++ TinyXML解析案例詳解

    這篇文章主要介紹了C++ TinyXML解析案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論