C++習(xí)題七課后答案.doc_第1頁
C++習(xí)題七課后答案.doc_第2頁
C++習(xí)題七課后答案.doc_第3頁
C++習(xí)題七課后答案.doc_第4頁
C++習(xí)題七課后答案.doc_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

習(xí)題7解答注:如有錯誤,請諒解!1、 填空題(1) 私有成員(2) 構(gòu)造函數(shù)(3) private(4) 公有成員函數(shù)的集合(5) 公有成員(6) 友元(7) 類的靜態(tài)成員(8) this(9) new(10) 非const 成員函數(shù)(11) 構(gòu)造(12) const char * const(13) AB(AB& X)(14) (15) 生存期結(jié)束 程序運(yùn)行結(jié)束時(16) 析構(gòu)函數(shù)2、 選擇題 (1)A (2)B (3) C(4) B(5) B(6) B(7) B(8) A(9) A(10) B(11)C(12) B(13) C(14) D(15) A(16) D(17) D(18) A(19) B(20)D(21) B(22) B(23) C(24) D(25)A(26) B(27) A(28) B(29) C(30)D(31) B(32)B (33)D3、簡答題 (1)類和數(shù)據(jù)類型有何關(guān)聯(lián)? 答:類相當(dāng)于一種包含函數(shù)的自定義數(shù)據(jù)類型,它不占內(nèi)存空間,是一個抽象的“虛”體,使用已定義的類建立對象就像用數(shù)據(jù)類型定義變量一樣。對象建立后,對象占據(jù)內(nèi)存,變成了一個“實(shí)”體。類與對象的關(guān)系就像數(shù)據(jù)類型與變量的關(guān)系一樣。其實(shí),一個變量就是一個簡單的不含成員函數(shù)的數(shù)據(jù)對象。 (2)類和對象的內(nèi)存分配關(guān)系如何? 答:為節(jié)省內(nèi)存,編譯器在創(chuàng)建對象時,只為各對象分配用于保存各對象數(shù)據(jù)成員初始化的值,并不為各對象的成員函數(shù)分配單獨(dú)的內(nèi)存空間,而是共享類的成員函數(shù)定義,即類中成員函數(shù)的定義為該類的所有對象所共享,這是C+編譯器創(chuàng)建對象的一種方法,在實(shí)際應(yīng)用中,我們?nèi)砸獙ο罄斫鉃橛蓴?shù)據(jù)成員和函數(shù)成員兩部分組成。 (3)什么是淺拷貝?什么是深拷貝?二者有何異同? 答:構(gòu)造函數(shù)用于建立對象時給對象賦初值以初始化新建立的對象。如果有一個現(xiàn)存的對象,在建立新對象時希望利用現(xiàn)存對象作為新對象的初值,即用一個已存在的對象去初始化一個新建立的對象。C+提供的拷貝構(gòu)造函數(shù)用于在建立新對象時將已存在對象的數(shù)據(jù)成員值復(fù)制給新對象,以初始化新對象。拷貝構(gòu)造函數(shù)在用類的一個對象去初始化該類的另一個對象時調(diào)用,一下3種情況相當(dāng)于用一個已存在的對象去初始化新建立的對象,因此,調(diào)用拷貝構(gòu)造函數(shù): 當(dāng)用類的一個對象去初始化該類的另一個對象時。 如果函數(shù)的形參是類的對象,調(diào)用函數(shù)時,將對象作為函數(shù)實(shí)參傳遞給函數(shù)的形參時。 如果函數(shù)的返回值是類的對象,函數(shù)執(zhí)行完成,將返回值返回時。原因在于默認(rèn)的拷貝構(gòu)造函數(shù)實(shí)現(xiàn)的只是淺拷貝,即直接將原對象的數(shù)據(jù)成員值依次復(fù)制給新對象中對應(yīng)的數(shù)據(jù)成員,并沒有為新對象另外分配內(nèi)存資源。這樣,如果對象的數(shù)據(jù)成員是指針,兩個指針對象實(shí)際上指向的是同一個內(nèi)存空間。當(dāng)類的數(shù)據(jù)成員中有指針類型時,我們就必須定義一個特定的拷貝構(gòu)造函數(shù),該拷貝構(gòu)造函數(shù)不僅可以實(shí)現(xiàn)原對象和新對象之間數(shù)據(jù)成員的復(fù)制,而且可以為新的對象分配單獨(dú)的內(nèi)存資源,這就是深拷貝構(gòu)造函數(shù)。(4)什么是this 指針?它的作用是什么? 答:一個類的成員函數(shù)中,有時希望引用調(diào)用它的對象,對此,C+ 采用隱含的this 指針來實(shí)現(xiàn)。this 指針是一個系統(tǒng)預(yù)定義的特殊指針,指向當(dāng)前對象,表示當(dāng)前對象的地址。系統(tǒng)利用this 指針明確指出成員函數(shù)當(dāng)前操作的數(shù)據(jù)成員所屬的對象。實(shí)際上,當(dāng)一個對象調(diào)用其成員函數(shù)時,編譯器先將該對象的地址賦給this 指針,然后調(diào)用成員函數(shù),這樣成員函數(shù)對對象的數(shù)據(jù)成員進(jìn)行操作時,就隱含使用了this 指針。一般而言,通常不直接使用this 指針來引用對象成員,但在某些少數(shù)情況下,可以使用this 指針,如重載某些運(yùn)算符以實(shí)現(xiàn)對象的連續(xù)賦值等。this 指針不是調(diào)用對象的名稱,而是指向調(diào)用對象的指針的名稱。this 的值不能改變,它總是指向當(dāng)前調(diào)用對象。(5)C+中靜態(tài)成員有何作用?它有何特點(diǎn)? 答:C+提供了靜態(tài)成員,用以解決同一個類的不同對象之間數(shù)據(jù)成員和函數(shù)的共享問題。 靜態(tài)成員的特點(diǎn)是:不管這個類創(chuàng)建了多少個對象,其靜態(tài)成員在內(nèi)存中只保留一份副本,這個副本為該類的所有對象所共享。 面向?qū)ο蠓椒ㄖ羞€有類屬性(class attribute)的概念,類屬性是描述類的所有對象的共同特征的一個數(shù)據(jù)項(xiàng),對于任何對象實(shí)例,它的屬性值是相同的,C+通過靜態(tài)數(shù)據(jù)成員變量來實(shí)現(xiàn)類屬性。(6)友元關(guān)系有何性質(zhì)? 答: 友元關(guān)系是不能傳遞的,不能被繼承。如B類是A類的友元,C類是B類的友元,C類和A類之間,如果沒有聲明,就沒有任何友元關(guān)系,不能進(jìn)行數(shù)據(jù)共享。 友元關(guān)系是單向的,不具有交換性,如果聲明B類是A類的友元,B類的成員函數(shù)就可以訪問A類的私有和保護(hù)數(shù)據(jù),但A類的成員函數(shù)卻不能訪問B類的私有和保護(hù)數(shù)據(jù)。(7)在C+程序設(shè)計中,友元關(guān)系的優(yōu)點(diǎn)和缺點(diǎn)是什么? 答:友元概念的引入,提高了數(shù)據(jù)的共享性,加強(qiáng)了函數(shù)與函數(shù)之間、類與類之間的相互關(guān)系,大大提高了程序的效率,這是友元的優(yōu)點(diǎn),但友元也破壞了數(shù)據(jù)隱蔽和數(shù)據(jù)封裝,導(dǎo)致程序的可維護(hù)性變差,給程序的重用和擴(kuò)充埋下了深深的隱患,這是友元的缺點(diǎn)。(8)如何實(shí)現(xiàn)不同對象的內(nèi)存空間的分配和釋放? 答:當(dāng)類被實(shí)例化成對象后,不同類別的對象占據(jù)不同類型的內(nèi)存,其規(guī)律與普通變量相同: 類的全局對象占有數(shù)據(jù)段的內(nèi)存。 類的局部對象內(nèi)存分配在棧中。 函數(shù)調(diào)用時為實(shí)參建立的臨時對象內(nèi)存分配在棧中。 使用動態(tài)內(nèi)存分配語句new建立的動態(tài)對象,內(nèi)存在棧中分配。雖然類(對象)是由數(shù)據(jù)成員與成員函數(shù)組成。但是,程序運(yùn)行時,系統(tǒng)只為各對象的數(shù)據(jù)成員分配單獨(dú)的內(nèi)存空間,而該類的所有對象則共享類的成員函數(shù)定義以及為成員函數(shù)分配的空間。對象的內(nèi)存空間分配有下列規(guī)則: 對象的數(shù)據(jù)成員與成員函數(shù)占據(jù)不同的內(nèi)存空間,數(shù)據(jù)成員的內(nèi)存空間與對象的存儲類別相關(guān),成員函數(shù)的內(nèi)存空間在代碼段中。 一個類所有對象的數(shù)據(jù)成員擁有各自的內(nèi)存空間。 一個類所有對象的成員函數(shù)為該類的所有對象共享,在內(nèi)存中,只有一個副本隨著對象的生命周期的結(jié)束,對象所占的空間就會釋放,各類對象內(nèi)存空間釋放時間與方法如下:a. 全局對象數(shù)據(jù)成員占有的內(nèi)存空間在程序結(jié)束時釋放。b. 局部對象與實(shí)參對象數(shù)據(jù)成員的內(nèi)存空間在函數(shù)調(diào)用結(jié)束時釋放。c. 動態(tài)對象數(shù)據(jù)成員的內(nèi)存空間要使用delete語句釋放。d. 對象的成員函數(shù)的內(nèi)存空間在該類的所有對象生命周期結(jié)束時自動釋放。3、 程序填空題在下面的橫線處填上適當(dāng)字句,完成類中成員函數(shù)的定義。答案:(1) new int(aa) delete a(2) int * a; A()delete a;(3) Location & rA1=A1; coutrA1.GetX()rA1.GetY();5、分析程序,寫出運(yùn)行結(jié)果 答案:(1)運(yùn)行結(jié)果: 5 10 3 (2)運(yùn)行結(jié)果: 7 8 1 1 2 2 5 3 4 4 (3)運(yùn)行結(jié)果: Result1 = 200 Result1 = 201Result1 = 125(4)運(yùn)行結(jié)果: 13A23B6、改錯題 (1)答案: int a(0),b(0); /錯誤,數(shù)據(jù)成員的初始化必須通過構(gòu)造函數(shù)實(shí)現(xiàn) 改正: int a ,b; A x(2,3),y(4); /錯誤,對象y的初始化與已定義的構(gòu)造函數(shù)參數(shù)表不匹配,可重載一個構(gòu)造函數(shù)對對象y進(jìn)行初始化改正: A(int cc)=a=cc;或: A x(2,3),y(4,5);或: A(int aa,int bb=0) a=aa;b=bb; (2)答案: int x=20; /錯誤,因?yàn)閤是靜態(tài)數(shù)據(jù)成員,必須通過類名進(jìn)行初始化 改正: int Test:x=20;(3)答案: x=A1.X; y=A1.Y; /錯誤,不能通過對象直接訪問類的私有數(shù)據(jù)成員, 可以改為有數(shù)據(jù)成員或通過定義類的成員函數(shù)來實(shí)現(xiàn) 改正:public: int X,Y;(4)答案:void ConstFun(); /錯誤,構(gòu)造函數(shù)不能有返回值 改正:ConstFun();7、編程題 (1)定義一個三角形類Ctriangle,求三角形面積和周長。 程序如下:# include # include using namespace std;class Ctriangle /定義三角形類Ctrianglepublic:Ctriangle(double x,double y,double z) a=x; b=y; c=z;double GetPerimeter() /求三角形周長 return a + b + c;double GetArea() /求三角形面積 double p=GetPerimeter()/2; return sqrt(p * (p-a)*(p-b)*(p-c);void display() cout”Ctriangle:”a=”a”b=”b”c=”cendl; cout”Perimeter:”GetPerimeter()endl; cout”Area:”GetArea()endl;private: double a; double b; double c;int main()Ctriangle T(3,4,5);T.display();return 0; 運(yùn)行結(jié)果: Ctriangle: a=3 b=4 c=5Perimeter: 12Area: 6(2)定義一點(diǎn)類Point,并定義成員函數(shù)double Distance(const& point)求兩點(diǎn)的距離程序如下:# include # include using namespace std;class Point /定義類Pointpublic: Point(double xx,double yy) x=xx; y=yy;double Getx() return x;double Gety() return y;double Distance(const Point &p) /求兩點(diǎn)之間的距離 x-=p.x; y-=p.y; return sqrt(x*x+y*y);private: double x; double y;int main()Point A(1,2),B(3,4);coutA.Distance(B)endl;return 0;運(yùn)行結(jié)果: 2.82843(3)定義一個日期類Date,它能表示年、月、日。設(shè)計一個NewDay()成員函數(shù),增加一天日期。程序如下:# includeusing namespace std;class Datepublic:Date(int y=1996,int m=1,int d=1);int days(int year,int month);void NewDay();void display() coutyear”-”month”-”day12|m1) cout”Invalid month!”days(y,m) cout”Invalid day!”endl; d=1;day=d;year=y;month=m;int Date:days(int year,int month) bool leap; if(year%400=0)|(year%4=0&year%100!=0)) leap=true; else leap=false; switch(month) case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: if(leap) return 29; else return 28; break;void Date:NewDay()if(daydays(year,month) day+;else day=1; month+; if(month=13) year+; month=1;int main() Date D1(2009,2,28); D1.display(); D1.NewDay(); cout”after a day:”; D1.display();Date D2(2009,12,31)D2.display();D2.NewDay();cout”after a day:”;D2.display();return 0;運(yùn)行結(jié)果:2009-2-28after a day: 2009-3-12009-12-31after a day: 2010-1-1(4) 定義一時鐘類Clock,設(shè)計成員函數(shù)SetAlarm(int hour,int minute,intsecond)設(shè)置響鈴時間;用run()成員函數(shù)模擬時鐘運(yùn)行,當(dāng)運(yùn)行到響鈴時間時提示響鈴。程序如下:# include using namespace std;class Clockpublic:Clock(int h,int m,int s) hour=(h23?0:h) minute=(m59?0:m) second=(s59?0:s)void SetAlarm(int h,int m,int s) Ahour=(h23?0:h) Aminute=(m59?0:h) Asecond=(s59?0:s)void ShowTime() cout”Now:”hour”:”minute”:”second59) second=0; minute=minute+1;if(minute59) minute=0; hour=hour+1;if(hour24) hour=0;if(hour=Ahour & minute = Aminute &second=Asecond) cout”Plink!plink!plink!.”endl;private:int hour;int minute;int second;int Ahour;int Aminute;int Asecond;int main() Clock D1(7,59,57);D1.ShowTime();D1.SetAlarm(8,0,0);for(int i=0;i3600*24*3+100;i+) D1.run();D1.ShowTime();return 0;運(yùn)行結(jié)果:Now: 7:59:57Plink!plink!plink!.Plink!plink!plink!.Plink!plink!plink!.Now: 5:1:37(5)設(shè)計一個學(xué)生類,包含學(xué)生學(xué)號、姓名、課程、成績等基本信息,計算學(xué)生的平均成績。程序如下:# include# includeusing namespace std;class Student public:Student(char ID,char name,double g1,double g2,double g3) num+; strcpy(this - ID,ID); strcpy(this - name,name); grade1 =g1; grade2 =g2; grade3 =g3; sum1 =sum1 +g1; sum2 =sum2 +g2; sum3 =sum3 +g3;void display() coutID”t”name”t”grade1”t”grade2”t”grade3 endl;double average1() return sum1/num;double average2() return sum2/num;double average3() return sum3/num;private: char ID10; char name12; double grade1; double grade2; double grade3; static double sum1; static double sum2; static double sum3; static int num;int Student:num=0;double Student:sum1=0;double Student:sum2=0;double Student:sum3=0;int main() Student stu1(“200906264”,”Li Weiwei”,88,75,91); stu1.display(); Student stu2(“200902164”,”Chen Hanfu”,86,78,93); stu2.display(); Student stu3(“200908079”,”Zhan Gaolin”,94,69,97); stu3.display(); cout”The average grade of course1:”stu1.average1()endl; cout”The average grade of course2:”stu2.average2()endl; cout”The average grade of course3:”stu3.average3()endl; return 0;運(yùn)行結(jié)果:200906264 Li Weiwei 88 75 91200902164 Chen Hanfu 86 78 93200908079 Zhan Gaolin 94 69 97(6)有一信息管理系統(tǒng),要求檢查每一個登錄系統(tǒng)的用戶(User)的用戶名和口令,系統(tǒng)檢查合格以后方可登錄系統(tǒng),用C+程序予以描述程序如下:# include# includeusing namespace std;const int N=20;class Userpublic:User(char *name,char *pass) strcpy(usernamenum,name); strcpy(passwordnum,pass); for(int i=0;passwordnumi!=”0”;i+) passwordnumi+=i; num+;Adduser(char *name, char *pass) strcpy(usernamenum,name); strcpy(passwordnum,pass); for(int i=0;passwordnumi!=”0”;i+) passwordnumi+=i; num+;int login(char *name,char *pass)for(int i=0;inum;i+) if(strcpy(usernamei,name)=0) for(int j=0;passj!=”0”;j+) if(passwordij!=passj+j) return -1; return i;return -1private:char usernameN10;char passwordN10;static int num;int User:num=0;int main()char name10,pass10;User u1(“LiWei”,”Liwei99”);u1.Adduser(“ChenHanfu”,”20090208”);u1.Adduser(“ZhanGaolin”,”199146”);coutname;coutpass;if(u1.login(name,pass)=0) cout”Success login!”endl;else cout”login fail!”endl;return 0;運(yùn)行結(jié)果:Input username: ZhanGaolinInput password: 199146Success login!(7)定義一個字符串類String,增加下列成員函數(shù):(a)bool IsSubstring(const char *str);判斷str是否為當(dāng)前串的字串;(b)bool IsSubstring(const String &Str);判斷str是否為當(dāng)前串的字串;(c)int str2num();把數(shù)字串轉(zhuǎn)換成數(shù);(d)void toUppercase();把字符串轉(zhuǎn)換成大寫字母。程序如下:# includeusing namespace std;class Stringprivate:char *mystr;int len;public:String() len=0; mystr=NULL;String(const char *p)len=strlen(p);mystr=new charlen+1;strcpy(mystr,p);String(String &r)len=r.len;if(len!=0) mystr=new charlen+1; strcpy(mystr,r.mystr); String()if(mystr!=NULL) deletemystr; mystr=NULL; len=0;char *GetStr()const(return mystr;)void ShowStr()const(coutmystr;)bool IsSubstring(const char *str);bool IsSubstring(const String &str);int str2num();void toUppercase();bool String:IsSubstring(const char *str)int i ,j;for(i=0;ilen;i+) int k=i;for(j=0;strj;j+,k+) if(strj!=mystrk) break; if(!strj) return true;return false;bool String:IsSubstring(const String &str) char *pstr =str.mystr; int plen =str.len; int i ,j; for(i=0;ilen;i+) int k=I; for(j=0;j=”0”&mystri=”a”&mystri=”z”) mystri=mystri-“a”+”A”;int main() String s(“abcdefaaaghijklmnopqrst”); String s1(s); cout”s1=”s1.GetStr()endl; char substr130; cout”Please input a test string:”substr1; coutsubstr1”is”s1.GetStr()”substring?”; cout(s1.IsSubstring(substr1)?”YES”:”NO”)endl; String substr2(“CDEF”); coutsubstr2.GetStr()”is”s1.GetStr()”substring?”; cout(s1.IsSubstring(substr2)?”YES”:”NO”)endl; s1.toUppercase();coutsubstr2.GetStr()”is”s1.GetStr()”subtring?”;cout(s1.IsSubtring(substr2)?”YES”:”NO”)endl;String s2(“123456”);cout”Transform a string to a number:”endl; s2.ShowStr(); int d=s2.str2num(); cout”The Number is”dendl; return 0;運(yùn)行結(jié)果:s1= abcdefaaaghijklmnopqrstPlease input a test string:rstrst is abcdefaaaghijklmnopqrst substring? YESCDEF is abcdefaaaghijklmnopqrst substring? NOCDEF is abcdefaaaghijklmnopqrst substring? YESTransform a string to a number:123456 The Number is 123456(8)定義一個元素類型為int/元素個數(shù)不受限制的集合類Set。除了定義一些必要的函數(shù)外,還定義具有下列功能的成員函數(shù):程序如下:# includeusing namespace std;class Setprivate:int n;int *pS;public:Set()n=0;pS=NULL;Set(Set &s) n=s.n; if(n!=0) pS =new intn+1; for(int i=1;i=n;i+) pSi =s.pSi; Set() if(pS) delete pS; pS =NULL; n=0; void ShowElement()const cout”; for(int i=1;in;i+) coutpSi”,”; coutpSn”endl;bool IsEmpt() return n? false:true;int size() return n;bool IsElement(int e)const;bool IsSubset(const Set &s)const;bool IsEqual(const Set &s)const;Set & insert(int e);Set Union(const Set &s)const;Set intersection(const Set &s)const;Set difference(const Set &s)const;bool Set:IsElement(int e)const for(int i=1;in) return false; for(int i=1;i=s.n;i+) if(!IsElement(s.pSi) return false; return true;bool Set:IsEqual(const Set &s)const if(n!=s.n) return false; if(IsSubset(s) return true; return false;Set &Set:insert(int e) if(IsElement(e) return *this; Set tempe; for(int i=1;i=n;i+) tempe.insert(pSi); n+; if(pS!=NULL) deletepS; pS =new intn+1; for(i=1;in;i+) pSi=tempe.pSi; pSn=e; return *this;Set Set

溫馨提示

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

最新文檔

評論

0/150

提交評論