




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、編程高手之路- C+入門_變量和常量編譯環境設置好以后,就可以正式學習C語言了。一、變量(一)、變量類型和表示方法1.什么是變量?一句話,變量是存儲數據的值的空間。由于數值的類型有多種,有整數、小數(浮點數)、字符等等,那么對應的變量就有整型變量、浮點型變量、字符型變量。變量還有其他的具體分類。整型變量還可具體分為無符號型、長整型和短整型。浮點型也可分為單精度型、雙精度型和長雙精度型。此外還可以分為靜態變量、外部變量、寄存器變量和自動存儲變量。這些數據類型我們在本節和后面的章節中都會陸陸續續介紹。那么變量我們總要給它取個名字吧,這個名字我們叫做標識符。標識符的命名有一定的規則:(1).標識符只
2、能由字母、數字和下劃線三類字符組成(2).第一個字符必須是字母(第一個字符也可以是下劃線,但被視作系統自定義的標識符)(3).大寫字母和小寫字母被認為是兩個不同的字符,如A和a是兩個不同的標識符 (4).標識符可以任意長,但只有前32位有效。有些舊的C版本對外部標識符的限制為6位。這是由于鏈接程序的限制所總成的,而不是C語言本身的局限性(5).標識符不能是C的關鍵字2.從上面的規則中,有個關鍵字的概念。那么什么叫關鍵字呢?從表面字意上也可以看出,關鍵字是C語言本身某些特性的一個表示,是唯一的代表某一個意思的。下面列出ANSI標準定義的32個C語言的關鍵字,這些關鍵字在以后的學習中基本上都會用到
3、,到時再說它們的各自用法。auto break case char const continue defaultdo double else enum extern float forgoto if int long register return shortsigned sizeof static struct switch typedefunion unsigned void volatile whileC語言還包括一些不能用做標識符的擴展關鍵字。asm cdecl _cs _ds _es far huge interrupt near pascal _ss所以在以后的學習中,在給變量命名
4、時要避開這些關鍵字。3. Turbo C2.0規定所有變量在使用前都必須加以說明。一條變量說明語句由數據類型和其后的一個或多個變量名組成。變量說明的形式如下: 類型 <變量表> 這里類型是指Turbo C2.0的有效數據類型。變量表是一個或多個標識符名,每個標識符之間用,分隔。(二)、整型變量整型變量是用來存儲整數的。整型變量又可具體分為好幾種,最基本的整型變量是用類型說明符int聲明的符號整型,形式如下:int Counter;這里int是類型說明符,Counter是變量的名字。整型變量可以是有符號型、無符號型、長型、短型或象上面定義的普通符號整型。整型是16位的,長整型是32位
5、,短整型等價于整型。以下是幾種整型變量的聲明示例:long int Amount; /*長整型*/long Amount; /*長整型,等價于上面*/signed int Total; /*有符號整型*/signed Total; /*有符號整型,等價于上面*/unsigned int Offset; /*無符號整型*/unsigned Offset; /*無符號整型,等價于上面*/short int SmallAmt; /*短整型*/short SmallAmt; /*短整型,等價于上面*/unsigned short int Month; /*無符號短整型*/unsigned short
6、Month; /*無符號短整型,等價于上面*/從上面的示例可以看出,當定義長整型、短整型、符號整型或無符號整型時,可以省略關鍵字int。注明:1.用signed對整型變量進行有符號指定是多余的,因為除非用unsigned指定為無符號型,否則整型都是有符號的。2.當一個變量有幾重特性時,聲明關鍵字的順序可以任意。以下幾種聲明是等價的:unsigned long T1;long unsigned T2;unsigned long int T3;unsigned int long T4;long unsigned int T5;long int unsigned T6;int unsigned lo
7、ng T7;int long unsigned T8;(三)、浮點類型變量顧名思義,浮點類型變量是用來存儲帶有小數的實數的。C語言中有三種不同的浮點類型,以下是對這三種不同類型的聲明示例:float Amount; /*單精度型*/double BigAmount; /*雙精度型*/long double ReallyBigAmount; /*長雙精度型*/這里Amount,BigAmount,ReallyBigAmount都是變量名。浮點型都是有符號的。(四)、字符型變量字符型變量中所存放的字符是計算機字符集中的字符。對于PC機上運行的C系統,字符型數據用8位單字節的ASCII碼表示。程序用
8、類型說明符char來聲明字符型變量:char ch;這條聲明語句聲明了一個字符型變量,標識符為ch。當以這種形式聲明變量之后,程序可以在表達式中引用這個變量,關于語句和表達式的知識在后面將會介紹。字符數據類型事實上是8位的整型數據類型,可以用于數值表達式中,與其他的整型數據同樣使用。在這種情況下,字符型變量可以是有符號的,也可以是無符號的。對于無符號的字符型變量可以聲明為:unsigned char ch;除非聲明為無符號型,否則在算術運算和比較運算中,字符型變量一般作為8位有符號整型變量處理。還有其他的如指針型變量,void型變量,以后再介紹。二、常量常量的意思就是不可改變的量,是一個常數。
9、同變量一樣,常量也分為整型常量、浮點型常量、字符型常量,還有字符串常量、轉義字符常量和地址常量。(一)、整型常量整型常量可以是長整型、短整型、有符號型、無符號型。在Tubbo C 2.0里有符號整型常量的范圍從-32768到32767,無符號整型的為0到65535;有符號長整型的范圍為-2147483648到2147483647。無符號長整型的范圍為0到4294967295。短整型同字符型。可以指定一個整型常量為二進制、八進制或十六進制,如以下語句:-129, 0x12fe, 0177常量的前面有符號0x,這個符號表示該常量是十六進制表示。如果前面的符號只有一個字母0,那么表示該常量是八進制。
10、有時我們在常量的后面加上符號L或者U,來表示該常量是長整型或者無符號整型:22388L, 0x4efb2L, 40000U后綴可以是大寫,也可以是小寫。(二)、浮點型常量一個浮點型常量由整數和小數兩部分構成,中間用十進制的小數點隔開。有些浮點樹非常大或者非常小,用普通方法不容易表示,可以用科學計數法或者指數方法表示。下面是一個實例:3.1416, 1.234E-30, 2.47E201注意在C語言中,數的大小也有一定的限制。對于float型浮點數,數的表示范圍為-3.402823E38到3.402823E38,其中-1.401298E-45到1.401298E-45不可見。double型浮點型
11、常數的表示范圍為-1.79E308到1.79E308,其中-4.94E-324到4.94E-324不可見。在浮點型常量里我們也可以加上后綴。FloatNumber=1.6E10F; /*有符號浮點型*/LongDoubleNumber=3.45L; /*長雙精度型*/后綴可大寫也可小寫。說明: 1. 浮點常數只有一種進制(十進制)。 2. 所有浮點常數都被默認為double。 3. 絕對值小于1的浮點數, 其小數點前面的零可以省略。如:0.22可寫為.22, -0.0015E-3可寫為-.0015E-3。 4. Turbo C默認格式輸出浮點數時, 最多只保留小數點后六位(三)、字符型常量 字
12、符型常量所表示的值是字符型變量所能包含的值。我們可以用ASCII表達式來表示一個字符型常量,或者用單引號內加反斜杠表示轉義字符。'A', 'x2f', '013'其中:x表示后面的字符是十六進制數,0表示后面的字符是八進制數。注意:在Turbo C 2.0中,字符型常量表示數的范圍是-128到127,除非你把它聲明為unsigned,這樣就是0到255。(四)、字符串常量字符串常量就是一串字符,用雙引號括起來表示。Hello,World!nEnter selection:aError!(五)、轉義字符上面我們見到的x,n,a等等都是叫轉義字符,它
13、告訴編譯器需要用特殊的方式進行處理。下面給出所有的轉義字符和所對應的意義:轉義字符 描述' 單引號 雙引號 反斜杠0 空字符0nnn 八進制數a 聲音符b 退格符f 換頁符n 換行符r 回車符t 水平制表符v 垂直制表符x 十六進制符它們的具體用法我們到講輸出語句時再介紹。(六)、地址常量我們前面說的變量是存儲數據的空間,它們在內存里都有對應的地址。在C語言里可以用地址常量來引用這些地址,如下:&Counter, ∑&是取地址符,作用是取出變量(或者函數)的地址。在后面的輸入語句和指針里還會說明。這一節所講到的變量和常量知識可以說是在一切程序中都要用到,
14、特別是變量的聲明和命名規則。編程高手之路- C+入門_類的轉換C+的內部數據類型遵循隱式類型轉換規則。假設某個表達市中使用了一個短整型變量,而編譯器根據上下文認為這兒需要是的長整型,則編譯器就會根據類型轉換規則自動把它轉換成長整型,這種隱式轉換出現在賦值、參數傳遞、返回值、初始化和表達式中。我們也可以為類提供相應的轉換規則。對一個類建立隱式轉換規則需要構造一個轉換函數,該函數作為類的成員,可以把該類的對象和其他數據類型的對象進行相互轉換。聲明了轉換函數,就告訴了編譯器,當根據句法判定需要類型轉換時,就調用函數。有兩種轉換函數。一種是轉換構造函數;另一種是成員轉換函數。需要采用哪種轉換函數取決于
15、轉換的方向。一、轉換構造函數當一個構造函數僅有一個參數,且該參數是不同于該類的一個數據類型,這樣的構造函數就叫轉換構造函數。轉換構造函數把別的數據類型的對象轉換為該類的一個對象。和其他構造函數一樣,如果聲明類的對象的初始化表同轉換構造函數的參數表相匹配,該函數就會被調用。當在需要使用該類的地方使用了別的數據類型,便宜器就會調用轉換構造函數進行轉換。#include iostream.h#include time.h#include stdio.hclass Dateint mo, da, yr;public:Date(time_t);void display();void Date:displ
16、ay()char year5;if(yr<10)sprintf(year,0%d,yr);elsesprintf(year,%d,yr);cout<<MO<<' ?<<year;Date:Date(time_t now)tm* tim=localtime(&now);da=tim->tm_mday;mo=tim->tm_mon+1;yr=tim->tm_year;if(yr>=100) yr-=100;int main()time_t now=time(0);Date dt(now);dt.display();r
17、eturn 0;本程序先調用time()函數來獲取當前時間,并把它賦給time_t對象;然后程序通過調用Date類的轉換構造函數來創建一個Date對象,該對象由time_t對象轉換而來。time_t對象先傳遞給localtime()函數,然后返回一個指向tm結構(time.h文件中聲明)的指針,然后構造函數把結構中的日月年的數值拷貝給Date對象的數據成員,這就完成了從time_t對象到Date對象的轉換。二、成員轉換函數成員轉換函數把該類的對象轉換為其他數據類型的對象。在成員轉換函數的聲明中要用到關鍵字operator。這樣聲明一個成員轉換函數:operator aaa();在這個例子中,a
18、aa就是要轉換成的數據類型的說明符。這里的類型說明符可以是任何合法的C+類型,包括其他的類。如下來定義成員轉換函數;Classname:operator aaa()類名標識符是聲明了該函數的類的類型說明符。上面定義的Date類并不能把該類的對象轉換回time_t型變量,但可以把它轉換成一個長整型值,計算從2000年1月1日到現在的天數。#include iostream.hclass Dateint mo,da,yr;public:Date(int m,int d,int y) mo=m; da=d; yr=y;operator int(); /聲明;Date:operator int() /
19、定義static int dys=31,28,31,30,31,30,31,31,30,31,30,31;int days=yr-2000;days*=365;days+=(yr-2000)/4;for(int i=0;i<MO-1;I+)days+=dysi;days+=da; return days;int main()Date now(12,24,2003);int since=now;cout<<SINCE<<ENDL;return 0;三、類的轉換上面兩個例子都是C+類對象和內部數據對象之間的相互轉換。也可以定義轉換函數來實現兩個類對象之間的相互轉換。#
20、include iostream.hclass CustomDatepublic:int da, yr;CustomDate(int d=0,int y=0) da=d; yr=y;void display()cout<<YR<<'-'<<DA<<ENDL;class Dateint mo, da, yr;public:Date(int m=0,int d=0,int y=0) mo=m; da=d; yr=y;Date(const CustomDate&); /轉換構造函數operator CustomDate(); /
21、成員轉換函數void display()cout<<MO<<' ?<<da<<<yr<<endl;static int dys = 31,28,31,30,31,30,31,31,30,31,30,31;Date:Date(const CustomDate& jd)yr=jd.yr;da=jd.da;for(mo=0;mo<11;mo+)if(da>dysmo) da-=dysmo;else break;mo+;Date:operator CustomDate()CustomDate cd(0,yr)
22、;for(int i=0;i cd.da+=da;return cd;int main()Date dt(12,24,3);CustomDate cd;cd = dt; /調用成員轉換函數cd.display();dt = cd; /調用轉換構造函數dt.display();return 0;這個例子中有兩個類CustomDate和Date,CustomDate型日期包含年份和天數。這個例子沒有考慮閏年情況。但是在實際構造一個類時,應該考慮到所有問題的可能性。在Date里中具有兩種轉換函數,這樣,當需要從Date型變為CustomDate型十,可以調用成員轉換函數;反之可以調用轉換構造函數。不
23、能既在Date類中定義成員轉換函數,又在CustomDate類里定義轉換構造函數。那樣編譯器在進行轉換時就不知道該調用哪一個函數,從而出錯。四、轉換函數的調用C+里調用轉換函數有三種形式:第一種是隱式轉換,例如編譯器需要一個Date對象,而程序提供的是CustomDate對象,編譯器會自動調用合適的轉換函數。另外兩種都是需要在程序代碼中明確給出的顯式轉換。C+強制類型轉換是一種,還有一種是顯式調用轉換構造函數和成員轉換函數。下面的程序給出了三中轉換形式:#include iostream.hclass CustomDatepublic:int da, yr;CustomDate(int d=0
24、,int y=0) da=d; yr=y;void display()cout<<YR<<'-'<<DA<<ENDL;class Dateint mo, da, yr;public:Date(int m,int d,int y)mo=m; da=d; yr=y;operator CustomDate();Date:operator CustomDate()static int dys=31,28,31,30,31,30,31,31,30,31,30,31;CustomDate cd(0,yr);for(int i=0;i cd.d
25、a+=da;return cd;int main()Date dt(11,17,89);CustomDate cd;cd = dt;cd.display();cd = (CustomDate) dt;cd.display();cd = CustomDate(dt);cd.display();return 0;五、轉換發生的情形上面的幾個例子都是通過不能類型對象之間的相互賦值來調用轉換函數,還有幾種調用的可能:參數傳遞初始化返回值表達式語句這些情況下,都有可能調用轉換函數。下面的程序不難理解,就不分析了。#include iostream.hclass CustomDatepublic:int
26、da, yr;CustomDate() CustomDate(int d,int y) da=d; yr=y;void display()cout<<YR<<'-'<<DA<<ENDL;class Dateint mo, da, yr;public:Date(int m,int d,int y) mo=m; da=d; yr=y; operator CustomDate(); ; Date:operator CustomDate()static int dys=31,28,31,30,31,30,31,31,30,31,30,31
27、;CustomDate cd(0,yr);for (int i=0;i cd.da+=da;return cd;class TesterCustomDate cd;public:explicit Tester(CustomDate c) cd=c; void display() cd.display(); ;void dispdate(CustomDate cd)cd.display();CustomDate rtndate()Date dt(9,11,1);return dt; int main()Date dt(12,24,3);CustomDate cd;cd = dt;cd.displ
28、ay();dispdate(dt);Tester ts(dt);ts.display();cd = rtndate();cd.display();return 0;六、顯式構造函數注意上面Tester類的構造函數前面有一個explicit修飾符。如果不加上這個關鍵字,那么在需要把CustomDate對象轉換成Tester對象時,編譯器會把該函數當作轉換構造函數來調用。但是有時候,并不想把這種只有一個參數的構造函數用于轉換目的,而僅僅希望用它來顯式地初始化對象,此時,就需要在構造函數前加explicit。如果在聲明了Tester對象以后使用了下面的語句將導致一個錯誤:ts=jd; /error這
29、個錯誤說明,雖然Tester類中有一個以Date型變量為參數的構造函數,編譯器卻不會把它看作是從Date到Tester的轉換構造函數,因為它的聲明中包含了explicit修飾符。七、表達式內部的轉換在表達式內部,如果發現某個類型和需要的不一致,就會發生錯誤。數字類型的轉換是很簡單,這里就不舉例了。下面的程序是把Date對象轉換成長整型值。#include iostream.hclass Dateint mo, da, yr;public:Date(int m,int d,int y)mo=m; da=d; yr=y;operator long();Date:operator long()sta
30、tic int dys=31,28,31,30,31,30,31,31,30,31,30,31;long days=yr;days*=365;days+=(yr-1900)/4; /從1900年1月1日開始計算for(int i=0;i days+=da;return days;int main()Date today(12,24,2003);const long ott=123;long sum=ott+today;cout<<OTT<< + today<<="<<sum;< return 0;在表達式中,當需要轉換的對象可以轉
31、換成某個數字類型,或者表達式調用了作用于某個類的重載運算符時,就會發生隱式轉換。運算符重載以后再學習。編程高手之路- C+入門類的其他幾點問題一、拷貝構造函數拷貝構造函數在下列情況下被調用:用已經存在的對象去初始化同一個類的另一個對象;在函數的參數中,以傳值方式傳遞類對象的拷貝;類對象的值被用做函數的返回值。拷貝構造函數和前面說到的轉換構造函數有些相似。轉換構造函數是把一個類的對象轉化為另一個類的對象;拷貝構造函數是用一個已經存在的對象的值實例化該類的一個新對象。不同對象間的初始化和賦值的區別:賦值操作是在兩個已經存在的對象間進行的;而初始化是要創建一個新的對象,并且其初值來源于另一個已存在的
32、對象。編譯器會區別這兩種情況,賦值的時候調用重載的賦值運算符,初始化的時候調用拷貝構造函數。如果類中沒有拷貝構造函數,則編譯器會提供一個默認的。這個默認的拷貝構造函數只是簡單地復制類中的每個成員。#include iostream.h#include string.hclass Dateint mo, da, yr;char* month;public:Date(int m = 0, int d = 0, int y = 0);Date(const Date&);Date();void display() const;Date:Date(int m, int d, int y)stat
33、ic char* mos =January, February, March, April, May, June, July, August, September, October, November, December;mo = m; da = d; yr = y;if (m != 0)month = new charstrlen(mosm-1)+1;strcpy(month, mosm-1);elsemonth = 0;Date:Date(const Date& dt)mo = dt.mo;da = dt.da;yr = dt.yr;if (dt.month != 0)month
34、= new char strlen(dt.month)+1;strcpy(month, dt.month);elsemonth = 0;Date:Date()delete month;void Date:display() constif (month != 0)cout << month <<' '<< da << , << yr << std:endl;int main()Date birthday(6,24,1940);birthday.display();Date newday = birthday
35、;newday.display();Date lastday(birthday);lastday.display();return 0;本例中,用到了兩次拷貝構造函數。一個是使用普通的C+初始化變量的語句:Date newday = birthday;另一個是使用構造函數的調用約定,即把初始化值作為函數的參數:Date lastday(birthday);二、類的引用在函數參數和返回值中,如果一定要使用傳值方式,那么使用類對象的引用,是一個提高效率的方法。類的數據成員也可以是一個引用,但必須注意:第一,一個引用必須初始化。通常一個類對象并不會像結構那樣用大括號來初始化,而是調用構造函數。因此在
36、構造函數里必須初始化類當中的引用成員。第二,引用是一個別名。盡管類里面的引用在使用方式上看起來和類的一般數據成員沒有什么區別,但是作用在其上的操作,實際上是對用來初始化它的那么對象進行的。#include iostream.hclass Dateint da, mo, yr;public:Date(int d,int m,int y) da = d; mo = m; yr = y; void Display() const cout << da << '/' << mo << '/' << yr; ;c
37、lass Timeint hr, min, sec;public:Time(int h, int m, int s) hr = h; min = m; sec = s; void Display() const cout << hr << ':' << min << ':' << sec; ; class DateTimeconst Date& dt;const Time& tm;public:DateTime(const Date& d, const Time& t)
38、: dt(d), tm(t)/emptyvoid Display() const dt.Display(); cout << ' 'tm.Display();int main()Date today(7,4,2004);Time now(15,20,0);DateTime dtm(today, now);dtm.Display();return 0; 我們來看看這個程序中DateTime的構造函數的格式:冒號操作符引出了一個參數初始化表。必須使用這種格式來初始化引用數據成員,而不可以在函數體內來進行初始化工作。如果構造函數像上例一樣不是內聯的,那么最好不要在類聲明中
39、構造函數的原型上使用冒號和初始化值表,而是像下面這樣,把參數初始化表放在定義構造函數的地方:Class DateTimeconst Date& dt;const Time& tm;public:DateTime(const Date& d,const Time& t);DateTime:DateTime(const Date& d,const Time& t):dt(d),tm(t)/empty可以使用構造函數的參數初始化表來初始化任何數據成員。特別是常量數據成員,和引用一樣,只能在參數初始化表里進行初始化,這是因為不可以在構造函數內部為常量數據
40、成員賦值。當一個類含有引用數據成員時,一旦引用被實例化和初始化以后,就無法修改它的值,所以該類不可能徹底地重載賦值運算符函數。三、構造函數的參數初始化表如果類對象的某些數據成員沒有載構造函數內部被初始化,那么必須使用構造函數的參數初始化表對他們進行初始化。否則,編譯器不止到該如何初始化這些還等著在構造函數內部賦值的成員。我們習慣用參數初始化表來初始化所有數據成員。class Dateint mo,da,yr;public:Date(int m=0,int d=0,int y=0);class Employeeint empno;Date datehired;public:Employee(in
41、t en,Date& dh);可以用下面兩種方法編寫Employee類的構造函數:Employee:Employee(int en,Date& dt)empno=en;datehired=dh;或者;Employee:Employee(int en,Date& dt):empno(en),datehired(dh)/empty雖然這兩種方法效果是一樣的,但是根據Date對象默認構造函數的復雜性的不同,這兩種形式的效率差別是很大的。四、對const修飾符的簡單說明如果一個對象被聲明為常量,那么該對象就不可以調用類當中任何非常量型的成員函數(除了被編譯器隱式調用的構造函數和
42、析構函數)。看下面的代碼;#include iostream.hclass Dateint month,day,year;public:Date(int m,d,y):month(m),day(d),year(y) void display()cout<<MOTH<<' ?<<year<<endl;int main()const Date dt(4,7,2004);dt.display(); /errorreturn 0;這個程序盡管編譯時沒有問題,但運行時卻出錯了。這是因為常量對象不能調用非常量函數。編譯器只看函數的聲明,而不在乎函數的
43、具體實現。實際上函數的實現可以在程序中的任何地方,也可以是在另一個源代碼文件中,這就超過了編譯器的當前可見范圍。/date.hclass Dateint month,day,year;public:Date(int m,d,y);void display();/date.cpp#include iostream.h#include date.hDate:Date(int m,d,y):month(m),day(d),year(y) void Date:display()cout<<MONTH<<' ?<<year<<endl;/progr
44、am.cpp#include iostream.h#include date.cppint main()const Date dt(4,7,2004);dt.display();return 0;解決出錯的問題有兩個方法:第一是聲明display()函數為常量型的/in date.hvoid display() const/int date.cppvoid Date:display() constcout<<MONTH<<' ?<<year<<endl;另一個解決方式就是省略掉Date對象聲明里的const修飾符。Date dt(4,7,
45、2004);還有另一個容易出錯的地方:void abc(const Date& dt)dt.display(); /error 提示display沒有const修飾符函數abc()聲明了一個Date對象的常量引用,這說明該函數不會修改傳遞進來的參數的值。如果Date:display()函數不是常量型的,那么在函數abc()里就不能調用它,因為編譯器會認為Date:display()函數有可能會修改常量的值。不論類對象是否是常量型的,它必須修改某個數據成員的值時,ANSI委員會設立了mutable關鍵字。五、可變的數據成員假設需要統計某個對象出現的次數,不管它是否是常量。那么類當中就應該
46、有一個用來計數的整型數據成員。只要用mutable修飾符來聲明該數據成員,一個常量型的成員函數就可以修改它的值。#include iostream.hclass AValueint val; mutable int rptct;public:AValue(int v) : val(v), rptct(0) AValue() cout<<<rptct<< reported was <<val<<> void report() const;void AValue:report() constrptct+;cout << val
47、 << endl;int main()const AValue aval(123);aval.report();aval.report();aval.report();return 0;編程高手之路- C+入門類對象數組和靜態成員一、類對象數組類的對象和C+其他數據類型一樣,也可以為其建立數組,數組的表示方法和結構一樣。#include iostream.hclass Dateint mo,da,yr;public:Date(int m=0,int d=0, int y=0) mo=m; da=d; yr=y;void display() const cout<<MO&
48、lt;<' ;int main()Date dates2;Date today(12,31,2003);dates0=today;dates0.display();dates1.display();return 0;1.類對象數組和默認構造函數在前面已經說過,不帶參數或者所有參數都有默認值的構造函數叫做默認構造函數。如果類中沒有構造函數,編譯器會自動提供一個什么都不做的公共默認構造函數 。如果類當中至少有一個構造函數,編譯器就不會提供默認構造函數。如果類當中不含默認構造函數,則無法實例化其對象數組。因為實例花類對象數組的格式不允許用初始化值來匹配某個構造函數的參數表。上面的程序中
49、,main()函數聲明了一個長度為2的Date對象數組,還有一個包含初始化值的單個Date對象。接著把這個初始化的Date對象賦值給數組中第一個對象,然后顯示兩個數組元素中包含的日期。從輸出中可以看到,第一個日期是有效日期,而第二個顯示的都是0。當聲明了某個類的對象數組時,編譯器會為每個元素都調用默認構造函數。下面的程序去掉了構造函數的默認參數值,并且增加了一個默認構造函數。#include class Dateint mo, da, yr;public:Date();Date(int m,int d,int y) mo=m; da=d; yr=y;void display() const c
50、out <<MO<<' ;Date:Date()cout <<<endl;mo=0; da=0; yr=0;int main()Date dates2;Date today(12,31,2003);dates0=today;dates0.display();dates1.display();return 0;運行程序,輸出為:Date constructor runningDate constructor running12/31/20030/0/0從輸出中可以看出,Date()這個默認構造函數被調用了兩次。2.類對象數組和析構函數當類對象離開
51、作用域時,編譯器會為每個對象數組元素調用析構函數。#include iostream.hclass Dateint mo,da,yr;public:Date(int m=0,int d=0,int y=0) mo=m; da=d; yr=y;Date() cout<<<endl;void display() const cout<<MO<<' ;int main()Date dates2;Date today(12,31,2003);dates0=today;dates0.display();dates1.display();return 0;
52、運行程序,輸出為:12/31/20030/0/0Date destructor runningDate destructor runningDate destructor running表明析構函數被調用了三次,也就是dates0,dates1,today這三個對象離開作用域時調用的。二、靜態成員可以把類的成員聲明為靜態的。靜態成員只能存在唯一的實例。所有的成員函數都可以訪問這個靜態成員。即使沒有聲明類的任何實例,靜態成員也已經是存在的。不過類當中聲明靜態成員時并不能自動定義這個變量,必須在類定義之外來定義該成員。1.靜態數據成員靜態數據成員相當于一個全局變量,類的所有實例都可以使用它。成員函
53、數能訪問并且修改這個值。如果這個靜態成員是公有的,那么類的作用域之內的所有代碼(不論是在類的內部還是外部)都可以訪問這個成員。下面的程序通過靜態數據成員來記錄鏈表首項和末項的地址。#include iostream.h#include string.hclass ListEntrypublic:static ListEntry* firstentry;private:static ListEntry* lastentry;char* listvalue;ListEntry* nextentry;public:ListEntry(char*);ListEntry() delete listval
54、ue;ListEntry* NextEntry() const return nextentry; ;void display() const cout<<LISTVALUE<ListEntry* ListEntry:firstentry;ListEntry* ListEntry:lastentry;ListEntry:ListEntry(char* s)if(firstentry=0) firstentry=this;if(lastentry!=0) lastentry->nextentry=this;lastentry=this;listvalue=new char
55、strlen(s)+1;strcpy(listvalue,s);nextentry=0;int main()while (1)cout<<nEnter a name ('end' when done): ;char name25;cin>>name;if(strncmp(name,end,3)=0) break;new ListEntry(name);ListEntry* next = ListEntry:firstentry;while (next != 0)next->display();ListEntry* hold = next;next=next->Nex
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海市松江區2025屆高三高考模擬卷(二)數學試題含解析
- 江蘇省淮安市車橋中學2025屆高三月考試題含解析
- 江蘇省南京市高淳區2025年初三2月份自測化學試題含解析
- 山東省濟寧嘉祥縣聯考2025屆初三下學期適應性月考卷(三)物理試題含解析
- 江蘇省常熟市第一中學2025屆高三摸底考試數學試題試卷含解析
- 臨沂科技職業學院《工程材料與構造》2023-2024學年第二學期期末試卷
- 喀什職業技術學院《試驗設計方法》2023-2024學年第一學期期末試卷
- 南京理工大學《建筑模型制作與造型設計課程設計》2023-2024學年第二學期期末試卷
- 四川省自貢市2024-2025學年數學五年級第二學期期末統考試題含答案
- 信陽師范大學《專業英語1》2023-2024學年第一學期期末試卷
- 口腔護理學基礎-口腔四手操作技術
- 采油工、注水工知識競賽試題及答案
- 2024年官方獸醫考試題庫
- 歷史中考沖刺之答題技巧選擇題材料題論述題(部編版)
- 《聯合國教科文:學生人工智能能力框架》-中文版
- 女生青春期教育教學設計
- 《韌性:不確定時代的精進法則》筆記
- 主體結構工程施工單選題100道及答案
- 人教版小學美術三年級下冊全冊同步教案 (一)
- 《中國藥物性肝損傷診治指南(2024年版)》解讀
- 2025數學步步高大一輪復習講義人教A版復習講義含答案
評論
0/150
提交評論