參數(shù)傳遞(一)

函數(shù)的形參一共分為兩種:

  1. 當形參類型是引用類型的時候,我們說它對應(yīng)的實參被引用傳遞或者說函數(shù)被傳引用調(diào)用写半。
  2. 當形參類型是非引用類型的時候岸蜗,我們說它對應(yīng)的實參被傳值傳遞或者是或函數(shù)被傳值調(diào)用。

傳值參數(shù)

當初始化一個非引用類型的變量的時候叠蝇,初始值被拷貝給變量璃岳。這時候?qū)ψ兞窟M行的操作不會影響初始值:

int n = 0;
int i = n;      //i是n的副本
i = 42;        //i的值改變,n的值不變

傳值參數(shù)的機理完全是一樣的蟆肆,函數(shù)對形參做的所有的操作都不會影響實參,比如:

int fact(int val)
{
    int ret = -1;
    while(val > 1)
        ret *= val--;
    return ret;
}

在上述代碼中晦款,盡管fact函數(shù)改變了val的值炎功,但是這個改動并不會改變傳入fact的實參。

指針形參

指針的行為和其他非引用類型一樣缓溅。但是我們要知道蛇损,指針的實質(zhì)是指向某個變量的地址,盡管我們對指針的形參的修改不會影響到實參坛怪,但是我們可以通過指針修改它所指向的對象的值:

int n = 0, i = 42;
int *p = &n, *q = &i;            //p指向n淤齐,q指向i
*p = 42;                             //n的值改變,但是p不變
p = q;                                 //p是q的副本袜匿,p指向i更啄,但是i和n的值都不變

指針形參也是類似:

void reset(int *ip)
{
    *ip = 0;                    //改變ip所指向的對象的值
    ip = 0;                     //改變了局部ip的拷貝,實參沒有被改變
}

在上述代碼當中居灯,實參所指的對象變?yōu)?祭务,但是實參本身并沒有改變。

傳引用參數(shù)

就像我們知道的那樣怪嫌,對于引用的操作實際上是作用在引用所綁定的對象上义锥,下面就讓我們看一下代碼:

void reset(int &i)
{
    i = 0;              //改變了i所引對象的值
}

當我們調(diào)用上述版本的reset()函數(shù)的時候,i綁定我們傳給函數(shù)的int對象岩灭,此時改變i的值就是改變i所引對象的值拌倍。

使用引用避免拷貝

當我們拷貝大的類型對象或者容器對象的時候比較低效,甚至有的類型根本不支持拷貝操作噪径,例如IO類型柱恤,這時候我們只能用引用形參來訪問該類型對象。
比如找爱,我們準備編寫一個函數(shù)接受兩個string類型的時候膨更,想比較他們的長度性誉,這時候我們拷貝的話效率過低茫负,可以考慮傳引用,這時候我們知道我們并不需要修改原實參蚤告,所以我們可以使用對常量的引用:

bool isShorter(const string &s1, const string &s2)
{
    return s1.size() < s2.size();
}
使用引用形參返回額外的信息

我們知道,一個函數(shù)只能返回一個值矗漾,然而有時候函數(shù)需要同時返回多個值锈候,引用形參可以巧妙的解決這個問題。
例如敞贡,我們需要返回string對象中某個指定字符第一次出現(xiàn)的位置泵琳,同時也想要返回字符出現(xiàn)的總次數(shù):

string::size_type find_char(const string &s, char c, string::size_type &occurs)
{
    auto ret = s.size();
    ocurrs = 0;
    for(decltype(ret) i = 0; i != s.size(); ++i)
    {
        if(s[i] == c)
        {
            if(ret == s.size())
               ret = i;
           ++ocurrs
        }
    }
    return ret;
}

上述代碼return了字符出現(xiàn)的位置,但是我們的形參有一個引用類型的:occurs誊役,他可以直接讓我們知道字符出現(xiàn)字數(shù)获列。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛔垢,隨后出現(xiàn)的幾起案子击孩,更是在濱河造成了極大的恐慌,老刑警劉巖鹏漆,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巩梢,死亡現(xiàn)場離奇詭異,居然都是意外死亡艺玲,警方通過查閱死者的電腦和手機括蝠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饭聚,“玉大人忌警,你說我怎么就攤上這事∶胧幔” “怎么了慨蓝?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長端幼。 經(jīng)常有香客問我礼烈,道長,這世上最難降的妖魔是什么婆跑? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任此熬,我火速辦了婚禮,結(jié)果婚禮上滑进,老公的妹妹穿的比我還像新娘犀忱。我一直安慰自己,他們只是感情好扶关,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布阴汇。 她就那樣靜靜地躺著,像睡著了一般节槐。 火紅的嫁衣襯著肌膚如雪搀庶。 梳的紋絲不亂的頭發(fā)上拐纱,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音哥倔,去河邊找鬼秸架。 笑死,一個胖子當著我的面吹牛咆蒿,可吹牛的內(nèi)容都是我干的东抹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼沃测,長吁一口氣:“原來是場噩夢啊……” “哼缭黔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒂破,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤馏谨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后寞蚌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體田巴,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡钠糊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年挟秤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抄伍。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡艘刚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出截珍,到底是詐尸還是另有隱情攀甚,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布岗喉,位于F島的核電站秋度,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钱床。R本人自食惡果不足惜荚斯,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望查牌。 院中可真熱鬧事期,春花似錦、人聲如沸纸颜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胁孙。三九已至唠倦,卻和暖如春称鳞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牵敷。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工胡岔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枷餐。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓靶瘸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親毛肋。 傳聞我的和親對象是個殘疾皇子怨咪,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容