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