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

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

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

2020-05-23 13:48:31
字體:
來源:轉載
供稿:網友

函數中參數的傳遞

這里說的傳遞當然是指 實參是如何傳遞給形參的啦

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

1.非引用形參

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

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

因此,在函數體內對形參的修改不會影響實參的值。

如果形參是指針類型的,那么函數體內是否可以修改指針所指向的對象的值呢?

如果您產生這樣的疑問,表示您很有想法~~~

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

如果函數的形參是非const類型的指針,則函數可以通過指針實現賦值,修改指針所指向對象的值。

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

void use_ptr(const int *p){     //use_ptr這個函數可以讀指針p所指向的對象,但是不可以修改該對象的值}

const形參

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

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

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

1.當需要在函數中修改實參的值時

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

3.當沒有辦法實現對象的復制時

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

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

2.引用形參

引用形參的用法:

1.讓函數修改實參的值

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

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

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

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

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

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

當調用swap(i,j)時,i和j的值才真正實現了交換。

更靈活的指向const的引用

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

傳遞指向指針的引用

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

//交換兩個指向整形的指針的值void ptrswap(int *&v1,int *&v2){       int=*tmp=v2;       v2=v1;       v1=tmp; }

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

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

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

4.數組形參

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

以下定義都是正確的:

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

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

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

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

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

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

方法有三:

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

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

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

5.可變形參

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

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

以上這篇老生常談C++中實參形參的傳遞問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品在线欧美视频| 日本高清+成人网在线观看| 国产这里只有精品| 日本久久中文字幕| 欧美性资源免费| 亚洲精品第一页| 国产精品99久久99久久久二8| 日本午夜精品理论片a级appf发布| 国产女精品视频网站免费| 亚洲高清av在线| 久久99国产精品自在自在app| 一本一本久久a久久精品综合小说| 欧美在线播放视频| 精品视频在线观看日韩| 萌白酱国产一区二区| 欧美午夜精品久久久久久人妖| 亚洲精品国产精品国自产观看浪潮| 国产欧美欧洲在线观看| 亚洲精品国偷自产在线99热| 伊人亚洲福利一区二区三区| 欧美激情极品视频| 欧洲日本亚洲国产区| 大量国产精品视频| 国产91在线播放| 亚洲黄页网在线观看| 91精品国产成人| 欧美日韩国产成人在线| 国产精品一区二区电影| 人人澡人人澡人人看欧美| 蜜月aⅴ免费一区二区三区| 日韩亚洲成人av在线| 亚洲欧美在线第一页| 久久久久国产精品免费网站| 亚洲色图校园春色| 91在线免费网站| 亚洲精品小视频在线观看| 亚洲免费人成在线视频观看| 欧美一级bbbbb性bbbb喷潮片| 日韩av网站大全| 欧美日韩国产丝袜另类| 亚洲免费人成在线视频观看| 国产精品自在线| 深夜精品寂寞黄网站在线观看| 欧美理论在线观看| 亚洲一级免费视频| 国产精品免费久久久久久| 国内成人精品视频| 97精品一区二区三区| 成人激情视频免费在线| 中文字幕精品www乱入免费视频| 成人h视频在线| 欧美激情a∨在线视频播放| 亚洲色图校园春色| 色香阁99久久精品久久久| 国产成人在线一区| 国产欧美欧洲在线观看| 国产精品一区二区久久| 亚洲深夜福利网站| 国产精品一区二区性色av| 日韩少妇与小伙激情| 一区二区三区亚洲| 日日噜噜噜夜夜爽亚洲精品| 奇米成人av国产一区二区三区| 日韩中文理论片| 国产精品2018| 国产suv精品一区二区三区88区| 激情久久av一区av二区av三区| 久久久在线免费观看| 久久久久国产视频| 亚洲欧美国产日韩天堂区| 欧美日韩免费在线观看| 国产视频亚洲视频| 亚洲最大激情中文字幕| 91av成人在线| 91精品国产色综合久久不卡98| 国产一区二区动漫| 久久久久国产精品免费网站| 国产精品女视频| 91tv亚洲精品香蕉国产一区7ujn| 成人春色激情网| 国产亚洲一区二区精品| 国产精品精品国产| 亚洲天堂成人在线| 97精品久久久| 91精品国产亚洲| 97成人精品视频在线观看| 欧美美最猛性xxxxxx| 日本精品久久中文字幕佐佐木| 国产91久久婷婷一区二区| 国产精品欧美日韩一区二区| 国产精品亚洲美女av网站| 欧美精品一本久久男人的天堂| 欧美壮男野外gaytube| 亚洲白拍色综合图区| 久久天天躁夜夜躁狠狠躁2022| 精品日本美女福利在线观看| 国产欧美精品日韩| 欧洲成人性视频| 91麻豆国产精品| 国产精品亚洲视频在线观看| 北条麻妃在线一区二区| 日韩一区二区欧美| 国产精品成人播放| 日本精品性网站在线观看| 国产91色在线播放| 国产成人精品久久二区二区| 国产成人jvid在线播放| 欧美日韩裸体免费视频| 久久人人爽亚洲精品天堂| 久久精品视频播放| 欧美极品少妇全裸体| 在线中文字幕日韩| 亚洲第一黄色网| 午夜欧美不卡精品aaaaa| 欧美日韩国产综合新一区| 国产亚洲人成a一在线v站| 欧美华人在线视频| 狠狠色狠色综合曰曰| 4444欧美成人kkkk| 久久综合电影一区| 欧美日韩精品在线播放| 欧美成人精品一区二区三区| 一区二区日韩精品| 这里精品视频免费| 久久久国产精品亚洲一区| 久久久亚洲精选| 国产一区二区黑人欧美xxxx| 国产成人精品视频在线观看| 国模gogo一区二区大胆私拍| 精品免费在线视频| 成人激情综合网| 欧美不卡视频一区发布| 国产欧美一区二区白浆黑人| 性欧美视频videos6一9| 91精品综合久久久久久五月天| 日韩欧美国产黄色| 97久久伊人激情网| 亚洲性夜色噜噜噜7777| 欧美成人免费播放| 亚洲理论片在线观看| 亚洲精品影视在线观看| 欧美视频中文字幕在线| 久久久久久网址| 久久精品亚洲国产| 国语自产在线不卡| 国产在线久久久| 久久久免费观看视频| 亚洲欧美在线第一页| 国产成人激情小视频| 成人精品视频久久久久| 日韩中文字幕在线观看| 91精品在线观看视频| 午夜精品久久久久久久久久久久久| 668精品在线视频| 韩国v欧美v日本v亚洲| 中文字幕日韩欧美在线视频| 精品在线欧美视频| 国产69久久精品成人看| 欧美大全免费观看电视剧大泉洋| 日韩有码在线播放| 欧美国产日产韩国视频| 欧美视频一区二区三区…| 欧美日韩一区二区免费在线观看| 伊人久久久久久久久久|