C程序設計面向對象的妥協(xié)_第1頁
C程序設計面向對象的妥協(xié)_第2頁
C程序設計面向對象的妥協(xié)_第3頁
C程序設計面向對象的妥協(xié)_第4頁
C程序設計面向對象的妥協(xié)_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

會計學1C程序設計面向對象的妥協(xié)本章學習目標了解友元函數(shù)的概念,掌握友元函數(shù)的定義與使用了解友元類的概念掌握靜態(tài)數(shù)據(jù)成員的定義與使用掌握靜態(tài)成員函數(shù)的定義與使用第6章面向對象的妥協(xié)第1頁/共36頁友元可以訪問與其有好友關系的類中的任何成員。

§6.1封裝的破壞——友元友元友元函數(shù)友元類第2頁/共36頁如果在本類以外的其他地方定義了一個函數(shù)(這個函數(shù)可以是不屬于任何類的普通函數(shù),也可以是其他類的成員函數(shù)),在類體中用friend對其進行聲明,此函數(shù)就稱為本類的友元函數(shù)。友元函數(shù)可以訪問這個類中的任何成員。如何將普通函數(shù)聲明為友元函數(shù)呢?看下面這個簡單的例子:§6.1封裝的破壞——友元6.1.1友元函數(shù)

第3頁/共36頁【例6-1】友元普通函數(shù)。

#include<iostream>usingnamespacestd;classClock//聲明Clock類{public:

Clock(int,int,int);

friendvoiddisplay(Clock&);private:

inthour;

intminute;

intsecond;};§6.1.1友元函數(shù)第4頁/共36頁Clock::Clock(inth,intm,ints)//構造函數(shù){hour=h;minute=m;second=s;}//這是友元函數(shù),形參t是Clock類對象的引用voiddisplay(Clock&t){cout<<t.hour<<":"<<t.minute<<":"<<t.second<<endl;}intmain(){Clockt(10,13,56);display(t);//調用display函數(shù),實參t是Clock類對象

return0;}§6.1友元函數(shù)程序運行結果如下:10:13:56cout<<hour<<":"<<minute<<":"<<second<<endl;注意第5頁/共36頁【例6-2】友元成員函數(shù)。#include<iostream>usingnamespacestd;classDate;//對Date類的提前引用聲明classClock//聲明Clock類{public:

Clock(int,int,int);

voiddisplay(Date&);private:

inthour,minute,second;};§6.1.1友元函數(shù)第6頁/共36頁classDate//聲明Date類{public:

Date(int,int,int);

friendvoidClock::display(Date&);private:

intmonth;

intday;

intyear;};§6.1.1友元函數(shù)第7頁/共36頁Clock::Clock(inth,intm,ints)//Clock類的構造函數(shù){hour=h;minute=m;second=s;}voidClock::display(Date&dd){cout<<dd.month<<"/"<<dd.day<<"/"<<dd.year<<endl;

cout<<hour<<":"<<minute<<":"<<second<<endl;}Date::Date(intm,intd,inty)//Date類的構造函數(shù){month=m;day=d;year=y;}§6.1.1友元函數(shù)第8頁/共36頁intmain(){Clockt(10,13,56);//定義Clock類對象t

Dated(12,25,2004);//定義Date類對象d

//調用t的display函數(shù),實參是Date類對象d

t.display(d);

return0;}§6.1友元函數(shù)程序運行結果如下:12/25/200410:13:56第9頁/共36頁不僅可以將一個函數(shù)聲明為一個類的“朋友”,而且可以將一個類(例如B類)聲明為另一個類(例如A類)的“朋友”。這時B類就是A類的友元類。友元類B中的所有成員函數(shù)都是A類的友元函數(shù),可以訪問A類中的任何成員?!?.1封裝的破壞——友元6.1.2友元類第10頁/共36頁classStudent;classTeacher{public:voidassigngrades(Student&s);//給出學生成績protected:intstu_count;//學生人數(shù)Student*plist[100];//學生數(shù)組};§6.1.2友元類classStudent{public:friendTeacher;//友元類…protected:intnum;stringname;floatscore;};…第11頁/共36頁§6.1.2友元類聲明友元類的一般形式為:friend類名;關于友元,有三點需要說明:(1)友元函數(shù)的聲明可以出現(xiàn)在類的任何地方(包括在private和public部分),也就是說友元的說明不受成員訪問控制符的限制。第12頁/共36頁§6.1.2友元類(2)友元關系是單向的而不是雙向的,如果聲明了B類是A類的友元類,不等于A類是B類的友元類,A類中的成員函數(shù)不一定能夠訪問B類中的成員(3)友元關系是不能傳遞的,例如,如果B類是A類的友元類,C類是B類的友元類,并不能說C類就是A類的友元類。第13頁/共36頁在C++中,聲明了一個類之后,可以定義該類的多個對象。系統(tǒng)為每個對象分配單獨的內存空間。每一個對象都分別有自己的數(shù)據(jù)成員,不同對象的數(shù)據(jù)成員各自有其值,互不相干。但是有時我們希望有某一個或幾個數(shù)據(jù)成員為所有對象所共有。這樣可以實現(xiàn)數(shù)據(jù)共享?!?.2對象機制的破壞

——靜態(tài)成員第14頁/共36頁我們知道全局變量能夠實現(xiàn)數(shù)據(jù)共享。但是用全局變量的安全性得不到保證,因為在各處都可以自由地修改全局變量的值,很有可能由于某個沒注意到的失誤,全局變量的值就被修改,導致程序的失敗。因此在實際工作中很少使用全局變量。如果想在同類的多個對象之間實現(xiàn)數(shù)據(jù)共享,也不要用全局對象,可以用靜態(tài)成員。靜態(tài)成員包括靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)。§6.2對象機制的破壞

——靜態(tài)成員第15頁/共36頁靜態(tài)數(shù)據(jù)成員是一種特殊的數(shù)據(jù)成員。它以關鍵字static開頭。例如:§6.2對象機制的破壞

——靜態(tài)成員6.2.1靜態(tài)數(shù)據(jù)成員classStudent{public:Student(char*name="noname");staticintstu_count;charname[40];};第16頁/共36頁靜態(tài)數(shù)據(jù)成員在內存中只占一份空間(而不是每個對象都分別為它保留一份空間),它是屬于類的,但它被該類的所有對象所共享,每個對象都可以訪問這個靜態(tài)數(shù)據(jù)成員。靜態(tài)數(shù)據(jù)成員的值對所有對象都是一樣的。如果改變它的值,則在各對象中這個數(shù)據(jù)成員的值都同時改變了。這樣可以節(jié)約空間,提高效率。§6.2.1靜態(tài)數(shù)據(jù)成員第17頁/共36頁說明:(1)如果只聲明了類而未定義對象,則類的一般數(shù)據(jù)成員是不占內存空間的,只有在定義對象時,才為對象的數(shù)據(jù)成員分配空間。但是靜態(tài)數(shù)據(jù)成員不屬于某一個對象,在為對象所分配的空間中不包括靜態(tài)數(shù)據(jù)成員所占的空間。靜態(tài)數(shù)據(jù)成員是在所有對象之外單獨開辟空間。只要在類中定義了靜態(tài)數(shù)據(jù)成員,即使不定義對象,也為靜態(tài)數(shù)據(jù)成員分配空間,它可以被訪問。在一個類中可以有一個或多個靜態(tài)數(shù)據(jù)成員,所有的對象共享這些靜態(tài)數(shù)據(jù)成員,都可以訪問它?!?.2.1靜態(tài)數(shù)據(jù)成員第18頁/共36頁(2)靜態(tài)數(shù)據(jù)成員不隨對象的建立而分配空間,也不隨對象的撤銷而釋放(一般數(shù)據(jù)成員是在對象建立時分配空間,在對象撤銷時釋放)。靜態(tài)數(shù)據(jù)成員是在程序編譯時被分配空間的,到程序結束時才釋放空間?!?.2.1靜態(tài)數(shù)據(jù)成員第19頁/共36頁(3)靜態(tài)數(shù)據(jù)成員可以初始化,但只能在類體外進行初始化。如:intStudent::stu_count=0;//表示對Student類中的靜態(tài)數(shù)據(jù)成員初始化靜態(tài)數(shù)據(jù)成員可以初始化語句的一般形式為:數(shù)據(jù)類型類名::靜態(tài)數(shù)據(jù)成員名=初值;不必在初始化語句中加static?!?.2.1靜態(tài)數(shù)據(jù)成員第20頁/共36頁(4)靜態(tài)數(shù)據(jù)成員既可以通過對象名訪問,也可以通過類名來訪問?!?.2.1靜態(tài)數(shù)據(jù)成員第21頁/共36頁【例6-3】訪問靜態(tài)數(shù)據(jù)成員。#include<iostream>usingnamespacestd;#include<string>classStudent{public:

Student(char*name="noname");

~Student();

staticintstu_count;

charname[40];};§6.2.1靜態(tài)數(shù)據(jù)成員第22頁/共36頁Student::Student(char*pname){strcpy(name,pname);

stu_count++;//每創(chuàng)建一個對象,學生人數(shù)加1}Student::~Student(){

stu_count--;

//每釋放一個對象,學生人數(shù)減1}//對靜態(tài)數(shù)據(jù)成員stu_count初始化

intStudent::stu_count=0;§6.2.1靜態(tài)數(shù)據(jù)成員第23頁/共36頁intmain(){Students1;

cout<<s1.stu_count<<endl;

{Students2;

cout<<s2.stu_count<<endl;

}

cout<<Student::stu_count<<endl;

return0;}程序運行結果如下:121§6.2.1靜態(tài)數(shù)據(jù)成員第24頁/共36頁與靜態(tài)數(shù)據(jù)成員不同,靜態(tài)成員函數(shù)的作用不是為了對象之間的溝通,而是為了能處理靜態(tài)數(shù)據(jù)成員?!?.2對象機制的破壞

——靜態(tài)成員6.2.2靜態(tài)成員函數(shù)第25頁/共36頁【例6-4】靜態(tài)成員函數(shù)訪問靜態(tài)數(shù)據(jù)成員的例子。#include<iostream>usingnamespacestd;#include<string>classStudent //聲明Student類{public:

Student(char*name="noname");

~Student();

staticintgetcount()

{returnstu_count;}private:

staticintstu_count;

charname[40];};§6.2.2靜態(tài)成員函數(shù)第26頁/共36頁Student::Student(char*pname){strcpy(name,pname);stu_count++;//每創(chuàng)建一個對象,學生人數(shù)加1}Student::~Student(){stu_count--;}//每銷毀一個對象,學生人數(shù)減1intStudent::stu_count=0;§6.2.2靜態(tài)成員函數(shù)第27頁/共36頁intmain(){Students1;

cout<<s1.getcount()<<endl;

{Students2;

cout<<s2.getcount()<<endl;

}

cout<<Student::getcount()<<endl;

return0;}§6.2.2靜態(tài)成員函數(shù)第28頁/共36頁§6.2.2靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)成員函數(shù)是類的一部分,而不是對象的一部分。如果要在類外調用公用的靜態(tài)成員函數(shù),可以用類名和域運算符“::”,也允許通過對象名調用靜態(tài)成員函數(shù)。如:Student::getcount();//用類名調用靜態(tài)成員函數(shù)s1.getcount(); //用對象名調用靜態(tài)成員函數(shù)但這并不意味著此函數(shù)是屬于對象s1的,而只是用s1的類型而已。第29頁/共36頁§6.2.2靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)成員函數(shù)是類的一部分,而不是對象的一部分。如果要在類外調用公用的靜態(tài)成員函數(shù),可以用類名和域運算符“::”,也允許通過對象名調用靜態(tài)成員函數(shù)。如:Student::getcount();//用類名調用靜態(tài)成員函數(shù)s1.getcount(); //用對象名調用靜態(tài)成員函數(shù)但這并不意味著此函數(shù)是屬于對象s1的,而只是用s1的類型而已。第30頁/共36頁§6.2.2靜態(tài)成員函數(shù)說明:(1)靜態(tài)成員函數(shù)不能默認訪問本類中的非靜態(tài)成員。當調用一個對象的成員函數(shù)(非靜態(tài)成員函數(shù))時,系統(tǒng)會把該對象的起始地址賦給成員函數(shù)的this指針。而靜態(tài)成員函數(shù)并不屬于某一對象,它與任何對象都無關,因此靜態(tài)成員函數(shù)沒有thi

溫馨提示

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

評論

0/150

提交評論