林子杰 函數之參數傳遞 - 當當文章網

一分pk拾

<var id="wrklf"></var>

        <dd id="wrklf"><u id="wrklf"></u></dd>

          林子杰 函數之參數傳遞

          分享:網友作者:來源:網絡2020-05-04 08:25:10
          一、傳值參數

          當初始化一個非引用類型的變量時,初始值被拷貝給變量。此時,對變量的改動不會影響初始值。函數對傳值參數的所有操作都不會影響實參。

          指針形參

          指針的行為和其他非引用類型一樣,當執行指針拷貝操作時,拷貝的時指針的值?截愔蟮膬蓚指針是不同的指針。但因為指針使我們可以間接訪問它所指的對象,所以通過指針可以修改它所指的對象的值。

          在C++語言中,建議使用引用類型的形參替代指針。

          二、傳引用參數

          使用引用參數,允許函數改變一個或多個實參的值。和其他引用一樣,引用形參綁定初始化它的對象。

          使用引用避免拷貝

          拷貝大的類類型的對象或者容器對象比較抵消,甚至一些類類型根本不支持拷貝操作。所以,如果函數無須改變引用形參的值,最好將其聲明為常量引用。

          舉個例子,比較兩個string對象的長度。因為string對象可能會很長,所以應該避免直接拷貝它們,這時使用引用形參比較好。又因為比較長度無需改變其內容,所以把形參第一位常量的引用。

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

          一個函數只能返回一個值,然而有時候函數需要同時返回多個值,引用形參就為我們一個返回多個結果提供了有效的途徑。

          三、const形參和實參

          當實參初始化形參時會忽略掉頂層const,傳給它常量對象或非常量對象都是可以的。

          void function(const int i) { /* function能夠讀取i,但是不能向i寫值 */}

          C++語言中允許定義若干具有相同名字的函數,不過前提是不同的函數的形參列表應該有明顯的區別。因為頂層const被忽略,不能這樣定義第二個函數:

          void function(const int i) {}
          void function(int i) {}
          指針或引用形參與const

          形參的初始化方式與變量的初始化方式是一樣的。我們可以使用非常量初始化一個底層const對象,但是反過來不行,同時一個普通的引用必須用同類型的對象初始化。

          盡量使用常量引用

          把函數不會改變的形參定義成引用是一種常見的錯誤,這么做帶給函數的調用者一種誤導,即函數可以修改它的實參的值。此外,使用引用而非常量引用也會極大地限制函數所能接受的實參類型。

          四、數組形參

          數組有兩個特殊性質:不允許拷貝數組以及使用數組時通常會將其轉換成指針。因為數組會被轉換成指針,所以當我們為函數傳遞一個數組時,實際上傳遞的是指向數組首元素的指針。

          void function(const int*);
          void function(const int[]);
          void function(const int[10]); // 表示期望的元素個數,實際不一定

          因為數組是以指針的形式傳遞給函數的,所以一開始并不知道數組的大小,調用者應該為此提供一些額外的信息。

          使用標記指定數組長度

          此方法的典型示例是C語言風格的字符串,其字符串最后一個字符后面跟著一個空字符串。在處理C語言風格字符串時遇到空字符停止。

          void print(const char *cp)
          {
          if (cp)
          while (*cp)
          cout << *cp++;
          }
          使用標準庫規范

          管理數組實參的第二種方法是傳遞指向數組首元素和尾元素的指針。

          void print(const int *beg, const int *end)
          {
          while (beg != end)
          cout << *beg++ << endl;
          }

          調用方法:

          int number[] = {1, 2, 3, 4, 5};
          print(begin(number), end(number));
          顯式傳遞一個表示數組大小的形參 void print(const int ia[], size_t size)
          {
          for (size_t i = 0; i != size; ++i)
          {
          cout << ia[i] << endl;
          }
          }

          調用方法:

          int number[] = {1, 2, 3, 4, 5};
          print(number, end(number) - begin(number));
          數組形參和const

          當函數不需要對數組元素執行寫操作時,數組形參應該是指向const的指針,只有當函數確實需要改變元素值的時候,才把形參定義為指向非常量的函數。

          數組引用形參

          C++語言允許將變量定義成數組的引用,基于同樣的道理,形參也可以是數組的引用。

          void print(int (&arr)[10])
          {
          for (auto elem : arr)
          {
          cout << elem << endl;
          }
          }
          傳遞多維數組

          所謂的多維數組其實是數組的數組。

          和所有數組一樣,當多維數組中傳遞給函數時,指針傳遞的時指向數組首元素的指針。

          void print(int (*matrix)[10], int rowSize) { /*matrix是指向含有10個整數的數組的指針*/ }
          void print(int matrix[][10], int rowSize) { /*等價于上面的寫法*/ }
          五、處理命令行選項

          命令行選項通過兩個形參傳遞給main函數:

          int main(int argc, char *argv[]) { /* */ }
          int main(int argc, char **argv) { /* */ }

          可選實參從argv[1]開始,argv[0]保存著程序的名稱。

          六、含有可變形參的函數

          有時候我們無法預知應該像函數傳遞幾個實參。為了能處理不同數量實參的函數,C++11新標準提供了兩種的方法:

          initializer_list形參

          如果函數的是參數量未知但是全部實參的類型相同,我們可以使用initializer_list類型的形參。initializer_list是一種標準庫類型,由于表示某種特定類型的值的數組。

          下面是initializer_list提供的操作:

          操作 說明

          initializer_list lst;

          默認初始化T類型元素的空列表

          initializer_list lst{a, b, c...};

          lst初始化是對應的初始化副本,列表中的元素是const

          lst2(lst)

          拷貝一個initializer_list對象不會拷貝列表中的元素,拷貝后,原始列表和副本共享元素

          lst2 = lst

          賦值一個initializer_list對象

          lst.size()

          列表中的元素數量

          lst.begin()

          返回指向lst首元素的指針

          lst.end()

          返回指向lst中尾元素下一位置的指針

          與vector不同的是,initializer_list對象中的元素醫院是常量值,無法修改。

          void error_msg(initializer_list<string> il)
          {
          for (auto beg = il.begin(); beg != il.end(); ++beg)
          {
          cout << *beg << endl;
          }
          }
          省略符形參

          省略符形參是為了便于C++程序訪問某些特殊的C代碼設置的。這些代碼使用了名為varargs的C標準庫功能。通常,省略符形參不應用于其他目的。

          省略符形參應該僅僅用于C和C++的通用的類型。特別應該注意的是,大多數類型的對象在傳遞給省略符形參時都無法正確的拷貝。

          省略符形參只能出現在形參列表的最后一個位置。

          轉載請保留本文連接:http://www.ffcgj.com/society/191088.html

          临潭| 龙泉驿| 淮阴县| 吉首| 武强| 同德| 长丰| 萧山| 华蓥山| 缙云| 寿宁| 鄂托克前旗| 大同| 靖西| 宁波| 鹿寨| 吴江| 大兴| 新巴尔虎右旗| 景洪| 迁安| 柞水| 杭锦后旗| 苏州| 象山| 平罗| 保德| 永吉| 旺苍| 武山| 万源| 陇川| 红柳河| 布拖| 额济纳旗| 同安| 城口| 东沟| 雅布赖| 长岛| 大荔| 桦南| 金阳| 松江| 隆安| 宁陵| 延庆| 徽县| 金佛山| 信阳地区农试站| 冠县| 石首| 德保| 柳河| 土默特左旗| 定陶| 英吉沙| 孪井滩| 盐城| 赞皇| 井研| 丰县| 舒兰| 鄂托克旗| 宜春| 芜湖| 新晃| 抚远| 静宁| 舟曲| 莫索湾| 郧县| 仪陇| 新干| 崇阳| 甘德| 石家庄| 开化| 五寨| 密云上甸子| 富蕴| 恭城| 祁连| 雷波| 蒲江| 崇庆| 武汉| 光泽| 惠东| 平果| 涟源| 石台| 万源| 石楼| 霍山| 偏关| 炉山| 门源| 舒城| 眉山| 柳江| 双柏| 临西| 瓜州| 峡江| 昆山| 渠县| 海原| 乌恰| 招远| 东平| 荔浦| 玉山| 拜城| 彭山| 阿巴嘎旗| 阿木尔| 河南| 莫索湾| 高唐| 赞皇| 庄河| 托克托| 舒兰| 霍州| 塔河| 龙胜| 平鲁| 鹤庆| 茶卡| 黄平| 环江| 神木| 横山| 禹州| 奉新| 原阳| 西峰| 喀喇沁旗| 亳州| 棠荫| 蔡家湖| 舟山| 杭州| 汤原| 玉树| 宁化| 塔河| 天水| 合江| 南澎岛| 个旧| )| 石浦| 康县| 海东| 洪江| 乐都| 东港| 勐海| 淇县| 邕宁| 米脂| 芜湖| 柳林| 庆城| 海宁| 永丰| 兴文| 永定| 浦北| 玉山| 于都| 青川| 睢宁| 广宗| 尼勒克| 大埔| 汕尾| 蚌埠| 凌源| 阿合奇| 桐庐| 阳山| 伊春| 石楼| 泰山| 卓尼| 南靖| 江陵| 兴国| 燕尾港| 太原北郊| 蒲江| 杭锦旗| 盐亭| 南召| 璧山| 阿里| 安达| 崂山| 永新| 井陉| 无极| 洪洞| 武城| 巴林右旗| 灌云| 枣阳| 花都| 会泽| 红柳河| 水城| 科尔沁左翼中旗| 石景山| 那日图| 东方| 兴国| 河曲| 福州郊区| 雅布赖| 浦北| 镇赉| 万州龙宝| 昌都| 罗源| 赤壁| 千阳| 十三间房气象站| 信阳| 太仆寺旗| 田林| 嘉善| 卢龙| 新建| 怒江| 横县| 安泽| 巢湖| 和平| 蓬莱| 鄢陵| 通渭| 西乡| 蓝田| 岗子| 巴雅尔吐胡硕| 灌南| 米泉| 旅顺| 黄石| 宝过图| 北票| 枝江| 资兴| 栖霞| 灵武| 兴文| 渠县| 临沧| 延庆| 大港| 榆社| 鹿邑| 藁城| 鸡西| 南安| 那日图| 瓜州| 阿鲁科尔沁旗| 勉县| 富民| 蒲县| 南召| 宾川| 饶阳| 常山| 南安| 巧家| 冕宁| 云和| 井冈山| 宝坻| 双峰| 丰都| 涟源| 乡宁| 龙泉驿| 隆安| 太康| 察哈尔右翼前旗| 宜阳| 张家口| 象州| 绥棱| 赤峰| 石拐| 衡水| 扎兰屯| 自贡| 南城| 鄱阳| 吉水| 白杨沟| 北塔山| 霍城| 佛冈| 庆云| 锡林高勒| 舍伯吐| 丰城| 河口| 辛集| 凤县| 隆尧| 临淄| 故城| 神池| 延边| 万宁| 鸡泽| 镇沅| 吴忠| 海淀| 中宁| 涠洲岛| 潮阳| 科尔沁左翼后旗| 武山| 富川| 延寿| 本溪县| 镇宁| 郁南| 新余| 潢川| 乌恰| 留坝| 西盟| 霍山| 崇仁| 米林| 威远| 霍尔果斯| 江阴| 绥棱| 天山大西沟| 青龙山| 理县| 台北市| 宿州| 崇仁| 安溪| 荔波| 连云港| 湖州| 洛浦| 乌兰浩特| 呼中| 舒城| 徐水| 双柏| 泊头| 文县| 贺州| 郎溪| 洪雅| 天河| 凉山| 玉山| 稻城| 全州| ??| 南部| 淅川| 清原| 渠县| 平湖| 阳城| 桃园| 平阳| 同江| 安泽| 余杭| 南华| 瓦房店| 灵石| 鄯善| 三门峡| 洞口| 荆门| 特克斯| 华阴| 呼中| 南昌| 莒县| 北票| 安阳| 金山| 库米什