最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

一、參數(shù)傳遞

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

1,非引用形參

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

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

復制代碼 代碼如下:

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

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

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

2)指針形參

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

復制代碼 代碼如下:

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中調(diào)用swap,實際上swap并不能改變p1與p2的值,只是改變了它們所指向的值。

3)const 形參

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

復制代碼 代碼如下:

void fcn(const int i);

2,引用形參

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

復制代碼 代碼如下:

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

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

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

復制代碼 代碼如下:

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

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

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

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

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

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

3,其他類型的形參

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

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

復制代碼 代碼如下:

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)沒有返回值

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

2)返回非引用類型

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

3)返回引用

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

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

三、重載函數(shù)

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

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

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

復制代碼 代碼如下:

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

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

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

2)重載與作用域

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

復制代碼 代碼如下:

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

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

3)重載確定的三個步驟

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

復制代碼 代碼如下:

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)可見,上面例子中5個函數(shù)都滿足。

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

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

第三步:尋找最佳匹配

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

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

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

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

相關文章

  • C++實現(xiàn)LeetCode(145.二叉樹的后序遍歷)

    C++實現(xiàn)LeetCode(145.二叉樹的后序遍歷)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(145.二叉樹的后序遍歷),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++手擼智能指針的教程分享

    C++手擼智能指針的教程分享

    在前文中小編為大家介紹了C++智能指針的一些使用方法和基本原理,所以本文就來自己動手,從0到1實現(xiàn)一下自己的unique_ptr和shared_ptr吧
    2023-05-05
  • C語言超詳細講解輪轉(zhuǎn)數(shù)組

    C語言超詳細講解輪轉(zhuǎn)數(shù)組

    這篇文章主要給大家講解輪轉(zhuǎn)數(shù)組的問題,一個問題不局限于一種解法,希望你看了本文的解決方法以后可以舉一反三自己編寫,這樣你的技術水平會有質(zhì)的提高
    2022-04-04
  • C++移動操作,RVO和NRVO詳細

    C++移動操作,RVO和NRVO詳細

    本文將討論了何時C++會自動進行移動操作,并且說明了復制消除,RVO和NRVO優(yōu)的化等香瓜吧資料,需要的小伙伴可以參考一下
    2021-09-09
  • C++類與對象的重點知識點詳細分析

    C++類與對象的重點知識點詳細分析

    類和對象是兩種以計算機為載體的計算機語言的合稱。對象是對客觀事物的抽象,類是對對象的抽象。類是一種抽象的數(shù)據(jù)類型;變量就是可以變化的量,存儲在內(nèi)存中—個可以擁有在某個范圍內(nèi)的可變存儲區(qū)域
    2023-02-02
  • c++標準輸入輸出流關系的前世今生

    c++標準輸入輸出流關系的前世今生

    這篇文章主要給大家介紹了關于c++標準輸入輸出流關系的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • 使用root權限運行自己所編譯程序的解決方法

    使用root權限運行自己所編譯程序的解決方法

    本篇文章介紹了,使用root權限運行自己所編譯程序的解決方法。需要的朋友參考下
    2013-05-05
  • OpenCV邊緣提取算法流程的實現(xiàn)(附DEMO)

    OpenCV邊緣提取算法流程的實現(xiàn)(附DEMO)

    本文主要介紹了OpenCV邊緣提取算法流程的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • vs2019 Com組件初探之簡單的COM編寫及實現(xiàn)跨語言調(diào)用的方法

    vs2019 Com組件初探之簡單的COM編寫及實現(xiàn)跨語言調(diào)用的方法

    這篇文章主要介紹了vs2019 Com組件初探之簡單的COM編寫及實現(xiàn)跨語言調(diào)用的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • C++ DLL動態(tài)庫的創(chuàng)建與調(diào)用(類庫,隱式調(diào)用)

    C++ DLL動態(tài)庫的創(chuàng)建與調(diào)用(類庫,隱式調(diào)用)

    本文主要介紹了C++ DLL動態(tài)庫的創(chuàng)建與調(diào)用(類庫,隱式調(diào)用),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評論

讷河市| 兰溪市| 西华县| 绥中县| 苍山县| 南陵县| 临夏县| 澎湖县| 延吉市| 上饶市| 陈巴尔虎旗| 元江| 凤台县| 乌兰浩特市| 临高县| 滕州市| 阿鲁科尔沁旗| 昭平县| 澳门| 松溪县| 临猗县| 阳东县| 微博| 新干县| 禄劝| 长海县| 浦县| 邢台市| 福清市| 张家界市| 兴城市| 汝州市| 东兰县| 永安市| 桓台县| 文登市| 武鸣县| 屯昌县| 丰顺县| 西华县| 隆回县|