![C++(5)數據的共享與保護_第1頁](http://file4.renrendoc.com/view/dd506c582aaf9b496f0366d8dee124a5/dd506c582aaf9b496f0366d8dee124a51.gif)
![C++(5)數據的共享與保護_第2頁](http://file4.renrendoc.com/view/dd506c582aaf9b496f0366d8dee124a5/dd506c582aaf9b496f0366d8dee124a52.gif)
![C++(5)數據的共享與保護_第3頁](http://file4.renrendoc.com/view/dd506c582aaf9b496f0366d8dee124a5/dd506c582aaf9b496f0366d8dee124a53.gif)
![C++(5)數據的共享與保護_第4頁](http://file4.renrendoc.com/view/dd506c582aaf9b496f0366d8dee124a5/dd506c582aaf9b496f0366d8dee124a54.gif)
![C++(5)數據的共享與保護_第5頁](http://file4.renrendoc.com/view/dd506c582aaf9b496f0366d8dee124a5/dd506c582aaf9b496f0366d8dee124a55.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第5章 數據的共享與保護主要內容標識符的作用域與可見性對象的生存期類的靜態(tài)成員類的友元多文件結構;編譯預處理1作用域作用域就是標識符起作用的范圍標識符只能在其起作用的范圍內被使用。根據標識符起作用的范圍,作用域分為:局部作用域。函數原型作用域塊作用域類作用域全局作用域(文件作用域)2函數原型的作用域函數原型中的參數,其作用域始于(,結束于)例:設有下列原型聲明:double area(double radius);radius 的作用域僅在于此,不能用于程序正文其他地方3塊作用域塊作用域是指標識符起作用的范圍為塊內范圍,在塊內定義的標識符具有塊作用域。塊作用域包括:復合語句塊函數體塊塊內定義的
2、局部變量的作用域是從變量定義起至本塊結束。4void main() int a, b; cinab; if (ab) int t; t=a; a=b; b=t; int c=a*a-b*b; couta*b*c endl; a和b的作用域t的作用域c的作用域5VC6對for循環(huán)變量作用域的規(guī)定不符合標準C+#includeusing namespace std;int main()int sum=0;for(int i=0;i10;i+) sum+=i; coutsum=sumendl;couti=iendl; /在標準C+中,出錯 return 0;6類作用域類作用域的作用范圍介于塊作用域和
3、文件作用域之間類的成員函數可以訪問本類里定義的所有數據成員和函數成員#includeusing namespace std;class Apublic:A(int i,int j):x(i),y(j) void print() int x=1; coutx yendl;private: int x,y;void main()A obj(2,3);obj.print();/coutobj.xendl; /出錯!7文件作用域 文件作用域也即全局作用域,指標識符的作用域為文件范圍。在源文件所有函數之外聲明或定義的標識符具有文件作用域,全局變量和函數名(不包括在其它函數內部聲明原型的函數名)具有全局作
4、用域,起作用的范圍是從聲明或定義點開始,直至其所在文件結束。 8局部變量指函數體內定義的變量和函數的形式參數,它們的作用域就在函數體內,只能在本函數內使用。局部變量隨其所在的函數被調用而被分配內存空間,也隨其所在的函數調用結束而消失,所以使用局部變量能夠提高內存利用率。局部變量只能被其所在的函數訪問,所以這種變量的數據安全性也比較好(不能被其它函數直接讀寫)。局部變量使用頻率最高。局部變量9例: 局部變量應用#includeint main() int i=1; if(i0) int j=3; if(j0) int k(5); couti j kendl; coutiendl; return
5、0;結果:1 3 5110全局變量在函數外部定義的變量為全局變量一個C+的源文件(.cpp)由多個函數組成,全局變量定義之后,能被其后面的所有函數(屬于本源文件的)共用。也就是說全局變量起作用的范圍是從它定義的位置開始至源文件結束。全局變量的作用域是整個源文件(其它的CPP文件也可以通過聲明extern變量,來使用該全局變量)11全局變量全局變量在程序執(zhí)行的整個過程中,始終位于全局數據區(qū)內固定的內存單元;如果程序沒有初始化全局變量,系統(tǒng)會將其初始化為0。在定義全局變量的程序中,全局變量可以被位于其定義之后的所有函數使用(數據共享),這給編程者帶來很大方便;但也因此帶來數據安全性和程序可讀性不好
6、的缺點。在實際編程時不要濫用全局變量。12例:全局變量應用#includeint x, y; int f1(int s) x=10; y=x*s; return x+y;float a, b; void f2() coutx=x y=yendl; return ; 結果:70 x=10 y=60a=0 b=0void main() int m=6, n=9; coutf1(m)endl; f2(); couta=a b=bendl;13可見性 可見性:是從標識符的引用的角度來談的概念,即研究標識符在其作用域內能否被訪問到的問題。標識符在其作用域內,能被訪問到的位置稱其為可見的不能被訪問到的位置
7、稱其為不可見的標識符在其作用域內存在,但是未必可見!14內層標識符與外層標識符同名時,內層標識符可見,外層標識符不可見。對于變量,即內層變量屏蔽外層同名變量。 同名覆蓋如果函數內的局部變量與全局變量同名,且在函數內一定要使用這個同名全局變量,可以用作用域運算符:指定要訪問的全局變量。 塊作用域類作用域文件作用域15例: 作用域與可見性的關系#includeint k=1; /全局量 void main() int k=2; int k=3; coutk=:kendl; coutk=kendl; coutk=kendl; 結果:k=1k=3k=216作用域可見性的一般規(guī)則標識符應該先聲明,后使用
8、。在同一作用域中,不能聲明同名的標識符。不同作用域中可以有同名標識符,互不影響對于兩個嵌套的作用域,如果某個標識符在外層中聲明,且在內層中沒有同一標識符的聲明,則該標識符在內層可見;如果在內層作用域內聲明了與外層作用域中同名的標識符,則外層作用域的標識符在內層不可見。17變量的存儲類型(參見P27)一個變量在內存中存在的時間(生存期)取決于變量的存儲類型C+程序中使用的變量可分為四種存儲類型:auto自動register寄存器extern外部static靜態(tài)18auto型變量包括函數體內部定義的局部變量、函數的形式參數,稱為自動變量。 自動變量因其所在的函數被調用而產生,隨其所在的函數調用結束
9、而消失。因為自動變量存于動態(tài)存儲區(qū),不長時間占據固定內存,有利于內存資源的動態(tài)使用,故程序中大量使用的都是自動變量。19register型變量定義格式: register 類型標識符 變量標識符; 例: register int counter;訪問寄存器中的變量要比訪問內存中的變量速度快,但由于寄存器數量有限,如果設置過多的register型變量,編譯器將把這些變量按普通局部變量處理,依然放在內存空間 20extern關鍵字 提供了不同文件之間數據共享的一種途徑在多文件程序結構中,如果一個文件中的函數需要使用其它文件里定義的全局變量,可以用extern關鍵字聲明所要用的全局變量。 /int
10、x,y;void main() /extern int x,y;void fun() 21靜態(tài)變量 static型 聲明變量時加上關鍵字static,則為靜態(tài)變量,定義格式:static 類型標識符 變量標識符;靜態(tài)變量靜態(tài)局部變量 static加在局部變量的定義前靜態(tài)全局變量 static加在全局變量的定義前靜態(tài)變量在程序運行期間一直在靜態(tài)存儲區(qū)占有固定的存儲空間。 22靜態(tài)局部變量靜態(tài)局部變量在函數內定義,但不象自動變量那樣,當調用時就存在,退出函數時就消失。靜態(tài)局部變量始終存在著,所以它的生存期為整個源程序靜態(tài)局部變量的生存期雖然為整個源程序,但是其作用域仍與自動變量相同,即只能在定義該
11、變量的函數內使用該變量。退出該函數后, 盡管該變量還繼續(xù)存在,但不能使用它。23靜態(tài)局部變量 靜態(tài)局部變量在其所在的函數第一次被調用時,被初始化為一定的值,系統(tǒng)僅對它們作一次初始化。如果程序中指定初始化值,則初始化為程序指定值;如果程序在定義它們時未指定初始值,則系統(tǒng)將靜態(tài)局部變量初始化為0。此后靜態(tài)局部變量能夠保持其在前一次函數調用結束時所獲得的值,直到下次函數調用時被修改。 24靜態(tài)局部變量它是一種生存期為整個源程序的量。雖然離開定義它的函數后不能使用,但如再次調用定義它的函數時,它又可繼續(xù)使用, 而且保存了前次被調用后留下的值。當多次調用一個函數且要求在調用之間保留某些變量的值時,可考慮
12、采用靜態(tài)局部變量。雖然用全局變量也可以達到上述目的,但全局變量有時會造成意外的副作用,因此局部靜態(tài)變量比全局變量更安全。25例: 計算1+2+3+n#includeint add(int n) static int sum=0; / 去掉 static,結果怎樣? sum+=n; return sum;void main() int i,k; for(i=1; i=5; i+) k=add(i); cout前i個數之和=kendl; 26靜態(tài)全局變量靜態(tài)全局變量與全局變量的比較兩者都被自動初始化為0全局變量的作用域是整個源程序。當一個源程序由多個源文件組成時,全局變量在各個源文件中都是有效的。
13、而靜態(tài)全局變量的作用域被限制, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它 27對象的生存期 對象在內存中存在的時間為變量的生存期。從誕生到消失的這段時間。在對象生存期內,對象將保持它的值,直到被更新為止。不同的存儲類型的變量的生存期不同,按生存期可以將變量分為兩種:靜態(tài)生存期變量全局變量,靜態(tài)變量動態(tài)生存期變量auto型變量,register型變量28靜態(tài)生存期靜態(tài)生存期與程序的運行期相同。在文件作用域中聲明的對象具有這種生存期。在函數內部聲明靜態(tài)生存期對象,要冠以關鍵字static #includeusing namespace std;int i; /文件作用
14、域,i具有靜態(tài)生存期void main() cout i= +i endl;29動態(tài)生存期塊作用域中聲明的,沒有用static修飾的對象是動態(tài)生存期的對象(局部生存期對象)。開始于程序執(zhí)行到聲明點時,結束于命名該標識符的作用域結束處。動態(tài)生存期的變量,若未初始化,則為隨機值例:for(int i=0;i100;i+) sum+=i;30#include using namespace std;void fun() static int a=1; int i=5; a+; i+; couti=i,a=aendl;int main() fun(); fun();運行結果:i=6, a=2i=6,
15、a=3i是動態(tài)生存期a是靜態(tài)生存期例:靜態(tài)變量與動態(tài)變量31例5-2:變量的生存期與可見性#includeusing namespace std;int i = 1; / i 為全局變量,具有靜態(tài)生存期。void other() static int a = 2; static int b; / a,b為靜態(tài)局部變量,有全局壽命,局部可見 /只第一次進入函數時被初始化。 32int c = 10; / C為局部變量,具有動態(tài)生存期 a += 2; i += 32; c += 5; cout-OTHER-n; cout i: i a: a b: b c: cendl; b = a;int mai
16、n() static int a; /靜態(tài)局部變量,有全局壽命,局部可見。 int b = -10; int c = 0; /b,c為局部變量,有動態(tài)生存期33 cout -MAIN-n; cout i: i a: a b: b c: cendl; c += 8; other(); cout-MAIN-n; cout i: i a: a b: b c: cendl; i += 10; other(); return 0;34運行結果-MAIN- i:1 a:0 b: -10 c:0-OTHER- i:33 a:4 b:0 c:15-MAIN- i:33 a:0 b:-10 c:8-OTHER-
17、 i:75 a:6 b:4 c:1535365.3 類的靜態(tài)成員靜態(tài)數據成員目的:同一個類中不同對象之間的數據共享例:總數、平均分數等。描述靜態(tài)數據成員的2個步驟:(1)在類里用關鍵字static聲明 例:static int count;(2)在類外定義和初始化,用(:)指明所屬的類;而且初始化時不能前面加關鍵字static 例:int Point:count=0;該類的所有對象維護該成員的同一個拷貝37例:求學生類中的平均分數#includeclass Student public: Student(int x, int score) English=score; studentNo=x;
18、 count+; sum+=score; void printNo() cout學號: studentNo ; cout英語成績: Englishendl; void printCA() cout平均分: (sum/count)endl; cout學生數: countendl; 38 private: static int count, sum; /靜態(tài)成員數據 int studentNo, English;int Student:count=0; /在類外初始化 int Student:sum=0;void main() Student stu1(1001, 89), stu2(1002,
19、78), stu3(1003, 97), stu4(1004, 91); stu1.printNo(); stu2.printNo(); stu3.printNo(); stu4.printNo(); stu1.printCA(); /stu1換成stu2或Student:行嗎?39運行結果40例5-4 靜態(tài)數據成員實現Point類的對象計數器#include class Point public:Point(int xx=0, int yy=0) X=xx; Y=yy; countP+; Point(Point &p); Point() countP-; int GetX() return
20、X;int GetY() return Y;void GetC() cout Object id=countPendl; private:int X,Y;static int countP; /靜態(tài)數據成員引用性說明;41Point:Point(Point &p)X=p.X;Y=p.Y;countP+; /所有對象維護同一個countPint Point:countP=0; /靜態(tài)數據成員定義性說明和初始化void main()Point A(4,5);/構造函數回使countP增1coutPoint A,A.GetX(),A.GetY();A.GetC();Point B(A);/構造函數回
21、使countP增1coutPoint B,B.GetX(),B.GetY();B.GetC();42靜態(tài)成員函數的引入/如何在創(chuàng)建對象之前輸出countP的值?void main()Point:GetC(); /錯誤: illegal call of non-static member function Point A(4,5);coutPoint A,A.GetX(),A.GetY();A.GetC();Point B(A);coutPoint B,B.GetX(),B.GetY();B.GetC();435.3.2 靜態(tài)成員函數定義格式: static 返回類型 函數名(參數表) 函數體調
22、用方法: 類名:靜態(tài)成員函數名(參數表) 對象.靜態(tài)成員函數名(參數表)類外代碼可以使用類名:來調用靜態(tài)成員函數靜態(tài)成員函數只能引用屬于該類的靜態(tài)數據成員或靜態(tài)成員函數不能用類名訪問非靜態(tài)成員44類的靜態(tài)成員函數如何訪問非靜態(tài)成員數據?class A public: static void f(A a); private: int x;void A:f(A a) cout x; /對x的引用是錯誤的cout a.x; /正確 45例: 靜態(tài)成員函數舉例#includeclass Student public: Student(int x) /構造函數 count+; studentNo=x;
23、static int GetCount() /靜態(tài)成員函數 return count; void printNo() /普通成員函數 cout學號:studentNoendl; private: static int count; /靜態(tài)成員數據 int studentNo;46int Student:count=0;void main()cout第 Student:GetCount()個對象n; Student stu1(1001); cout第 stu1.GetCount()個對象 ; stu1.printNo(); Student stu2(1002); cout第 stu1.GetCo
24、unt() 個對象 ; stu2.printNo(); 47運行結果48靜態(tài)成員函數特點小結可以在類體內定義為內聯;放在類外定義時不加關鍵字static靜態(tài)成員函數用于訪問靜態(tài)成員數據靜態(tài)成員函數不能直接訪問非靜態(tài)數據成員,如果需要可通過對象名訪問靜態(tài)成員函數不依賴于具體對象,在沒有創(chuàng)建對象之前就可以調用靜態(tài)成員函數在類外對靜態(tài)成員函數的訪問遵循訪問權限控制要求49友元友元是C+提供的一種破壞數據封裝和數據隱藏的機制。通過將X模塊聲明為Y模塊的友元,那么X模塊能夠引用到Y模塊中本是被隱藏的信息??梢允褂糜言瘮岛陀言?。為了確保數據的完整性以及數據封裝與隱藏的原則,盡量少使用友元。50友元函數
25、友元函數是在類聲明中由關鍵字friend修飾說明的非成員函數,在它的函數體中能夠通過對象名訪問 private 和 protected成員作用:增加靈活性,使程序員可以在封裝和快速性方面做合理選擇。訪問對象中的成員必須通過對象名。51例: 使用友元函數計算兩點距離#include #include using namespace std;class Point /Point類聲明public:/外部接口Point(int x1=0, int y1=0) x=x1; y=y1;int getX() return x; int getY() return y; friend float dist(
26、Point &a, Point &b); private:/私有數據成員int x, y;52float dist( Point& a, Point& b) double x = a.x - b.x; double y = a.y - b.y; return (sqrt(x * x + y * y);int main() Point p1(1, 1), p2(4, 5); cout The distance is: ; cout dist(p1, p2) endl; return 0;53友元類若B類為A類的友元,則B類的所有成員都能訪問A類的成員(公有、私有、保護)聲明語法:將友元類名在另一個類中使用friend修飾說明。54友元類舉例cl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《13潔凈的水域》說課稿-2023-2024學年科學六年級下冊蘇教版
- Unit 2 Months of a Year Lesson Three(說課稿)-2024-2025學年重大版英語六年級上冊
- Unit 6 Chores Lesson 4 Let's spell(說課稿)-2024-2025學年人教新起點版英語五年級上冊001
- 2025水泥磚銷售合同范文
- 2024年七年級數學下冊 第10章 一元一次不等式和一元一次不等式組10.4一元一次不等式的應用說課稿(新版)冀教版
- 中型臭氧設備購買合同范例
- 8 安全地玩(說課稿)-部編版道德與法治二年級下冊
- 農業(yè)設備供貨合同范例
- 冷庫設備購銷合同范例
- 個人借還款合同范例
- 大學生創(chuàng)新創(chuàng)業(yè)教程PPT全套完整教學課件
- 小學科學項目化作業(yè)的設計與實施研究
- 2023年考研考博-考博英語-西安建筑科技大學考試歷年真題摘選含答案解析
- 2020年中考生物試卷及答案
- 反接制動控制線路電路圖及工作原理
- MCNP-5A程序使用說明書
- java基礎知識大全
- SMM英國建筑工程標準計量規(guī)則中文 全套
- GB 18030-2022信息技術中文編碼字符集
- SB/T 10977-2013倉儲作業(yè)規(guī)范
- 弘揚中華傳統(tǒng)文化課件
評論
0/150
提交評論