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

老生常談C++中實參形參的傳遞問題

 更新時間:2017年03月14日 10:12:02   投稿:jingxian  
下面小編就為大家?guī)硪黄仙U凜++中實參形參的傳遞問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

函數(shù)中參數(shù)的傳遞

這里說的傳遞當(dāng)然是指 實參是如何傳遞給形參的啦

還挺復(fù)雜的~~~~~~~~⊙﹏⊙b汗,這里講述了4種參數(shù)傳遞的情況和注意事項:

1.非引用形參

這是最普通,也是最簡單的形參傳遞了。

參數(shù)傳遞,即是使用實參副本(注意啊,是副本,不是實參本身)來初始化形參;

因此,在函數(shù)體內(nèi)對形參的修改不會影響實參的值。

如果形參是指針類型的,那么函數(shù)體內(nèi)是否可以修改指針?biāo)赶虻膶ο蟮闹的兀?/p>

如果您產(chǎn)生這樣的疑問,表示您很有想法~~~

答案是~~~需要分情況討論。

如果函數(shù)的形參是非const類型的指針,則函數(shù)可以通過指針實現(xiàn)賦值,修改指針?biāo)赶驅(qū)ο蟮闹怠?/p>

所以,如果需要保護(hù)指針指向的值,則形參需定義為指向const對象的指針(注意了,這里的指針依然是非const型的,只是其指向的對象是const型的):

void use_ptr(const int *p)

{

     //use_ptr這個函數(shù)可以讀指針p所指向的對象,但是不可以修改該對象的值

}

const形參

如果函數(shù)使用的是非引用非const形參,則既可以給該它傳遞const實參,也可傳遞非const實參。

如果函數(shù)使用的是非引用const形參,也是既可以給該它傳遞const實參,也可傳遞非const實參。那么這兩者的差別是什么呢?對于后者,函數(shù)連實參的局部副本都不可以改變了。下面是第二種情況的一個例子: void fcn(const int i) {}

復(fù)制實參的局限性:復(fù)制實參不是在所有的情況下都適合,不是一復(fù)制實參的情況如下:

1.當(dāng)需要在函數(shù)中修改實參的值時

2.當(dāng)需要以大型對象作為實參傳遞時。對實際的應(yīng)用而言,復(fù)制對象所付出的時間和存儲空間代價往往過大

3.當(dāng)沒有辦法實現(xiàn)對象的復(fù)制時

對于上述幾種情況,有效的解決辦法是將形參定義為引用或指針類型。

(終于說完這個最簡單的傳遞方式了,╮(╯▽╰)╭)

2.引用形參

引用形參的用法:

1.讓函數(shù)修改實參的值

2.向主調(diào)函數(shù)返回額外的結(jié)果(本來return就可以返回一個值給主調(diào)函數(shù),而且引用參數(shù)可以改變實參的值,所以相當(dāng)于返回了額外的結(jié)果)

3.利用const引用避免復(fù)制(當(dāng)向函數(shù)傳遞大型對象時,需要使用引用來提高效率,如果使用引用形參的唯一目的是避免復(fù)制實參,則應(yīng)將形參定義為const引用)

這是一個不適宜復(fù)制實參的例子,該函數(shù)希望交換兩個實參的值

    void swap (int v1,int v2)

    {

      int tmp=v1;

      v2=v1;

      v1=tmp;

    }

這個例子期望改變實參本身的值,但是swap無法影響實參本身,執(zhí)行swap時,指示交換了其實參的局部副本,對實參根本沒有改變。解決的方法是:將形參定義為引用類型。

void swap (int &v1,int &v2)

{

      int tmp=v1;

      v2=v1;

      v1=tmp;

}

當(dāng)調(diào)用swap(i,j)時,i和j的值才真正實現(xiàn)了交換。

更靈活的指向const的引用

應(yīng)該將不需要修改的引用形參定義為const引用。普通的非const引用形參在使用時不大靈活。非const引用形參既不能用const對象初始化,也不能用字面值或者產(chǎn)生右值的表達(dá)式實參初始化。(如果函數(shù)的形參是非const引用形參,表示在函數(shù)體內(nèi)可能會修改該形參值,即會修改實參的值,因此不可以用const對象來做實參傳遞給這樣的函數(shù),所以不靈活。)

傳遞指向指針的引用

如果想編寫一個與前面交換兩個整數(shù)的swap類似的函數(shù),實現(xiàn)兩個指針的交換。已知需用*定義指針,用&定義引用,問題在于,如何將這兩個操作符結(jié)合起來一獲得指向指針的引用。

//交換兩個指向整形的指針的值

void ptrswap(int *&v1,int *&v2)

{
       int=*tmp=v2;
       v2=v1;
       v1=tmp;
 }

形參int *&v1的定義,應(yīng)該從右至左的理解:v1是一個引用,與指向int型對象的指針相關(guān)聯(lián)。也就是說,v1只是傳遞ptrswap函數(shù)的任意指針的別名。

3.vector和其他容器類型的形參

由于復(fù)制vector會使得效率降低,多以如果形參是vector的話,我們常常將該形參聲明為引用,避免復(fù)制。另一種方法在C++中更為常用,就是通過傳遞指向容器中需要處理的元素的迭代器來傳遞容器。

4.數(shù)組形參

由于數(shù)組是不可以復(fù)制的,所以不可以定義使用數(shù)組類型形參的函數(shù)。如果函數(shù)需要使用數(shù)組作為形參,那么就要通過操縱指向數(shù)組中元素的指針來處理數(shù)組。

以下定義都是正確的:

void printValues(int*){}
void printValues(int[]){}
void printValues(int[10]){}

注意了,雖然不能直接傳遞數(shù)組,但是函數(shù)的形參可以寫成數(shù)組的形式。上面三種定義是等價的,形參類洗個都是int*。

通常,將數(shù)組形參直接定義為指針要比使用數(shù)組語法定義更好。這樣就明確地表示,函數(shù)操縱的是指向數(shù)組元素的指針,而不是數(shù)組本身。由于忽略了數(shù)組長度,形參定義中如果包含了數(shù)組長度則特別容易引起誤解。

對于非引用型形參來說,編譯器檢查數(shù)組形參關(guān)聯(lián)的實參時,它只會檢查實參是不是指針、指針的形參和數(shù)組元素的類型是否匹配,而不會檢查數(shù)組的長度,所以即使實參數(shù)組的長度與形參不匹配時,編譯也可以通過,但是在調(diào)用時會出錯。

但是對于引用型形參來說,編譯器還會檢查是西安數(shù)組的大小與形參的大小是否匹配,所以如果實參數(shù)組的長度與形參不匹配,編譯時就會報錯。

如何確保函數(shù)的操作不超出數(shù)組實參的邊界?

方法有三:

1.在數(shù)組本身放置一個標(biāo)記來檢測數(shù)組的結(jié)束。C風(fēng)格字符串就是采用這個方法的一個例子,它是一個字符數(shù)組,并且以空字符null作為結(jié)束的標(biāo)記。處理C風(fēng)格字符串的程序就是使用這個標(biāo)記停止數(shù)組元素的處理。

2.使用標(biāo)準(zhǔn)庫規(guī)范,傳遞指向數(shù)組第一個和最后一個元素的下一個位置的指針。void printValues(const int *beg, const int *end){},如果定義int j[2]={0,1},在調(diào)用該函數(shù)時,printValues(j,j+2).

3.顯式傳遞表示數(shù)組大小的形參。void printValues(const int ia[], size_t size){}

5.可變形參

C++中的省略符形參是為了編譯使用了varargs的C語言程序。

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

以上這篇老生常談C++中實參形參的傳遞問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++實現(xiàn)大數(shù)相乘算法

    C++實現(xiàn)大數(shù)相乘算法

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)大數(shù)相乘算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • C++中sort函數(shù)的基礎(chǔ)入門使用教程

    C++中sort函數(shù)的基礎(chǔ)入門使用教程

    這篇文章主要給大家介紹了關(guān)于C++中sort函數(shù)的基礎(chǔ)入門使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧
    2018-12-12
  • 詳解如何將Spire.PDF for C++集成到C++程序中

    詳解如何將Spire.PDF for C++集成到C++程序中

    Spire.PDF for C++ 是一個專業(yè)的 PDF 庫,供開發(fā)人員在任何類型的 C++ 應(yīng)用程序中閱讀、創(chuàng)建、編輯和轉(zhuǎn)換 PDF 文檔,本文主要介紹了兩種不同的方式將 Spire.PDF for C++ 集成到您的 C++ 應(yīng)用程序中,希望對大家有所幫助
    2023-11-11
  • C語言中auto,register,static,const,volatile的區(qū)別詳細(xì)解析

    C語言中auto,register,static,const,volatile的區(qū)別詳細(xì)解析

    以下是對C語言中auto,register,static,const,volatile的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • C++11時間日期庫chrono的使用

    C++11時間日期庫chrono的使用

    chrono是C++11中新加入的時間日期操作庫,可以方便地進(jìn)行時間日期操作,本文詳細(xì)的介紹了一下如何使用,感興趣的可以了解一下
    2022-01-01
  • 關(guān)于C++讀入數(shù)字按位取出與進(jìn)制轉(zhuǎn)換問題(典型問題)

    關(guān)于C++讀入數(shù)字按位取出與進(jìn)制轉(zhuǎn)換問題(典型問題)

    這篇文章主要介紹了關(guān)于C++讀入數(shù)字按位取出與進(jìn)制轉(zhuǎn)換問題,是一個非常典型的問題,本文通過實例舉例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2020-02-02
  • C++四種case的詳細(xì)介紹小結(jié)

    C++四種case的詳細(xì)介紹小結(jié)

    本文主要介紹了C++四種case的詳細(xì)介紹小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 使用Cline+deepseek實現(xiàn)VsCode自動化編程

    使用Cline+deepseek實現(xiàn)VsCode自動化編程

    Cline是一個免費(fèi)且強(qiáng)大的VSCode插件,可以接入多種大模型API進(jìn)行對話式編程,本文主要介紹了使用Cline+deepseek實現(xiàn)VsCode自動化編程,具有一定的參考價值,感興趣的可以了解一下
    2025-01-01
  • C++之const限定符詳解

    C++之const限定符詳解

    這篇文章主要為大家介紹了C++之const限定符,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C++設(shè)計模式編程之Flyweight享元模式結(jié)構(gòu)詳解

    C++設(shè)計模式編程之Flyweight享元模式結(jié)構(gòu)詳解

    這篇文章主要介紹了C++設(shè)計模式編程的Flyweight享元模式結(jié)構(gòu),享元模式在實現(xiàn)過程中主要是要為共享對象提供一個存放的"倉庫"(對象池),需要的朋友可以參考下
    2016-03-03

最新評論

措美县| 昌平区| 兰考县| 海丰县| 紫金县| 沁源县| 衡东县| 孙吴县| 桂东县| 灵璧县| 鹰潭市| 宣城市| 安丘市| 蚌埠市| 阳泉市| 白银市| 利津县| 灵台县| 闵行区| 台南县| 南开区| 凤翔县| 宜良县| 永安市| 清徐县| 浑源县| 揭东县| 龙口市| 鄂托克前旗| 句容市| 瓮安县| 明星| 高平市| 宜君县| 宝兴县| 牡丹江市| 普格县| 壶关县| 甘南县| 沛县| 高邮市|