函式呼叫的议决.PPT

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
函式呼叫的议决

物件導向程式語言講義(Scope Lifetime) 靜宜大學資訊管理學系 蔡奇偉 副教授編製 Overloaded Functions 前言 處理多載函式宣告的規則 處理多載函式呼叫的規則 多載函式與 scope 函式呼叫的議決 前言 處理多載函式宣告的規則 多載函式與 scope 函式呼叫的議決 引數提昇轉換的規則 引數標準轉換的規則 多引數的呼叫 使用強制的型態轉換 * C 語言規定:函式的名稱不可相同。這樣的規定使得我們必須為功能相近但參數型態相異的函式取不同的名稱,譬如: int imax (int, int); // max function for integer double dmax (double , double ); // max function for double 這種命名方式顯然無益於程式的可讀性。C++ 因而解除這個限制,讓函式的名稱可以重複使用,譬如: int max (int, int); // max function for integers double max (double , double ); // max function for integers 這種同名的函式稱之為多載函式(overloaded function)。 程式原始檔中的同名函式可能造成以下四種狀況: 成為合法的多載函式。 成為函式的再次宣告。 產生編譯上的錯誤。 內層的函式宣告隱蓋了外層的同名函式宣告。 在同一個 scope 中,C++ 編譯器會採用以下的規則來處理同名函式的宣告: 若參數的型態或個數不同的話,則這些同名函式被視為多載函式。譬如: // overloaded functions void print (); void print (int); void print (double); 若傳回值型態以及參數型態和個數都相同的話,則宣告在後的函式被視為再次宣告(redeclaration)。譬如: // redeclaration void print (const string str); void print (const string ); 若參數型態和個數都相符但傳回值型態不同的話,則宣告在後的函式會產生編譯錯誤。譬如: void print (const string str); int print (const string ); // compile error 若只是引數預設值不相同的話,則宣告在後的函式被視為再次的宣告。譬如: int max (int *ia, int sz); int max (int *ia, int sz = 10); // redeclaration 由於 typedef 只是提供某種資料型態的別名,而非真正引介新的資料型態,所以資料型態的別名和所指涉的資料型態會被視為相同的型態。譬如:底下的第二個宣告會造成編譯錯誤: typedef double real; real calc (real); int calc (double); // compile error 若修飾字 const 不影響參數的唯讀性,則不被用來區別參數的型態。譬如以下兩行被視為宣告相同的函式: void foo (int); void foo (const int); // redeclaration 若修飾字 const 用於指標或參照,則會被用來區別參數的型態,而形成多載函式。譬如: // 宣告兩個不同的函式 void foo (int *); void foo (const int*); // 宣告兩個不同的函式 void foo (int ); void foo (const int); 在相同 scope 的同名函式才會成為多載函式。內層的函式宣告只是隱蓋外層的同名函式宣告,而不是後者的多載函式。譬如: void print (const char *); void print (double); // overloads print() void fooBar (int iVal) { // hide global print() extern void print (int); print(Value: ); // error: print(const char*) is hidden print(iVal); // ok } 開放名稱空間時,同名函式必須符合前述的多載化規定才會形成多載函式,否則會造成編譯的錯誤。我們用以下的幾個例子來說明之。假定名稱空間 IBM 的宣告如下: namespace IBM { void print (int); void print (double); } 以下兩行是正確的: void

文档评论(0)

fengruiling + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档