生存空間和生命週期以及多載化函式.ppt_第1页
生存空間和生命週期以及多載化函式.ppt_第2页
生存空間和生命週期以及多載化函式.ppt_第3页
生存空間和生命週期以及多載化函式.ppt_第4页
生存空間和生命週期以及多載化函式.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2019/4/16,生存空間和生命週期以及多載化函式,1,生存空間和生命週期 以及多載化函式,C+ Primer 第三版中文版 Chap 8.18.4 Chap 9,2019/4/16,生存空間和生命週期以及多載化函式,2,C+中有關宣告(declarations)的問題,宣告動作所導入的符號名稱可以在何處使用? 提示:C+ scope(生存空間) 包括 global scope , local scope , namespace scope. 程式何時可以安全使用object或函式? 提示:object的生命週期 global: 能夠維持生命到整個程式結束為止. local: 只能在程式的部分期間維持生命. 動態配置: 期生命由程式員控制.,2019/4/16,生存空間和生命週期以及多載化函式,3,Local Scope(區域性生存空間),所謂local scope是程式本文的部分範圍. 位於一個函式區塊之內. 每個函式都表現有各自的local scope. 函式中每一個複合敘述句(或說區塊 , block)也表現有它自己的一個local scope. local block scopes可以巢狀出現.,2019/4/16,生存空間和生命週期以及多載化函式,4,Local Scope範例,int binarySearch(int val,) / binarySearchs scope start int a; / scope包含binarySearch,while,if. while() / while loop scope start int b; / scope 包含 while,if. if() / if statement scope start int c; / scope 包含 if. / if statement scope end / while loop scope end /binarySearchs scope end,2019/4/16,生存空間和生命週期以及多載化函式,5,全域物件(Global Objects) & 全域函式(Global Functions),函式如果宣告在於global scope中,便是一個全域函式. 變數如果宣告在於global scope中,便是一個全域物件. 全域物件是整個程式執行期間都存在的一個物體,生命期從程式啟動開始,直到程式結束. 全域物件和non-inline全域函式在程式中都只能定義一次.,2019/4/16,生存空間和生命週期以及多載化函式,6,extern宣告式,讓多個.cpp檔案組成的程式能使用同一個object. 寫法: extern 資料型別 物件名稱; 使用extern並不會再額外配置記憶體. 可放置於表頭檔中. 範例程式: ExternDemo.cpp,2019/4/16,生存空間和生命週期以及多載化函式,7,Local Objects(區域性物件),Automatic Objects(自動配置與釋放的襪件) Register Automatic Objects(放在暫存器裡的物件) Static Local Objects(靜態的區域性物件) 此三類皆位於Local Scope.,2019/4/16,生存空間和生命週期以及多載化函式,8,Automatic Objects -1,生命週期從宣告之後一直到scope結束. 例如: void main() int a; int b; ,b的生命週期,a的生命週期,2019/4/16,生存空間和生命週期以及多載化函式,9,Automatic Objects -2,承上頁,所以 “ ”可以看做內含釋放所有非由 new 關鍵字建立的object的記憶體的程式碼. 以下是危險的做法: int* trouble() int res; . return /危險的,因為res的記憶體已經被釋放了. ,2019/4/16,生存空間和生命週期以及多載化函式,10,Register Automatic Objects,對於使用量極重的automatic objects,可以用關鍵字register修飾他們. 常見的候選者為迴圈中的counter for( register int i=0;i10000;i+) register是對編譯器的一種請求. 此種object會使用機器暫存器(CPU)來儲存資料,如果不能夠,就使用記憶體儲存.,2019/4/16,生存空間和生命週期以及多載化函式,11,Static Local Objects,生命週期同global object(整個程式期間) object可見度受限於local scope. 初值初始化動作僅做第一次. 範例程式: LocalObjectDemo.cpp 如果宣告時沒有給定初值,則內定初值為0. 驗證程式: LocalObjectInit.cpp,2019/4/16,生存空間和生命週期以及多載化函式,12,動態配置的物件,使用指標和 new , delete 算式. 程式不會自動釋放利用new配置的記憶體,程式設計師必須自行用delete釋放. 如果 delete 的運算元為0 (NULL)的話,就不會執行釋放記憶體的動作. 所以在指標所指的object被刪除之後,把指標設為0是一個好習慣. 驗證程式: DeleteNullDemo.cpp,2019/4/16,生存空間和生命週期以及多載化函式,13,動態記憶體有關的常見錯誤,沒有實施delete算式,造成記憶體沒有歸還給自由空間,亦即所謂的記憶體漏洞(memory leak). 對同一個記憶體位址實施delete算式兩次,通常發生在“兩個指標指向同一塊動態配置之object”的情況下. object被刪除之後又對它做讀寫動作.,2019/4/16,生存空間和生命週期以及多載化函式,14,多載化函式 ( Overloaded Functions ),以下是多載化(Overloaded)之定義: 多個函式名稱相同. 宣告於相同scope中. 各自擁有不同的參數列. 例如: int max(int,int); int max(int ,int); int max(char*,int);,2019/4/16,生存空間和生命週期以及多載化函式,15,編譯器對同名函式的解讀-1,在之後的四頁皆是同一個scope. 如果兩個函式的參數列不同(不論是參數個數不同或其型別不同),這兩個函式便被視為多載化. 例如: /overloaded function void print(char*); void print(string,2019/4/16,生存空間和生命週期以及多載化函式,16,編譯器對同名函式的解讀-2,如果兩個函式宣告的傳回值型別和參數列都完全相同,那麼第二個函式會被視為第一個函式的重複宣告. 例如: /宣告相同的函式 void print(char* str); void print(char*);,2019/4/16,生存空間和生命週期以及多載化函式,17,編譯器對同名函式的解讀-3,如果兩個函式的參數列完全相同,但是傳回值型別不同,那麼第二個函式會被視為第一個函式的錯誤性重複宣告,並在編譯時期被標示出來. 單單“函式的傳回值型別”,不足以區分兩個多載化函式. 例如: unsigned int max(int,int); int max(int,int); /error.,2019/4/16,生存空間和生命週期以及多載化函式,18,編譯器對同名函式的解讀-4,如果兩個函式的參數列只有預設引數不同,那麼第二個函式會被視為第一個函式的重複宣告. 例如: /宣告相同的函式 int max(int*,int); int max(int*,int=10); 範例程式: OverLoadDemo.cpp,2019/4/16,生存空間和生命週期以及多載化函式,19,typedef所造成的型別問題,typedef可以為即有的資料型別,提供另一個型別名稱,但並非產生新的型別. 所以下列是相同的重複宣告: typedef double DOLLAR; DOLLAR calc(DOLLAR); double calc(double); 驗證程式: TypedefOLDemo.cpp,2019/4/16,生存空間和生命週期以及多載化函式,20,什麼時候不需要將函式多載化?,如果不同的函式名稱所帶來的訊息可以讓程式更容易被人了解,那麼就不需要為函式做多載化. 通常多載化函式,用在一群有相同動作的函式.,2019/4/16,生存空間和生命週期以及多載化函式,21,多載決議程序的三個步驟,步驟一:確認此一函式呼叫動作所對應的多載函式集合,並確認函式呼叫動作中的引數列性質. 步驟二:從多載函式集中挑選出可被呼叫的函式. 步驟三:選擇與呼叫動作最匹配的函式.,2019/4/16,生存空間和生命週期以及多載化函式,22,多載決議程序範例-1,範例程式片斷: void f(); void f(int); void f(double,double=3.4); void f(char*,char*); void main() f(5.6); 對於f(5.6)來進行多載決議程序.,2019/4/16,生存空間和生命週期以及多載化函式,23,多載決議程序範例-2,根據步驟一可找到多載函式的集合: f(); f(int); f(double,double); f(char*,char*); 另外並且確定f(5.6)的引數為double型別.,2019/4/16,生存空間和生命週期以及多載化函式,24,多載決議程序範例-3,根據步驟二可得下列函式可被呼叫: f(int); /double可轉換成int f(double,double); /第二個參數有設預設引數 如果在此步驟沒有發現可行函式,便會有編譯時期的錯誤,這是一種no match狀態.,2019/4/16,生存空間和生命週期以及多載化函式,25,多載決議程序範例-4,根據步驟三從步驟二中選出的函式再挑選一個最佳可行函式( best viable function ). 最佳可行函式必須符合以下條件: 1.所有引數的轉換行為,不遭於任何其他可行函式所需的轉換行為. 2.某些引數身上的轉換行為,優於其他可行函式身上的相同引數所需的轉換行為.,2019/4/1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论