面向?qū)ο氤绦蛟O計5_第1頁
面向?qū)ο氤绦蛟O計5_第2頁
面向?qū)ο氤绦蛟O計5_第3頁
面向?qū)ο氤绦蛟O計5_第4頁
面向?qū)ο氤绦蛟O計5_第5頁
已閱讀5頁,還剩155頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第四章類和對象1第四章 類與對象類對象構造函數(shù)和析構函數(shù)const成員函數(shù)成員對象靜態(tài)成員友元小結(jié)2第四章 類與對象類對象構造函數(shù)和析構函數(shù)const成員函數(shù)成員對象靜態(tài)成員友元小結(jié)34.1 類類的定義class 類名 ;說明:1、類名代表所定義的類的名字,用標識符表示。 2、成員描述給出該類的對象所有的成員的說明,它包 括成員函數(shù)和數(shù)據(jù)成員。 3、在類定義的成員描述中還包含對成員的訪問控制。4一個類中的方法可以直接訪問同類中的任何成員。5在C+定義中,可以用訪問控制修飾符public、private或protected來描述對類成員的訪問限制。public:public成員的訪問不受限制,在

2、程序中的任何地方都可以訪問一個類的public成員。private:private成員只能在本類(本類的成員函數(shù))和友元中訪問。protected:protected成員只能在本類、派生類和友元中訪問。成員的訪問控制:信息隱藏6在類定義中可以有多個public、private和protected訪問控制說明,它們出現(xiàn)的先后順序無關。C+的默認訪問控制是private。成員的訪問控制良好編程習慣:為了保證程序的清晰性和可讀性,每個成員訪問說明符在類定義中只能使用一次。請將public成員放在最前面,這樣更便于查找。7一般情況下,類的數(shù)據(jù)成員和在類內(nèi)部使用的成員函數(shù)應該指定為private,只有提

3、供給外界使用的成員函數(shù)才指定為public。指定為public的成員構成了類與外界的一種接口。操作一個對象時,只能通過訪問對象類中的public成員實現(xiàn)。成員的訪問控制軟件工程知識:根據(jù)經(jīng)驗,數(shù)據(jù)成員應該聲明為private,成員函數(shù)應該聲明為public,如果某些成員函數(shù)只是被該類的其他成員函數(shù)訪問,那么它們更適合聲明為private。8類的定義示例定義一個Student類class Studentprivate: /訪問控制說明int number , score;public: /訪問控制說明void init() number = 1001;score = 100; void show

4、()coutnumberendlscore= 0 & hh 數(shù)據(jù)成員名對象指針-成員函數(shù)名(實參列表)對象指針-成員名等價:(*對象指針).成員名29間接方式 間接創(chuàng)建和標識對象是指在程序運行時刻,通過new操作來創(chuàng)建對象。所創(chuàng)建的對象稱為動態(tài)對象,其內(nèi)存空間在程序的堆區(qū)中。動態(tài)對象用delete操作撤消(即使之消亡)。動態(tài)對象需要通過指針變量來標識。對象的創(chuàng)建和標識30對象的創(chuàng)建和標識單個動態(tài)對象的創(chuàng)建與撤消。A *p;p=new A; delete p;A *p;p=(A *)malloc(sizeof(A); free (p);31對象的創(chuàng)建和標識動態(tài)對象數(shù)組的創(chuàng)建與撤消A *p;p=n

5、ew A100; delete p;A *p;p=(A *)malloc(sizeof(A)*100); free(p);32類作用域類定義構成一個作用域:類作用域,其中的標識符局部于類定義,它們可以與類定義外的全局標識符或其他類定義中的標識符相同。他們包括:數(shù)據(jù)成員成員函數(shù)在類定義外使用類定義中的標識符時,需通過對象名受限或類名受限。在類定義中使用與局部標識符同名的全局標識符時,需要在全局標識符前面加上全局域分辨符(:)來實現(xiàn)。33class Studentprivate:int number,score;public:void init();void Student:init()numbe

6、r = 1001;score = 100;類作用域34類作用域void init(); class Studentprivate: int number; public: void init(int number); void f(); void Student:f() :init();/調(diào)用全局函數(shù)init 35class Studentprivate:int number;int score;public:void init(int number,int score)Student:number = number;Student:score = score;void main()Stude

7、nt s1; s1.init();36class A public: void f(); void g(int i) x=i; f(); private: int x,y,z;aba.xa.ya.zb.xb.yb.zA a,b;g(int i)37this指針每個成員函數(shù)都有一個隱藏的指針類型的形參this,其類型為: *const this;成員函數(shù)中對類成員的訪問都是通過this指針進行的。void g(A *const this,int i)this-x=i; this-f();void g(int i)x=i; f(); a.g(3);A:g(&a,3);38class Student

8、private:int number;int score;public:void init(int number,int score)this-number = number;this-score = score;void main()Student s1; s1.init();39void func(A * p) class A int x; public: void f()func(?); void g(int i)x=i;f();A a,b;a.f();b.f();要求:調(diào)用a.f()時,在A:f中調(diào)用func(&a);調(diào)用b.f()時,在A:f中調(diào)用func(&b);40練習:應在下列

9、程序劃線處填入的正確語句是( )。void init(); class Studentprivate: int number; public: void init(int number); void f();void Student:init(int number) _= number; void Student:f() _ /調(diào)用全局函數(shù)init 41練習A. this-number; ,:init(); B. this:number; ,:init();C. Student:number; ,init(); D. student-number; ,init();42小技巧:在以后的MFC編

10、程中,如果在成員函數(shù)中想調(diào)用同類中的某個成員,可以使用VC+提供的自動列出成員函數(shù)功能,使用this-,VC+將列出該類中的所有成員,我們可以從列表中選擇我們想調(diào)用的成員。自動列出成員函數(shù)功能,可以提高編寫速度,減少拼寫錯誤。我們經(jīng)常不能完全記住某個函數(shù)的完整拼寫,但卻能夠從列表中辨別出該函數(shù),自動列出成員函數(shù)的功能在這時就顯得更加有用了。43事實上,在各種IDE編程環(huán)境中,我們通常都不可能記住也沒有必要記住所有的函數(shù),只要將常用的函數(shù)記住,其他不常用的函數(shù)只要記住其大概的寫法和功能,在調(diào)用該函數(shù)時可以從自動列出成員函數(shù)中選取,這樣可以大大節(jié)省我們的學習時間。我們不用花費大量的時間去死記硬背許

11、多函數(shù),利用自動列出成員函數(shù)功能和幫助系統(tǒng),就能夠在編程時順利地使用這些函數(shù),等用的次數(shù)多了,也就在不知不覺中完全掌握了這些函數(shù)。 44第四章 類與對象類對象構造函數(shù)和析構函數(shù)const成員函數(shù)成員對象靜態(tài)成員友元小結(jié)45構造函數(shù)什么是構造函數(shù)構造函數(shù)是一種特殊的成員函數(shù),它是在對象誕生后第一個執(zhí)行(并且是自動執(zhí)行)的函數(shù).46構造函數(shù)的特點構造函數(shù)的名稱必須與類名相同構造函數(shù)沒有返回值,可以有參數(shù),可以重載構造函數(shù)一般是public的,但有時也把構造函數(shù)聲明為私有的(private),其作用是限制創(chuàng)建該類對象的范圍,這時只能在本類和友元類中創(chuàng)建該對象。程序中不能直接調(diào)用構造函數(shù),在創(chuàng)建對象時

12、系統(tǒng)自動調(diào)用構造函數(shù)。47在創(chuàng)建一個對象時,對象類的構造函數(shù)會被自動調(diào)用來對該對象進行初始化。至于調(diào)用對象類的哪個構造函數(shù),這可以在創(chuàng)建對象的時候指定。構造函數(shù)48class A public: A(); A(int i); A(char *p); A a1; 或 A a1=A(); A a2(1); 或A a2=A(1); 或A a2=1;A a3(“abcd”); 或A a3=A(“abcd”);或A a3=“abcd”;A a1();49class A public: A(); A(int i); A(char *p); A a4; A b5=A(),A(1),A(“abcd”),2,”

13、xyz”; A *p1=new A; A *p2=new A(2);A *p3=new A(“xyz”); A *p4=new A20; 50不帶參數(shù)的(或所有參數(shù)都有默認值的)構造函數(shù),即構造對象時不提供參數(shù)的構造函數(shù)稱為默認構造函數(shù)。程序中不能同時出現(xiàn)無參數(shù)的構造函數(shù)和帶有全部默認形參值的構造函數(shù)。構造函數(shù)51class A public: A(); A(int i=0); ;A a; 構造函數(shù)(ERROR)52C+規(guī)定,每個類必須有一個構造函數(shù),沒有構造函數(shù),就不能創(chuàng)建任何對象。構造函數(shù)53構造函數(shù)C+又規(guī)定,如果一個類沒有提供任何的構造函數(shù),則C+提供一個默認的構造函數(shù)(由C+編譯器提

14、供),這個默認的構造函數(shù)是一個不帶參數(shù)的構造函數(shù),該構造函數(shù)的函數(shù)體為空,不做任何的初始化工作。54只要一個類定義了一個構造函數(shù),不管這個構造函數(shù)是否是帶參數(shù)的構造函數(shù),C+就不再提供默認的構造函數(shù)。因此,如果為一個類定義了一個帶參數(shù)(且不是所有參數(shù)都有默認值)的構造函數(shù),還想要創(chuàng)建一個對象而不提供參數(shù),就需要自己定義一個默認構造函數(shù)。構造函數(shù)55class A public: A(int i); ;A a; 構造函數(shù)(ERROR)56構造函數(shù)示例把Student類中的函數(shù)init改成構造函數(shù)class Studentprivate:int number;int score;public:St

15、udent(int number,int score)Student:number = number;Student:score = score; ;void main()Student s1(1002,90);Student s2;構造函數(shù)也可以“類內(nèi)聲 明,類外定義”/錯誤,類中沒有默認構造函數(shù)57構造函數(shù)錯誤預防技巧:除非沒有必要初始化類的數(shù)據(jù)成員,否則請?zhí)峁嬙旌瘮?shù),這樣可以保證當類的每個新對象被創(chuàng)建時,類的數(shù)據(jù)成員都用有意義的值進行了初始化。58析構函數(shù)什么是析構函數(shù)在對象行將毀滅但未毀滅之前一刻,最后執(zhí)行(并且是自動執(zhí)行)的函數(shù)。析構函數(shù)是“反向”的構造函數(shù),析構函數(shù)不允許有返回值

16、,更重要的是析構函數(shù)不允許帶參數(shù),并且一個類中只能有一個析構函數(shù).析構函數(shù)的作用正好與構造函數(shù)相反,對象超出其作用范圍,對應的內(nèi)存空間被系統(tǒng)收回或被程序用delete刪除時,析構函數(shù)被調(diào)用.59注意:new和delete會調(diào)用構造函數(shù)和析構函數(shù)malloc和free不會調(diào)用構造函數(shù)和析構函數(shù)對于動態(tài)分配的數(shù)組對象,必須用delete ,而不能用delete代替delete 。delete gradesArray;首先調(diào)用每個對象的析構函數(shù)然后釋放內(nèi)存如果語句中沒有包括 () 并且gradesArray 指向一個對象數(shù)組只有第一個對象的析構函數(shù)被調(diào)用60注意:常見編程錯誤:刪除數(shù)組時,用dele

17、te代替delete 將導致運行時的邏輯錯誤。為保證數(shù)組中的每個對象都接受一個析構函數(shù)調(diào)用,數(shù)組生成的內(nèi)存空間要用delete 運算符刪除。類似地,總是使用delete運算符將分配給單個元素的內(nèi)存空間刪除。61析構函數(shù)的特點析構函數(shù)的名稱與類名相同,前面加上“”析構函數(shù)沒有返回值,沒有參數(shù),不能重載當對象被撤銷時,系統(tǒng)自動調(diào)用析構函數(shù)類中未定義析構函數(shù),系統(tǒng)會自動生成默認的函數(shù)體為空的析構函數(shù)析構函數(shù)62根據(jù)析構函數(shù)的特點,我們可以在構造函數(shù)中初始化對象的某些成員變量,給其分配內(nèi)存空間(堆內(nèi)存),在析構函數(shù)中釋放對象運行期間所申請的資源.析構函數(shù)63析構函數(shù)示例在構造函數(shù)申請空間,析構函數(shù)釋放

18、空間class Studentprivate:char *name;int number;int score;public:Student(char *name,int number,int score)this-name = new charstrlen(name) + 1;strcpy(this-name,name);this-number = number;this-score = score;Student()delete name;析構函數(shù)同樣可以“類內(nèi) 聲明,類外定義”64析構函數(shù)示例namenumberscore棧內(nèi)存堆內(nèi)存zhangsanStu1對象Student stu1(“

19、zhangsan”,101,90);1019065注意無論構造函數(shù)被調(diào)用還是析構函數(shù)被調(diào)用,對象都是存在的。66class A int x; char *p;public: A(char *p,int x) this-p = new charstrlen(p) + 1; strcpy(this-p,p); this-x = x; A()delete p;void main()A a(“l(fā)isi”,23); aa.xa.p對象產(chǎn)生,系統(tǒng)在堆棧中分配內(nèi)存空間棧內(nèi)存67class A int x; char *p;public: A(char *p,int x) this-p = new chars

20、trlen(p) + 1; strcpy(this-p,p); this-x = x; A()delete p;void main()A a(“l(fā)isi”,23); aa.xa.p棧內(nèi)存調(diào)用構造函數(shù),完成初始化堆內(nèi)存lisi23對象產(chǎn)生,系統(tǒng)在堆棧中分配內(nèi)存空間68class A int x; char *p;public: A(char *p,int x) this-p = new charstrlen(p) + 1; strcpy(this-p,p); this-x = x; A()delete p;void main()A a(“l(fā)isi”,23); aa.xa.p棧內(nèi)存調(diào)用構造函數(shù),完

21、成初始化堆內(nèi)存lisi23對象產(chǎn)生,系統(tǒng)在堆棧中分配內(nèi)存空間對象生命周期結(jié)束,在結(jié)束前先調(diào)用析構函數(shù)69class A int x; char *p;public: A(char *p,int x) this-p = new charstrlen(p) + 1; strcpy(this-p,p); this-x = x; A()delete p;void main()A a(“l(fā)isi”,23); aa.xa.p棧內(nèi)存調(diào)用構造函數(shù),完成初始化23對象產(chǎn)生,系統(tǒng)在堆棧中分配內(nèi)存空間對象生命周期結(jié)束,在結(jié)束前先調(diào)用析構函數(shù)對象生命周期結(jié)束,釋放內(nèi)存70析構函數(shù)在某些情況下,我們并不撤消對象,而只是

22、歸還對象所申請的資源,這時我們可以通過顯示地調(diào)用析構函數(shù)來實現(xiàn)。71小結(jié)對象的創(chuàng)建在c+中,有四種方法可以產(chǎn)生一個對象在棧中產(chǎn)生在堆中產(chǎn)生產(chǎn)生一個全局對象產(chǎn)生一個局部靜態(tài)對象72小結(jié)對象的創(chuàng)建對于全局對象,程序一開始,其構造函數(shù)就先被執(zhí)行。程序即將結(jié)束前其析構函數(shù)執(zhí)行。(MFC application object)對于局部對象,當對象誕生時,其構造函數(shù)被函數(shù)執(zhí)行。程序流程將離開該對象的存活范圍(以致對象將毀滅)時,其析構函數(shù)執(zhí)行。73小結(jié)對象的創(chuàng)建對于靜態(tài)對象,當對象第一次被定義時其構造函數(shù)被執(zhí)行。當程序?qū)⒔Y(jié)束時(此對象因而遭致毀滅)其析構函數(shù)被執(zhí)行,但比全局對象的析構函數(shù)早一步執(zhí)行。對于以

23、new方式產(chǎn)生出來的局部對象,當對象誕生時其構造函數(shù)被執(zhí)行。析構函數(shù)則在對象被delete時執(zhí)行。74思考class Person;Person per1(30,“zhangsan”, 170);Person per2(per1);75拷貝構造函數(shù)什么是拷貝構造函數(shù)拷貝構造函數(shù)是一種特殊的構造函數(shù),它的功能是用一個已知的對象來初始化一個被創(chuàng)建的同類對象??截悩嬙旌瘮?shù)實際上也是構造函數(shù),具有一般構造函數(shù)的所有特性,它是在初始化時被調(diào)用來將一個已知對象的數(shù)據(jù)成員的值逐值拷貝給正在創(chuàng)建的一個同類的對象。默認情況下系統(tǒng)自動創(chuàng)建拷貝構造函數(shù)76如果在類定義中沒有給出拷貝構造函數(shù),則編譯系統(tǒng)將會隱式地為其

24、提供一個拷貝構造函數(shù),該拷貝構造函數(shù)的行為是:逐個成員拷貝初始化。對于普通成員,它采用通常的初始化操作;對于成員對象,則調(diào)用成員對象類的拷貝構造函數(shù)來實現(xiàn)成員對象的初始化。拷貝構造函數(shù)77拷貝構造函數(shù)的定義類名(const 類名 &object) 拷貝構造函數(shù)78在Person類中添加拷貝構造函數(shù)拷貝構造函數(shù)class Personprivate: int height; int age; char name10;public: Person(const Person &person) height = person.height; age = person.age; strcpy(name,

25、); ;79class Personprivate:char *name;int age;int height;public:Person(int age,char *name,int height)this-name = new charstrlen(name) + 1;strcpy(this-name,name);this-age = age;this-height = height;Student()delete name;80思考Person p1(11,“zhangsan”, 150);Person p2(p1);81Person(const Person &a

26、) age=a.age; height=a.height; name=;系統(tǒng)提供的默認拷貝構造函數(shù)的行為82深拷貝和潛拷貝問題p1p2張三p2 = p1*nameheightage*nameheightage??臻g堆空間83深拷貝和潛拷貝問題類體內(nèi)的成員需要動態(tài)開辟內(nèi)存的時我們應自定義拷貝構造函進行深拷貝,以防止?jié)摽截悗淼亩褍?nèi)存的所屬權產(chǎn)生混亂,從而造成析構錯誤84Person(const Person &a) age=a.age; height=a.height; name= new charstrlen()+1; strcpy(name,); 深拷貝和

27、潛拷貝問題85拷貝構造函數(shù)void f(Person s)Person a;f(a);86以下三種情況將調(diào)用拷貝構造函數(shù)定義對象時 A a1; A a2(a1);A a2=a1;A a2=A(a1);把對象作為值參數(shù)傳給函數(shù) void f(A x); A a; f(a); /調(diào)用時將創(chuàng)建形參對象x,并調(diào)用拷貝構造函數(shù)(用對象a)對其初始化。把對象作為返回值87A f() A a; return a;/創(chuàng)建一個A類臨時對象,并調(diào)用拷貝構造函數(shù)(用對象a)對其初始化。 void main()A b; b=f();88const常量、引用的初始化問題?思考89class A int x; const

28、 int y=1; int &z=x; public: A() x=0; y=1; ;/error/error/ error,y是常量成員,其值不能改變90成員初始化表(在定義構造函數(shù)時)class A int x; const int y; int &z; public: A():z(x),y(1) x=0; ;91class A int x; const int y; int &z; public: A():z(x),y(1),x(0) ;92成員初始化表中成員初始化的書寫次序并不決定它們的初始化次序,數(shù)據(jù)成員的初始化次序由它們在類定義中的說明次序來決定。當類中有常量數(shù)據(jù)成員或引用數(shù)據(jù)成員

29、時,如果類中定義了構造函數(shù),則一定要在定義的所有構造函數(shù)的成員初始化表中對它們進行初始化,如果類中沒有定義構造函數(shù),則編譯程序不會給該類生成一個默認構造函數(shù)。因此,這樣的類程序是不能用于創(chuàng)建對象的。成員初始化表(在定義構造函數(shù)時)93程序運行的某個時刻,一個對象的所有數(shù)據(jù)成員的值反映了這個對象在該時刻的狀態(tài)。在不同時刻,對象的狀態(tài)可能是不一樣的,對象狀態(tài)的改變往往是由于對象處理了一條消息(某個成員函數(shù)被調(diào)用)。但是并不是每條消息都會導致對象狀態(tài)的變化。有些消息只是獲取對象在某時刻的狀態(tài)。思考94第四章 類與對象類對象構造函數(shù)和析構函數(shù)const成員函數(shù)成員對象靜態(tài)成員友元小結(jié)95在定義一個成員

30、函數(shù)時,可以給它加上一個const說明,表示它是一個獲取對象狀態(tài)的成員函數(shù)。例如: class A void f() const ;const成員函數(shù)96const成員函數(shù)函數(shù)聲明和定義處都要加constclass A int x,y; public: void f() const ;;void A:f() const97const成員函數(shù)class A int x; public: int f() const ;class A int x; public: const int f() ;98在const成員函數(shù)體中不能修改數(shù)據(jù)成員的值,也不能調(diào)用該類中的非常成員函數(shù)。const成員函數(shù)軟件工

31、程知識:如果成員函數(shù)不修改對象,最好將所有類成員函數(shù)聲明為const。99class A int x; char *p; public: void f() const x=10;/error p=new char20;/error ;const成員函數(shù)100class A int x; char *p; public: void f() const strcpy(p,”abcd”); *p=A; ;const成員函數(shù)101const成員函數(shù)const對象軟件工程知識:將對象聲明為const有利于實現(xiàn)最低權限原則,這樣試圖修改對象就會產(chǎn)生編譯時錯誤而非執(zhí)行時錯誤。性能提示:把變量和對象聲明為co

32、nst,這不僅是一種有效的軟件工程原則,而且還能提高性能,因為如今復雜的優(yōu)化編譯器能對常量進行某些優(yōu)化,但無法對變量進行優(yōu)化。102const成員函數(shù)只有常成員函數(shù)才有資格操作常對象。class A int x,y; public: void f() const void g() ;const A a;a.f(); /OKa.g(); /error103const成員函數(shù)軟件工程知識:可以對 const 成員函數(shù)進行非 const 版本的重載。編譯器將根據(jù)調(diào)用函數(shù)的對象性質(zhì)選擇相應的重載函數(shù)來使用。如果對象是 const 的,則編譯器使用 const 版本的重載函數(shù);如果對象是非 const

33、的,則編譯器使用非 const 版本的重載函數(shù)。104const關鍵字可以被用于參與對重載函數(shù)的區(qū)分。如: void print(); void print() const;const成員函數(shù)105在函數(shù)f中不能調(diào)用對象*pa或a的非const成員函數(shù)。void f(A *pa) ;void f(A &pa) ;const成員函數(shù)void f(const A *pa) ;void f(const A &pa) ;106思考107組合(Composition)是一種 has-a 關系一個類可以將其他類的對象作為成員一種強的“擁有”關系,體現(xiàn)了嚴格的整體和部分的關系,部分和整體生命周期一樣。108

34、第四章 類與對象類對象構造函數(shù)和析構函數(shù)const成員函數(shù)成員對象類的組合靜態(tài)成員友元小結(jié)1094.5 類成員是其它類的對象成員對象一個類的成員可以是另外一個類的對象。也就是說一個對象可以包含另一個對象(稱為成員對象)。class Computer private: CPU c1,c2;class CPUprivate: double frequency;110成員對象class A int m; public: A() m=0; A(int m1) m=m1;class B int n; A a; public: B() n=0; B(int n1) n=n1;B b1,b2(1);111在

35、創(chuàng)建包含成員對象的對象時,對成員對象的初始化是由成員對象類的構造函數(shù)來實現(xiàn)的。默認情況下,成員對象由成員對象類的默認構造函數(shù)進行初始化。成員對象的初始化112成員對象的初始化class A int m; public: A() m=0; A(int m1) m=m1;class B int n; A a; public: B() n=0; B(int n1) n=n1;B b1,b2(1);113如需要調(diào)用成員對象的非默認構造函數(shù)對成員對象進行初始化,則要在包含成員對象的類的構造函數(shù)成員初始化表指出。成員對象的初始化114class A int m; public: A() m=0; A(in

36、t m1) m=m1;class B int n; A a; public: B() n=0; B(int n1):a(n1) n=n1;B b1,b2(1);115116117118119判斷:是否正確?class A int m; public: A(int m1) m=m1;class B int n; A a; public: B() n=0; B(int n1) n=n1;B b1,b2(1);120構造函數(shù)的執(zhí)行順序是(如果有多個成員對象)按照成員對象在類的聲明中出現(xiàn)的次序,依次調(diào)用其成員對象的構造函數(shù)。(注意:并不是按照初始化列表中給出的順序)。再執(zhí)行本類的構造函數(shù)的函數(shù)體。析構

37、函數(shù)的調(diào)用執(zhí)行順序與構造函數(shù)相反。成員對象的初始化121成員對象的初始化系統(tǒng)提供的隱式拷貝構造函數(shù)會去調(diào)用成員對象的拷貝構造函數(shù)。自定義的拷貝構造函數(shù)不會去調(diào)用成員對象的拷貝構造函數(shù),必須要在成員初始化列表中顯示地指出。若沒有指出,則表示調(diào)用成員對象的默認構造函數(shù)。122class A;class B int z; A a;public: B(); B(const B& b):a(b.a) z=b.z;123成員初始化列表成員初始化列表一般成員常量成員引用成員自定義的拷貝構造函數(shù)調(diào)用成員對象的拷貝構造函數(shù)顯示調(diào)用成員對象的構造函數(shù)124第四章 類與對象類對象構造函數(shù)和析構函數(shù)const成員函數(shù)

38、成員對象靜態(tài)成員友元小結(jié)125同一個類的不同對象需要共享數(shù)據(jù),怎么辦?全局變量?4.6 靜態(tài)成員class SavingAccountprivate: char m_name40;/存戶姓名 char m_addr60;/存戶地址 double m_total;/存款額 double m_rate;/利率 ;126靜態(tài)數(shù)據(jù)成員必須在類外定義,定義時可以進行初始化 數(shù)據(jù)類型 類名:靜態(tài)數(shù)據(jù)成員名=值; class A static int shared; int x,y; public: A()x=y=0; void increase_all() ; int A:shared=0; A a1,a

39、2;0shared0000a1a2a1.xa1.ya2.xa2.y127靜態(tài)數(shù)據(jù)成員C+國際標準:const static int 或 enum 類型的數(shù)據(jù)成員可以在類定義中聲明時初始化 class A static const int shared=0; int x,y; public: A()x=y=0; void increase_all() ; A a1,a2; 128靜態(tài)數(shù)據(jù)成員具有默認構造函數(shù)的 static 成員對象因為它們的默認構造函數(shù)會被調(diào)用,所以不必初始化129靜態(tài)數(shù)據(jù)成員具有靜態(tài)生存期,不屬于任何一個對象。類的靜態(tài)成員與該類的對象存在與否沒有關系.靜態(tài)數(shù)據(jù)成員130靜態(tài)數(shù)

40、據(jù)成員 class A int x,y; public: A()x=y=0; void increase_all() static int shared; ; int A:shared=0;int main() A a; a. shared=4; A: shared=4;131思考private的靜態(tài)成員變量,不能在外部被訪問.只能通過公有的成員函數(shù)訪問.如果希望在產(chǎn)生任何對象之前就存取其class的private static成員變量.怎么辦?132思考class A public: void getX(); private: static int x; ;int A:x=0;void A:

41、getX() coutx; coutx; int main() A a; a.getX();133靜態(tài)成員函數(shù)class A public: static void getX(); private: static int x; ;int A:x=0;void A:getX() coutx; int main() A:getX();134靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)沒有隱藏的形式參數(shù)this.135靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù)只能訪問靜態(tài)成員。靜態(tài)成員函數(shù)136class A public: static void f(); private: int x; ;void A:f() coutx;/err

42、or 137class A public: static void f(A a); private: int x; ;void A:f(A a) coutx;/error couta.x;138靜態(tài)成員的使用除了在類中訪問靜態(tài)成員外,還可以在類的外部訪問public靜態(tài)成員,這時有兩種訪問方式: 通過對象訪問。 通過類名訪問。 類的靜態(tài)成員與該類的對象存在與否沒有關系。139設計模式設計模式是在大量的實踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構、編程風格以及解決問題的思考方式。設計模式就象經(jīng)典的棋譜,不同的棋局,我們用不同的棋譜,免得自己再去思考和摸索。自從對象產(chǎn)生以來,在程序設計領域最具革命性的飛躍

43、是設計模式的引進。設計模式是對應于公認的編程問題的經(jīng)典解決方案,它獨立于語言之外,其表述方法的特殊性使他能應用于許多情況之下. 小知識140底層思維抽象思維向下,如何深入把握機器底層,從微觀理解對象構造底層思維語言構造編譯轉(zhuǎn)換對象內(nèi)存模型運行時機制向上,如何將我們周圍的世界抽象為程序代碼抽象思維面向?qū)ο蠼M件封裝設計模式架構模式141設計模式Singleton模式是做為全局變量的替代品出現(xiàn)的。所以它具有全局變量的特點:全局可見、貫穿應用程序的整個生命期,它也具有全局變量不具備的性質(zhì):同類型的對象實例只可能有一個。 小知識142第四章 類與對象類對象構造函數(shù)和析構函數(shù)const成員函數(shù)成員對象靜態(tài)

44、成員友元小結(jié)143#include #include class Pointpublic:/外部接口Point(int xx=0, int yy=0) X=xx;Y=yy;int GetX() return X;int GetY() return Y; private:/私有數(shù)據(jù)成員int X,Y;144double Distance( Point& a, Point& b) double dx=a. GetX() -b. GetX() ; double dy=a. GetY() -b. GetY() ; return sqrt(dx*dx+dy*dy);int main() Point p1(3.0, 5.0), p2(4.0, 6.0); double d=Distance(p1, p2); coutThe distance is dendl; return

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論