計算機二級C考試復習資料全資料全_第1頁
計算機二級C考試復習資料全資料全_第2頁
計算機二級C考試復習資料全資料全_第3頁
計算機二級C考試復習資料全資料全_第4頁
計算機二級C考試復習資料全資料全_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機二級C+考試復習資料(全)一、C+概述(一)發(fā)展歷史1980年,BjarneStroustrup博士開始著手創(chuàng)建一種模擬語言,能夠具有面向對象的程序設計特色。在當時,面向對象編程還是一個比較新的理念,Stroustrup博士并不是從頭開始設計新語言,而是在C語言的基礎上進行創(chuàng)建。這就是C+語言。1985年,C+開始在外面慢慢流行。經過多年的發(fā)展,C+已經有了多個版本。為次,ANSI和ISO的聯(lián)合委員會于1989年著手為C+制定標準。1994年2月,該委員會出版了第一份非正式草案,1998年正式推出了C+的國際標準。(二)C和C+C+是C的超集,也可以說C是C+的子集,因為C先出現(xiàn)。按常理

2、說,C+編譯器能夠編譯任何C程序,但是C和C+還是有一些小差別。例如C+增加了C不具有的關鍵字。這些關鍵字能作為函數(shù)和變量的標識符在C程序中使用,盡管C+包含了所有的C,但顯然沒有任何C+編譯器能編譯這樣的C程序。C程序員可以省略函數(shù)原型,而C+不可以,一個不帶參數(shù)的C函數(shù)原型必須把void寫出來。而C+可以使用空參數(shù)列表。C+中new和delete是對內存分配的運算符,取代了C中的malloc和free。標準C+中的字符串類取代了C標準C函數(shù)庫頭文件中的字符數(shù)組處理函數(shù)。C+中用來做控制態(tài)輸入輸出的iostream類庫替代了標準C中的stdio函數(shù)庫。異常處理機制取代了標準C 中的 setj

3、mp() 和 longjmp()C+中的try/catch/throw函數(shù)。、關鍵字和變量C+相對與C增加了一些關鍵字,如下:typenamebooldynamic_castmutablenamespacestatic_castusingcatchexplicitnewvirtualoperatorfalseprivatetemplatevolatileconstprotectedthiswchar_tconst_castpublicthrowfriendtruereinterpret_casttrybitorxor_eand_eqcomplor_eqnot_eqbitand在C+中還增加了b

4、ool型變量和wchar_t型變量:布爾型變量是有兩種邏輯狀態(tài)的變量,它包含兩個值:真和假。如果在表達式中使用了布爾型變量,那么將根據(jù)變量值的真假而賦予整型值1或0。要把一個整型變量轉換成布爾型變量,如果整型值為0,則其布爾型值為假;反之如果整型值為非0,則其布爾型值為真。布兒型變量在運行時通常用做標志,比如進行邏輯測試以改變程序流程。#includeiostream.hintmain()boolflag;flag=true;if(flag)coutreturn0;C+中還包括wchar_t數(shù)據(jù)類型,wchar_t也是字符類型,但是是那些寬度超過8位的數(shù)據(jù)類型。許多外文字符集所含的數(shù)目超過25

5、6個,char字符類型無法完全囊括。wchar_t數(shù)據(jù)類型一般為16位。標準C+的iostream類庫中包括了可以支持寬字符的類和對象。用wout替代cout即可。#includeiostream.hintmain()wchar_twc;wc=b;woutwc=y;woutwc=e;woutreturn0;說明一下:某些編譯器無法編譯該程序(不支持該數(shù)據(jù)類型)。三、強制類型轉換有時候,根據(jù)表達式的需要,某個數(shù)據(jù)需要被當成另外的數(shù)據(jù)類型來處理,這時,就需要強制編譯器把變量或常數(shù)由聲明時的類型轉換成需要的類型。為此,就要使用強制類型轉換說明,格式如下:int*iptr=(int*)&table;表

6、達式的前綴(int*)就是傳統(tǒng)C風格的強制類型轉換說明(typecast),又可稱為強制轉換說明(cast)。強制轉換說明告訴編譯器把表達式轉換成指定的類型。有些情況下強制轉換是禁用的,例如不能把一個結構類型轉換成其他任何類型。數(shù)字類型和數(shù)字類型、指針和指針之間可以相互轉換。當然,數(shù)字類型和指針類型也可以相互轉換,但通常認為這樣做是不安全而且也是沒必要的。強制類型轉換可以避免編譯器的警告。longintel=123;shorti=(int)el;floatm=34.56;inti=(int)m;上面兩個都是C風格的強制類型轉換,C+還增加了一種轉換方式,比較一下上面和下面這個書寫方式的不同:l

7、ongintel=123;shorti=int(el);floatm=34.56;inti=int(m);使用強制類型轉換的最大好處就是:禁止編譯器對你故意去做的事發(fā)出警告。但是,利用強制類型轉換說明使得編譯器的類型檢查機制失效,這不是明智的選擇。通常,是不提倡進行強制類型轉換的。除非不可避免,如要調用malloc()函數(shù)時要用的void型指針轉換成指定類型指針。四、標準輸入輸出流在C語言中,輸入輸出是使用語句scanf()和printf()來實現(xiàn)的,而C+中是使用類來實現(xiàn)的。#includeiostream.hmain()/C+中main()函數(shù)默認為int型,而C語言中默認為void型。i

8、nta;couta;/*輸入一個數(shù)值*/coutreturn0;cin,cout,endl對象,他們本身并不是C+語言的組成部分。雖然他們已經是ANSI標71C+中被定義,但是他們不是語言的內在組成部分。在C+中不提供內在的輸入輸出運算符,這與其他語言是不同的。輸入和輸出是通過C+類來實現(xiàn)的,cin和cout是這些類的實例,他們是在C+語言的外部實現(xiàn)。在C+語言中,有了一種新的注釋方法,就是,制刻行的所有說明都被編譯器認為是注釋,這種注釋不能換行。C+中仍然保留了傳統(tǒng)C語言的注釋風格/*/。C+也可采用格式化輸出的方法:#includeiostream.hintmain()inta;couta

9、;cout五、函數(shù)重載這樣這些函在C+中,允許有相同的函數(shù)名,不過它們的參數(shù)類型不能完全相同,數(shù)就可以相互區(qū)別開來。而這在C語言中是不允許的。.參數(shù)個數(shù)不同#includeiostream.hvoida(int,int);voida(int);intmain()a(5);a(6,7);return0;voida(inti)coutvoida(inti,intj)cout.參數(shù)格式不同#includeiostream.hvoida(int,int);voida(int,float);intmain()a(5,6);a(6,7.0);return0;voida(inti,intj)coutvoid

10、a(inti,floatj)couta;語言中,不允許在這里定義變量for(inti=1;i=10;i+)/Cstaticinta=0;/C語言中,同一函數(shù)塊,不允許有同名變量a+=i;cout:areturn0;七、new和delete運算符在C+語言中,仍然支持malloc()和free()來分配和釋放內存,同時增加了new和delete來管理內存。.為固定大小的數(shù)組分配內存#includeiostream.hintmain()int*birthday=newint3;birthday0=6;birthday1=24;birthday2=1940;coutsize;int*array=ne

11、wintsize;for(inti=0;iarrayi=rand();for(i=0;icoutndeletearray;return0;八、引用型變量在C+中,引用是一個經常使用的概念。引用型變量是其他變量的一個別名,我們可以認為他們只是名字不相同,其他都是相同的。1.引用是一個別名C+中的引用是其他變量的別名。聲明一個引用型變量,需要給他一個初始化值,在變量的生存周期內,該值不會改變。&運算符定義了一個引用型變量:inta;int&b=a;先聲明一個名為a的變量,它還有一個別名bo我們可以認為是一個人,有一個真名,一個外號,以后不管是喊他a還是b,都是叫他這個人。同樣,作為變量,以后對這兩

12、個標識符操作都會產生相同的效果。#includeiostream.hintmain()inta=123;int&b=a;couta+;coutb+;cout等運算符#includeiostream.hvoidfunc1(sp);voidfunc2(s&p);structsintn;chartext10;intmain()staticsstr=123,China;func1(str);func2(str);return0;voidfunc1(sp)coutcoutvoidfunc2(s&p)coutcout從表面上看,這兩個函數(shù)沒有明顯區(qū)別,不過他們所花的時間卻有很大差異,func2()函數(shù)所用

13、的時間開銷會比func2()函數(shù)少很多。它們還有一個差別,如果程序遞歸func1(),隨著遞歸的深入,會因為棧的耗盡而崩潰,但func2()沒有這樣的擔憂。被調用函數(shù)將直接對參數(shù)在調用者中的拷貝進行操作,而不是產生一個局部的拷貝(傳遞變量本身是這樣的)。這就稱為以引用方式調用。把參數(shù)的值傳遞到被調用函數(shù)內部的拷貝中則稱為以傳值方式調用。#includeiostream.hvoiddisplay(constDate&,constchar*);voidswapper(Date&,Date&);structDateintmonth,day,year;intmain()staticDatenow=2,

14、23,90;staticDatethen=9,10,60;display(now,Now:);display(then,Then:);swapper(now,then);display(now,Now:);display(then,Then:);return0;voidswapper(Date&dt1,Date&dt2)Datesave;save=dt1;dt1=dt2;dt2=save;voiddisplay(constDate&dt,constchar*s)coutcout5.以引用作為返回值#includeiostream.hstructDateintmonth,day,year;Dat

15、ebirthdays=12,12,60;10,25,85;5,20,73;constDate&getdate(intn)returnbirthdaysn-1;intmain()intdt=1;while(dt!=0)coutdt;if(dt0&dt4)constDate&bd=getdate(dt);coutreturn0;程序都很簡單,就不講解了C+輔導筆記:類的設計、構造函數(shù)和析構函數(shù)一、類的設計.類的聲明class類名private:/私有public:/公有.;類的成員一般在C+類中,所有定義的變量和函數(shù)都是類的成員。如果是變量,我們就叫它數(shù)據(jù)成員如果是函數(shù),我們就叫它成員函數(shù)。類成員

16、的可見性private和public訪問控制符決定了成員的可見性。由一個訪問控制符設定的可訪問狀態(tài)將一直持續(xù)到下一個訪問控制符出現(xiàn),或者類聲明的結束。私有成員僅能被同一個類中的成員函數(shù)訪問,公有成員既可以被同一類中的成員函數(shù)訪問,也可以被其他已經實例化的類中函數(shù)訪問。當然,這也有例外的情況,這是以后要討論的友元函數(shù)。類中默認的數(shù)據(jù)類型是private,結構中的默認類型是public。一般情況下,變量都作為私有成員出現(xiàn),函數(shù)都作為公有成員出現(xiàn)。類中還有一種訪問控制符protected,叫保護成員,以后再說明。初始化在聲明一個類的對象時,可以用圓括號()包含一個初始化表??聪旅嬉粋€例子:#incl

17、udeiostream.hclassBoxprivate:個私有數(shù)據(jù)成員intheight,width,depth;/3public:Box(int,int,int);Box();intvolume();/成員函數(shù);Box:Box(intht,intwd,intdp)height=ht;width=wd;depth=dp;Box:Box()/nothingintBox:volume()returnheight*width*depth;intmain()Boxthisbox(3,4,5);/聲明一個類對象并初始化coutreturn0;當一個類中沒有private成員和protected成員時,

18、也沒有虛函數(shù),并且不是從其他類中派生出來的,可以用來初始化。(以后再講解)內聯(lián)函數(shù)內聯(lián)函數(shù)和普通函數(shù)的區(qū)別是:內聯(lián)函數(shù)是在編譯過程中展開的。通常內聯(lián)函數(shù)必須簡短。定義類的內聯(lián)函數(shù)有兩種方法:一種和C語言一樣,在定義函數(shù)時使用關鍵字inline。如:inlineintBox:volume()returnheight*width*depth;還有一種方法就是直接在類聲明的內部定義函數(shù)體,而不是僅僅給出一個函數(shù)原型。我們把上面的函數(shù)簡化一下:#includeiostream.hclassBoxprivate:intheight,width,depth;public:Box(intht,intwd,i

19、ntdp)height=ht;width=wd;depth=dp;Box();intvolume()returnheight*width*depth;intmain()Boxthisbox(3,4,5);/聲明一個類對象并初始化coutreturn0;這樣,兩個函數(shù)都默認為內聯(lián)函數(shù)了。二、構造函數(shù)什么是構造函數(shù)?通俗的講,在類中,函數(shù)名和類名相同的函數(shù)稱為構造函數(shù)。上面的Box()函數(shù)就是構造函數(shù)。C+允許同名函數(shù),也就允許在一個類中有多個構造函數(shù)。如果一個都沒有,編譯器將為該類產生一個默認的構造函數(shù),這個構造函數(shù)可能會完成一些工作,也可能什么都不做。絕對不能指定構造函數(shù)的類型,即使是void

20、型都不可以。實際上構造函數(shù)默認為void型。當一個類的對象進入作用域時,系統(tǒng)會為其數(shù)據(jù)成員分配足夠的內存,但是系統(tǒng)不一定將其初始化。和內部數(shù)據(jù)類型對象一樣,外部對象的數(shù)據(jù)成員總是初始化為0。局部對象不會被初始化。構造函數(shù)就是被用來進行初始化工作的。當自動類型的類對象離開其作用域時,所站用的內存將釋放回系統(tǒng)。看上面的例子,構造函數(shù)Box()函數(shù)接受三個整型擦黑素,并把他們賦值給立方體對象的數(shù)據(jù)成員。如果構造函數(shù)沒有參數(shù),那么聲明對象時也不需要括號。使用默認參數(shù)的構造函數(shù)當在聲明類對象時,如果沒有指定參數(shù),則使用默認參數(shù)來初始化對象。#includeiostream.hclassBoxprivat

21、e:intheight,width,depth;public:Box(intht=2,intwd=3,intdp=4)height=ht;width=wd;depth=dp;Box();intvolume()returnheight*width*depth;intmain()Boxthisbox(3,4,5);/初始化Boxdefaulbox;/使用默認參數(shù)coutcoutreturn0;默認構造函數(shù)沒有參數(shù)或者參數(shù)都是默認值的構造函數(shù)稱為默認構造函數(shù)。如果你不提供構造函數(shù),編譯器會自動產生一個公共的默認構造函數(shù),這個構造函數(shù)什么都不做。如果至少提供一個構造函數(shù),則編譯器就不會產生默認構造函數(shù)

22、。重載構造函數(shù)一個類中可以有多個構造函數(shù)。這些構造函數(shù)必須具有不同的參數(shù)表。在一個類中需要接受不同初始化值時,就需要編寫多個構造函數(shù),但有時候只需要一個不帶初始值Box對象。#includeiostream.hclassBoxprivate:intheight,width,depth;public:Box()/nothingBox(intht=2,intwd=3,intdp=4)height=ht;width=wd;depth=dp;Box();intvolume()returnheight*width*depth;intmain()Boxthisbox(3,4,5);/初始化Boxother

23、box;otherbox=thisbox;coutreturn0;這兩個構造函數(shù)一個沒有初始化值,一個有。當沒有初始化值時,程序使用默認值,即2,3,4。但是這樣的程序是不好的。它允許使用初始化過的和沒有初始化過的Box對象,但它沒有考慮當thisbox給otherbox賦值失敗后,volume()該返回什么。較好的方法是,沒有參數(shù)表的構造函數(shù)也把默認值賦值給對象。classBoxintheight,width,depth;public:Box()height=0;width=0;depth=0;Box(intht,intwd,intdp)height=ht;width=wd;depth=dp

24、;intvolume()returnheight*width*depth;這還不是最好的方法,更好的方法是使用默認參數(shù),根本不需要不帶參數(shù)的構造函classBoxintheight,width,depth;public:Box(intht=0,intwd=0,intdp=0)height=ht;width=wd;depth=dp;intvolume()returnheight*width*depth;三、析構函數(shù)(系統(tǒng)自動調用)。析構函數(shù)的名字和類名一樣,不過要在前面加上對一個類來說,只能允許一個析構函數(shù),析構函數(shù)不能有參數(shù),并且也沒有返回值。析構函數(shù)的作用是完成一個清理工作,如釋放從堆中分配

25、的內存。我們也可以只給出析構函數(shù)的形式,而不給出起具體函數(shù)體,其效果是一樣的,如上面的例子。但在有些情況下,析構函數(shù)又是必需的。如在類中從堆中分配了內存,則必須在析構函數(shù)中釋放二級C+輔導筆記:類的轉換C+的內部數(shù)據(jù)類型遵循隱式類型轉換規(guī)則。假設某個表達市中使用了一個短整型變量,而編譯器根據(jù)上下文認為這兒需要是的長整型,則編譯器就會根據(jù)類型轉換規(guī)則自動把它轉換成長整型,這種隱式轉換出現(xiàn)在賦值、參數(shù)傳遞、返回值、初始化和表達式中。我們也可以為類提供相應的轉換規(guī)則。對一個類建立隱式轉換規(guī)則需要構造一個轉換函數(shù),該函數(shù)作為類的成員,可以把該類的對象和其他數(shù)據(jù)類型的對象進行相互轉換。聲明了轉換函數(shù),就

26、告訴了編譯器,當根據(jù)句法判定需要類型轉換時,就調用函數(shù)。有兩種轉換函數(shù)。一種是轉換構造函數(shù);另一種是成員轉換函數(shù)。需要采用哪種轉換函數(shù)取決于轉換的方向。一、轉換構造函數(shù)當一個構造函數(shù)僅有一個參數(shù),且該參數(shù)是不同于該類的一個數(shù)據(jù)類型,這樣的構造函數(shù)就叫轉換構造函數(shù)。轉換構造函數(shù)把別的數(shù)據(jù)類型的對象轉換為該類的一個對象。和其他構造函數(shù)一樣,如果聲明類的對象的初始化表同轉換構造函數(shù)的參數(shù)表相匹配,該函數(shù)就會被調用。當在需要使用該類的地方使用了別的數(shù)據(jù)類型,便宜器就會調用轉換構造函數(shù)進行轉換。#includeiostream.h#includetime.h#includestdio.hclassDat

27、eintmo,da,yr;public:Date(time_t);voiddisplay();voidDate:display()charyear5;if(yr10)sprintf(year,0%d,yr);elsesprintf(year,%d,yr);couttm_mday;mo=tim-tm_mon+1;yr=tim-tm_year;if(yr=100)yr-=100;intmain()time_tnow=time(0);Datedt(now);dt.display();return0;本程序先調用time()函數(shù)來獲取當前時間,并把它賦給time_t對象;然后程序通過調用Date類的轉

28、換構造函數(shù)來創(chuàng)建一個Date對象,該對象由time_t對象轉換而來。time_t對象先傳遞給localtime()函數(shù),然后返回一個指向tm結構(time.h文件中聲明)的指針,然后構造函數(shù)把結構中的日月年的數(shù)值拷貝給Date對象的數(shù)據(jù)成員,這就完成了從time_t對象到Date對象的轉換。二、成員轉換函數(shù)成員轉換函數(shù)把該類的對象轉換為其他數(shù)據(jù)類型的對象。在成員轉換函數(shù)的聲明中要用到關鍵字operator。這樣聲明一個成員轉換函數(shù):operatoraaa();在這個例子中,aaa就是要轉換成的數(shù)據(jù)類型的說明符。這里的類型說明符可以是任何合法的C+類型,包括其他的類。如下來定義成員轉換函數(shù);Cl

29、assname:operatoraaa()類名標識符是聲明了該函數(shù)的類的類型說明符。上面定義的Date類并不能把該類time_t型變量,但可以把它轉換成一個長整型值,計算從2000年1月1日到現(xiàn)在的天數(shù)。#includeiostream.hclassDateintmo,da,yr;public:Date(intm,intd,inty)mo=m;da=d;yr=y;operatorint();/聲明;Date:operatorint()/定義staticintdys=31,28,31,30,31,30,31,31,30,31,30,31;intdays=yr-2000;days*=365;day

30、s+=(yr-2000)/4;for(inti=0;idays+=dysi;days+=da;returndays;intmain()Datenow(12,24,2003);intsince=now;coutreturn0;三、類的轉換上面兩個例子都是C+類對象和內部數(shù)據(jù)對象之間的相互轉換。也可以定義轉換函數(shù)來實現(xiàn)兩個類對象之間的相互轉換。#includeiostream.hclassCustomDatepublic:intda,yr;CustomDate(intd=0,inty=0)da=d;yr=y;voiddisplay()cout;classDateintmo,da,yr;public

31、:Date(intm=0,intd=0,inty=0)mo=m;da=d;yr=y;Date(constCustomDate&);/轉換構造函數(shù)operatorCustomDate();/成員轉換函數(shù)voiddisplay()cout;staticintdys=31,28,31,30,31,30,31,31,30,31,30,31;Date:Date(constCustomDate&jd)yr=jd.yr;da=jd.da;for(mo=0;modysmo)da-=dysmo;elsebreak;mo+;Date:operatorCustomDate()CustomDatecd(0,yr);f

32、or(inti=0;icd.da+=da;returncd;intmain()Datedt(12,24,3);CustomDatecd;cd=dt;/調用成員轉換函數(shù)cd.display();dt=cd;/調用轉換構造函數(shù)dt.display();return0;這個例子中有兩個類CustomDate和Date,CustomDate型日期包含年份和天數(shù)。這個例子沒有考慮閏年情況。但是在實際構造一個類時,應該考慮到所有問題的可能性。在Date里中具有兩種轉換函數(shù),這樣,當需要從Date型變?yōu)镃ustomDate型十,可以調用成員轉換函數(shù);反之可以調用轉換構造函數(shù)。不能既在Date類中定義成員轉換

33、函數(shù),又在CustomDate類里定義轉換構造函數(shù)。那樣編譯器在進行轉換時就不知道該調用哪一個函數(shù),從而出錯.四、轉換函數(shù)的調用C+里調用轉換函數(shù)有三種形式:第一種是隱式轉換,例如編譯器需要一個Date對象,而程序提供的是CustomDate對象,編譯器會自動調用合適的轉換函數(shù)。另外兩種都是需要在程序代碼中明確給出的顯式轉換。C+強制類型轉換是一種,還有一種是顯式調用轉換構造函數(shù)和成員轉換函數(shù)。下面的程序給出了三中轉換形式:#includeiostream.hclassCustomDatepublic:intda,yr;CustomDate(intd=0,inty=0)da=d;yr=y;vo

34、iddisplay()cout;classDateintmo,da,yr;public:Date(intm,intd,inty)mo=m;da=d;yr=y;operatorCustomDate();Date:operatorCustomDate()staticintdys=31,28,31,30,31,30,31,31,30,31,30,31;CustomDatecd(0,yr);for(inti=0;icd.da+=da;returncd;intmain()Datedt(11,17,89);CustomDatecd;cd=dt;cd.display();cd=(CustomDate)dt;

35、cd.display();cd=CustomDate(dt);cd.display();return0;五、轉換發(fā)生的情形還有幾種上面的幾個例子都是通過不能類型對象之間的相互賦值來調用轉換函數(shù),調用的可能:參數(shù)傳遞初始化返回值表達式語句這些情況下,都有可能調用轉換函數(shù)。下面的程序不難理解,就不分析了。#includeiostream.hclassCustomDatepublic:intda,yr;CustomDate()CustomDate(intd,inty)da=d;yr=y;voiddisplay()cout;classDateintmo,da,yr;public:Date(intm,i

36、ntd,inty)mo=m;da=d;yr=y;operatorCustomDate();Date:operatorCustomDate()staticintdys=31,28,31,30,31,30,31,31,30,31,30,31;CustomDatecd(0,yr);for(inti=0;icd.da+=da;returncd;classTesterCustomDatecd;public:explicitTester(CustomDatec)cd=c;voiddisplay()cd.display();voiddispdate(CustomDatecd)cd.display();Cus

37、tomDatertndate()Datedt(9,11,1);returndt;intmain()Datedt(12,24,3);CustomDatecd;cd=dt;cd.display();dispdate(dt);Testerts(dt);ts.display();cd=rtndate();cd.display();return0;六、顯式構造函數(shù)注意上面Tester類的構造函數(shù)前面有一個explicit修飾符。如果不加上這個關鍵字,那么在需要把CustomDate對象轉換成Tester對象時,編譯器會把該函數(shù)當作轉換構造函數(shù)來調用。但是有時候,并不想把這種只有一個參數(shù)的構造函數(shù)用于轉換

38、目的,而僅僅希望用它來顯式地初始化對象,此時,就需要在構造函數(shù)前加explicit 。如果在聲明了Tester對象以后使用了下面的語句將導致一個錯誤:ts=jd;/error這個錯誤說明,雖然Tester類中有一個以Date型變量為參數(shù)的構造函數(shù),編譯器卻不會把它看作是從Date到Tester的轉換構造函數(shù),因為它的聲明中包含了explicit修飾符。七、表達式內部的轉換在表達式內部,如果發(fā)現(xiàn)某個類型和需要的不一致,就會發(fā)生錯誤。數(shù)字類型的轉換是很簡單,這里就不舉例了。下面的程序是把Date對象轉換成長整型值。#includeiostream.hclassDateintmo,da,yr;pub

39、lic:Date(intm,intd,inty)mo=m;da=d;yr=y;operatorlong();Date:operatorlong()staticintdys=31,28,31,30,31,30,31,31,30,31,30,31;longdays=yr;days*=365;days+=(yr-1900)/4;/從1900年1月1日開始計算for(inti=0;idays+=da;returndays;intmain()Datetoday(12,24,2003);constlongott=123;longsum=ott+today;coutreturn0;在表達式中,當需要轉換的對

40、象可以轉換成某個數(shù)字類型,或者表達式調用了作用于某個類的重載運算符時,就會發(fā)生隱式轉換。運算符重載以后再學習二級C+輔導筆記:私有數(shù)據(jù)成員和友元一、私有數(shù)據(jù)成員的使用取值和賦值成員函數(shù)面向對象的約定就是保證所有數(shù)據(jù)成員的私有性。一般我們都是通過公有成員函數(shù)來作為公共接口來讀取私有數(shù)據(jù)成員的。某些時候,我們稱這樣的函數(shù)為取值和賦值函取值函數(shù)的返回值和傳遞給賦值函數(shù)的參數(shù)不必一一匹配所有數(shù)據(jù)成員的類型。匹配所有數(shù)據(jù)成員的類型#includeiostream.hclassDateintmo,da,yr;public:Date(intm,intd,inty)mo=m;da=d;yr=y;intgety

41、ear()constreturnyr;voidsetyear(inty)yr=y;intmain()Datedt(4,1,89);coutdt.setyear(97);coutreturn0;上面的例子很簡單,不分析了。要養(yǎng)成這樣的習慣,通過成員函數(shù)來訪問和改變類中的數(shù)據(jù)。這樣有利于軟件的設計和維護。比如,改變Date類內部數(shù)據(jù)的形式,但仍然用修改過的getyear()和setyear()來提供訪問接口,那么使用該類就不必修改他們的代碼,僅需要重新編譯程序即可。常量成員函數(shù)注意上面的程序中getyear()被聲明為常量型,這樣可以保證該成員函數(shù)不會修改調用他的對象。通過加上const修飾符,可

42、以使訪問對象數(shù)據(jù)的成員函數(shù)僅僅完成不會引起數(shù)據(jù)變動的那些操作。如果程序聲明某個Date對象為常量的話,那么該對象不得調用任何非常量型成員函數(shù),不論這些函數(shù)是否真的試圖修改對象的數(shù)據(jù)。只有把那些不會引起數(shù)據(jù)改變的函數(shù)都聲明為常量型,才可以讓常量對象來調用。改進的成員轉換函數(shù)下面的程序改進了從Date對象到CustomDate對象的成員轉換函數(shù),用取值和賦值函數(shù)取代了使用公有數(shù)據(jù)成員的做法。(以前的程序代碼在上一帖中)#includeiostream.hclassCustomDateintda,yr;public:CustomDate()CustomDate(intd,inty)da=d;yr=y

43、;voiddisplay()constcoutintgetday()constreturnda;voidsetday(intd)da=d;classDateintmo,da,yr;public:Date(intm,intd,inty)mo=m;da=d;yr=y;Date:operatorCustomDate()conststaticintdys=31,28,31,30,31,30,31,31,30,31,30,31;CustomDatecd(0,yr);intday=da;for(inti=0;icd.setday(day);returncd;intmain()Datedt(11,17,89

44、);CustomDatecd;cd=dt;cd.display();return0;注意上面的程序中Date:operatorCustomDate()聲明為常量型,因為這個函數(shù)沒有改變調用它對象的數(shù)據(jù),盡管它修改了一個臨時CustomDate對象并將其作為函數(shù)返回值。二、友元前面已經說過了,私有數(shù)據(jù)成員不能被類外的其他函數(shù)讀取,但是有時候類會允許一些特殊的函數(shù)直接讀寫其私有數(shù)據(jù)成員。關鍵字friend可以讓特定的函數(shù)或者別的類的所有成員函數(shù)對私有數(shù)據(jù)成員進行讀寫。這既可以維護數(shù)據(jù)的私有性,有可以保證讓特定的類或函數(shù)能夠直接訪問私有數(shù)據(jù)。友元類一個類可以聲明另一個類為其友元,這個友元的所有成員函

45、數(shù)都可以讀寫它的私有數(shù)據(jù)。#includeiostream.hclassDate;classCustomDateintda,yr;public:CustomDate(intd=0,inty=0)da=d;yr=y;voiddisplay()constcoutfriendDate;/這兒;classDateintmo,da,yr;public:Date(intm,intd,inty)mo=m;da=d;yr=y;operatorCustomDate();Date:operatorCustomDate()staticintdys=31,28,31,30,31,30,31,31,30,31,30,3

46、1;CustomDatecd(0,yr);for(inti=0;icd.da+=da;returncd;intmain()Datedt(11,17,89);CustomDatecd(dt);cd.display();return0;在上面的程序中,有這樣一句friendDate;該語句告訴編譯器,Date類的所有成員函數(shù)有權訪問CustomDate類的私有成員。因為Date類的轉換函數(shù)需要知道CustomDate類的每個數(shù)據(jù)成員,所以真?zhèn)€Date類都被聲明為CustomDate類的友元。隱式構造函數(shù)上面程序對CustomDate的構造函數(shù)的調用私有顯示該類需要如下的一個轉換構造函數(shù):Custo

47、mDate(Date&dt);但是唯一的一個構造函數(shù)是:CustomDate(intd=0;inty=0);這就出現(xiàn)了問題,編譯器要從Date對象構造一個CustomDate對象,但是CustomDate類中并沒有定義這樣的轉換構造函數(shù)。不過Date類中定義了一個成員轉換函數(shù),它可以把Date對象轉換成CustomDate對象。于是編譯器開始搜索CustomDate類,看其是否有一個構造函數(shù),能從一個已存在的CustomDate的對象創(chuàng)建新的CustomDate對象。這種構造函數(shù)叫拷貝構造函數(shù)。拷貝構造函數(shù)也只有一個參數(shù),該參數(shù)是它所屬的類的一個對象,由于CustomDate類中沒有拷貝構造函

48、數(shù),于是編譯器就會產生一個默認的拷貝構造函數(shù),該函數(shù)簡單地把已存在的對象的每個成員拷貝給新對象?,F(xiàn)在我們已經知道,編譯器可以把Date對象轉換成CustomDate對象,也可以從已存在的CustomDate對象生成一個新的CustomDate對象。那么上面提出的問題,編譯器就是這樣做的:它首先調用轉換函數(shù),從Date對象創(chuàng)建一個隱藏的、臨時的、匿名的CustomDate對象,然后用該臨時對象作為參數(shù)調用默認拷貝構造函數(shù),這就生成了一個新的CustomDate對象。預引用上面的例子中還有這樣一句classDate;這個語句叫做預引用。它告訴編譯器,類Date將在后面定義。編譯器必須知道這個信號,

49、因為CustomDate類中引用了Date類,而Date里也引用了CustomDate類,必須首先聲明其中之一。使用了預引用后,就可以聲明未定義的類的友元、指針和引用。但是不可以使用那些需要知道預引用的類的定義細節(jié)的語句,如聲明該類的一個實例或者任何對該類成員的引用顯式友元預引用也可以不使用預引用,這只要在聲明友元的時候加上關鍵自class就行了。#includeiostream.hclassCustomDateintda,yr;public:CustomDate(intd=0,inty=0)da=d;yr=y;voiddisplay()constcoutfriendclassDate;/這兒

50、,去掉前面的預引用;classDate;Date:operatorCustomDate()intmain()友元函數(shù)通常,除非真的需要,否則并不需要把整個類都設為另一個類的友元,只需挑出需要訪問當前類私有數(shù)據(jù)成員的成員函數(shù),將它們設置為該類的友元即可。這樣的函數(shù)稱為友元函數(shù)。下面的程序限制了CustomDate類數(shù)據(jù)成員的訪問,Date類中只有需要這些數(shù)據(jù)的成員函數(shù)才有權讀寫它們。#includeiostream.hclassCustomDate;classDateintmo,da,yr;public:Date(constCustomDate&);voiddisplay()constcout;classCustomDateintda,yr;public:CustomDate(intd=0,inty=0)da=d;yr=y

溫馨提示

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

評論

0/150

提交評論