實(shí)驗(yàn)15指針的應(yīng)用四_第1頁
實(shí)驗(yàn)15指針的應(yīng)用四_第2頁
實(shí)驗(yàn)15指針的應(yīng)用四_第3頁
實(shí)驗(yàn)15指針的應(yīng)用四_第4頁
已閱讀5頁,還剩90頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C++實(shí)驗(yàn)15?21實(shí)驗(yàn)15指針的應(yīng)用四一、實(shí)驗(yàn)?zāi)康暮鸵?理解動(dòng)態(tài)分配內(nèi)存空間的概念和意義。.掌握new和delete運(yùn)算符的用法。.理解引用型變量的概念和用法。.掌握引用型參數(shù)傳遞的使用方法。二、實(shí)驗(yàn)準(zhǔn)備知識(shí)點(diǎn)1.new和delete(1)new的作用:。(2)要申請(qǐng)一個(gè)整型的內(nèi)存空間,并將首地址賦值給指針p,其語句為 O(3)要申請(qǐng)一個(gè)整型的內(nèi)存空間,空間初始值為3,并將首地址賦值給指針p,其語句為.(4)要申請(qǐng)一維整型數(shù)組空間(數(shù)組長度為m),并將首地址賦值給指針p,其語句為.該空間返回 (元素/行)指針,(能/不能)初始化。(5)要申請(qǐng)二維整型數(shù)組空間(m行n列),并將首地址賦值給指針p,其語句為o該空間返回 (元素/行)指針,(能/不能)初始化。(6)delete的作用:。(7)要釋放指針p所指向的一個(gè)內(nèi)存單元,其語句為。(8)要釋放指針p所指向的一維數(shù)組內(nèi)存單元,其語句為o(9)要釋放指針p所指向的二維數(shù)組(m行n歹I)內(nèi)存單元,其語句為.引用(1)引用是另一個(gè)變量的,定義格式為:〈類型〉〈引用變量名>=〈被引用變量名〉;如:inti=0,&.j=i;(2)在定義引用類型變量時(shí),必須用被引用變量(不能為常量)對(duì)它初始化,引用變量和被引用變量數(shù)據(jù)類型必須。(3)在定義引用類型變量時(shí),編譯系統(tǒng)并不會(huì)為其單獨(dú)分配存儲(chǔ)空間,它與被引用變量 同一個(gè)內(nèi)存空間。(4)定義引用類型變量時(shí),符號(hào)'&'(是/不是)求地址運(yùn)算符。.參數(shù)的傳引用方式引用變量一般作為函數(shù)的參數(shù)或返回值來使用,傳遞主調(diào)函數(shù)與被調(diào)函數(shù)之間的數(shù)據(jù)。(1)引用變量作為函數(shù)的返回值時(shí),該函數(shù)的返回值可以作為左值,即該函數(shù)的調(diào)用可以出現(xiàn)在賦值運(yùn)算符的O(2)函數(shù)的形參如果是引用類型,則該參數(shù)的傳遞方式即為傳引用方式。由于形參是實(shí)參的引用,形參和實(shí)參為同一變量,所以形參發(fā)生變化,實(shí)參會(huì)o課前練習(xí)題.要使語句:p=newint[10];能夠正常執(zhí)行,p應(yīng)定義為。A.intp;B.intp[10];C.int*p;D.int(*p)[10];.下列表示引用的方法中,是正確的。已知:intm=10;A.int&x=m;B.int&y=10;C.int&z;D.float.已知函數(shù)f的原型為:voidf(int&a,char*b);變量s,t的定義是:ints;chart[]="ABCD把S和t分別作為第一和第二個(gè)參數(shù)來調(diào)用函數(shù)f,正確的調(diào)用語句是—A.f(&s,&t);B.f(&s,t);C.f(s,t);D.f(s,&t);4.有如下程序:#include<iostream.h>voidfun(int&x,inty){intt=x;x=y;y=t;}voidmain()(inta[2]={23,42);fun(a[l],a[0]);cout?a[0]<<,,>?a[l]<<endl;)執(zhí)行后的輸出結(jié)果是OA.42,42B.23,23C.23,42D.42,23分析.有以下程序:#include<iostream.h>#include<string.h>voidmain(){int*pl;pl=newint;*pl=2;cout?*pl?,\n;int*p2=newint(4);*p2=6;cout<<*p2?,\n;deletepl;deletep2;int*p3,n=4;p3=newint[n];for(inti=0;i<n;i++)p3[i]=2*i;char*p4;p4=newchar[10];strcpy(p4,“abcdefg");〃行A〃行Bdelete[]p3;delete[]p4;int(*p5)[4];p5=newint[2][4];〃行Cfor(i=0;i<2;i++)for(intj=0;j<4;j++)p5[i][j]=i+j;delete[2]p5;}請(qǐng)回答問題:①行A的功能: 行B的功能:o行C的功能:O②pl和p3是相同類型的簡單指針,但p3可以用來動(dòng)態(tài)分配一維數(shù)組空間,即簡單指針還能用于一維數(shù)組空間的動(dòng)態(tài)分配,這是因?yàn)椋??③分析行C中p5的定義。④分析動(dòng)態(tài)釋放pl、p3、p5的異同。⑤思考:如何動(dòng)態(tài)分配和釋放二級(jí)指針?biāo)赶虻目臻g?如:int**p;p表示一個(gè)m行n列的數(shù)組,m和n均為變量。.有以下程序:#include<iostream.h>voidf(inta,int&b){intt=a;a=b;b=t;}voidmain(void)(intx-10,y=20;cout?x<<<\t'?y<<<\n';f(x,y);〃行Acout?x<<<\t"?y<<<\n';)請(qǐng)問答問題:①函數(shù)f的功能:o②函數(shù)f的形參a的傳遞方式為:,根據(jù)該傳遞方式的特點(diǎn),當(dāng)執(zhí)行完行A后,實(shí)參x的值會(huì)不會(huì)改變??③函數(shù)f的形參b的傳遞方式為:,根據(jù)該傳遞方式的特點(diǎn),當(dāng)執(zhí)行完行A后,實(shí)參y的值會(huì)不會(huì)改變??④行A可不可以寫成f(x,&y);?,為什么?o⑤程序的輸出結(jié)果:,并上機(jī)驗(yàn)證。三、實(shí)驗(yàn)內(nèi)容.編寫一個(gè)函數(shù),使一維數(shù)組(長度為m)元素循環(huán)左移n位,函數(shù)原型為:voidmove(int*p,intm,intn);.要求在主函數(shù)中用new運(yùn)算符產(chǎn)生一個(gè)整型的一維數(shù)組,輸入、move函數(shù)處理并輸出各元素的值?!咎崾尽考僭O(shè)有定義inta[4]={l,2,3,4},*p=a;e仿照實(shí)驗(yàn)14所述數(shù)組元素循環(huán)右移一位的算法,循環(huán)左移一位的代碼如下:intt=*p;for(inti=0:i<3;i++)〃注意i的初值和終值*(p+i)=*(p+i+l);*(p+3)=t;循環(huán)左移n位既將”循環(huán)左移一位”的操作做n遍,所以在上述代碼的基礎(chǔ)上再套用一個(gè)循環(huán)即可。如循環(huán)左移三位的代碼可寫成:for(intj=0;j<3;j++)(intt=*p;for(inti=0;i<3;i++)*(p+i)=*(p+i+l);*(p+3)=t;).編寫一個(gè)函數(shù),刪除某字符串s指定位置n的字符,函數(shù)原型為voiddelch(char*s,intn);o【提示】刪除字符串中某個(gè)字符,實(shí)際上是讓該字符后面的字符串整體左移一位,該字符被覆蓋也就相當(dāng)于被刪除?!白笠埔晃弧钡乃惴愃朴?循環(huán)左移一位”的算法,只是不需要”循環(huán)”的功能,亦即不需預(yù)先保留最左端元素的值,參考代碼如下:for(inti=n;*s!='\0';i++)〃注意i的初值和循環(huán)條件*(s+i)K(s+i+l);.編寫一個(gè)函數(shù),函數(shù)原型為voidinput(char*s口,intn);,在函數(shù)體內(nèi)完成n個(gè)不等長字符串的輸入,根據(jù)這些字符串的實(shí)際長度為指針數(shù)組s中的元素動(dòng)態(tài)分配存儲(chǔ)空間,依次使各元素指向每一個(gè)輸入的字符串。設(shè)計(jì)一個(gè)完成n個(gè)字符串排序的函數(shù)(在排序的過程中,要求只交換指向字符串的指針值,不交換字符串),函數(shù)原型為voidsort(char*s[],intn);。在主函數(shù)中實(shí)現(xiàn)將排序好的字符串輸出?!咎崾尽恳?yàn)橐獮樗性貏?dòng)態(tài)分配存儲(chǔ)空間,所以函數(shù)input體內(nèi)包含一個(gè)循環(huán)。按照題意,可在循環(huán)前定義一個(gè)字符數(shù)組,長度自定,如chart[100];。在循環(huán)體內(nèi)先通過getline輸入一個(gè)字符串,該字符串的實(shí)際長度為strlen(t)+l,接著為s[i]動(dòng)態(tài)分配存儲(chǔ)空間。讓s[i]指向t表示的字符串不可使用語句"s[i]=t;",原因是數(shù)組名t是不變的(盡管t的內(nèi)容可能會(huì)變),則s[i]也不會(huì)變,這樣最終所有元素均指向同一字符串。不要忘記,字符串的賦值通常使用strcpy函數(shù)!如本例可將語句"s[i]=t;"改為“strcpy(s[i],t);"。函數(shù)sort的編寫請(qǐng)參照實(shí)驗(yàn)13相關(guān)內(nèi)容。輸出排好序的字符串后,不要忘記釋放為s[i]動(dòng)態(tài)分配的存儲(chǔ)空間。四、課后練習(xí)題.在C++中函數(shù)的參數(shù)傳遞方式有三種:第一種是值傳遞,第二種是指針傳遞,第三種是傳遞。.設(shè)有語句"intfun(char*,int&);charstr[100];intk;",則對(duì)函數(shù)fun的正確的調(diào)用形式是。A.fun(str,&k)B.fun(str,k)C.fun(str[100],k)D.fun(str[100],&k)3.設(shè)有語句"voidf(inta[10],int&x);inty[10],*py=y,n;”,則對(duì)函數(shù)f的正確調(diào)用語句是。A.f(py[10],n);B.f(py,n);C.f(*py,&n);D.f(py,&n);.下面程序的功能是:從輸入的一行字符串中求出最長英文單詞長度最長單詞數(shù),并輸出長度和個(gè)數(shù),單詞之間只能用一個(gè)或多個(gè)空格隔開。如輸入字符串"Iamastudent"時(shí),最長單詞的長度為7,個(gè)數(shù)為1。而輸入字符串"wordbodybook"y"時(shí),最長單詞的長度為4,個(gè)數(shù)為3,即有三個(gè)單詞均為最長單詞。請(qǐng)根據(jù)題意將下列程序補(bǔ)充完整。#include<iostream.h>int&num)intlenOfLongest(char*s,(int&num)intmaxlen=0,curlen=0;num=0;for(;;){while(*s=='//跳過空格if(*s!='\0'){while(*s!=,'&&*s){curlen++;s++;}if(curlen>maxlen){maxlen=curlen;num=l;}elseif(curlen==maxlen)curlen=O;}voidmain(void)charstr[25];intnumber,len;cout<<"輸入一個(gè)英文句子:";cin.getline(str,256);len=lenOfLongest(str,number);cout?*str=*?str?,\n;cout<<”最長單詞長度:*?len?*\n最長單詞個(gè)數(shù):*?number?endl;}.以下程序輸出的第一行是 —,第:行是 第三行是 O#include<iostream.h>voidfn(int&x)(staticinty=l;x+=y;y+=x;cout?x<<*,,,?y?,\n*;)voidmain()(inty=l;fn(y);fn(y);fn(y);).以下程序輸出的第一行是一 ,第二行是_ 第三行是 0#include<iostream.h>inta=10;intfn(int*a,int&b,intc)staticintd;*a+=d++;b++;c+=::a++;d=*a+b+c;returnd;)voidmain()(inta=5,b=l,c=l;cout?fn(&a,b,c)<<'\n';cout?fn(&a,b,c)<<'\n';cout?::a+a+b+c?,\n;}.以下程序輸出的第一行是,第二行是,第三行是 O#include<iostream.h>intfl(int&x){returnx++;}intf2(int(*f)(int&),intn)intsum=0,count=0;for(inti=0;i<=n;i++)sum+=f(i)+f(i);count++;cout?sum<<*\n';)returncount;}voidmain()(intcount;count=f2(fl,5);cout?count<<'\n';)實(shí)驗(yàn)16指針的應(yīng)用五一、實(shí)驗(yàn)?zāi)康暮鸵?掌握鏈表的定義。.掌握鏈表的基本操作算法。.能利用鏈表解決基本的應(yīng)用問題。二、實(shí)驗(yàn)準(zhǔn)備知識(shí)點(diǎn).鏈表(1)鏈表是指將若干個(gè)結(jié)點(diǎn)按“前一個(gè)結(jié)點(diǎn)通過指針指向下一個(gè)結(jié)點(diǎn)”的原則連接起來。(2)結(jié)點(diǎn)是指同類型的結(jié)構(gòu)體類型數(shù)據(jù)。每一個(gè)結(jié)點(diǎn)應(yīng)包含兩部分?jǐn)?shù)據(jù),一部分是描述某一實(shí)體需要的實(shí)際數(shù)據(jù),一般包括多個(gè)數(shù)據(jù)分量,稱為結(jié)構(gòu)體成員;另一部分是—類型的指針,稱為結(jié)構(gòu)體指針,結(jié)構(gòu)體指針通過符號(hào)來訪問結(jié)構(gòu)體成員。(3)結(jié)構(gòu)體成員是自身結(jié)構(gòu)的變量,是自身結(jié)構(gòu)的指針。(可以/不可以).鏈表的基本操作(1)建立無序鏈表基本思路:鏈?zhǔn)字羔樫xNULL;while(未結(jié)束時(shí))(指針指向新申請(qǐng)的一個(gè)結(jié)點(diǎn)空間往結(jié)點(diǎn)的數(shù)據(jù)區(qū)中填數(shù)據(jù)插入鏈表中(首部或者尾部都可以))尾結(jié)點(diǎn)的next賦NULL返回鏈表的頭指針注意:將結(jié)點(diǎn)插入鏈表中要判斷是否是向空鏈表中插入(2)輸出鏈表上各個(gè)結(jié)點(diǎn)的值基本思路:從鏈表頭指針開始依次往后搜索,輸出值,直到鏈表結(jié)束(3)刪除指定值的結(jié)點(diǎn)基本思路:從鏈表頭指針開始依次往后搜索,找到要?jiǎng)h除的結(jié)點(diǎn),同時(shí)記下該結(jié)點(diǎn)的后一個(gè)結(jié)點(diǎn),然后將斷鏈后重新連接??赡苷也坏剑部赡艿谝粋€(gè)就是要?jiǎng)h除的結(jié)點(diǎn)(4)刪除鏈表基本思路:從鏈表頭指針開始依次釋放結(jié)點(diǎn)空間,直到鏈表結(jié)束。(5)在已排序的鏈表中插入結(jié)點(diǎn)基本思路:從鏈?zhǔn)组_始,比較要插入結(jié)點(diǎn)的數(shù)據(jù)與鏈表中的數(shù)據(jù),確定插入點(diǎn),再斷鏈后重新連接。(6)建立有序鏈表對(duì)于每一個(gè)結(jié)點(diǎn)按上述(5)的方法去處理。.鏈表作參數(shù)鏈表作參數(shù)時(shí),即是指向鏈表首結(jié)點(diǎn)的作參數(shù)。課前練習(xí)題.設(shè)有說明:struct(charname[20],sex;intage;floatscore;}stu,*p=&stu;以下不能正確輸入結(jié)構(gòu)體成員值的是OA.cin?*p.sex;B.cin>>;C.cin?stu.age;D.cin?p->score;.下列程序執(zhí)行后輸出的結(jié)果是?ttinclude<iostream.h>structsintx;inty;}data[2]={10,100,20,200);voidmainO(s*p=data;cout?++(p->x);).設(shè)有以下定義和語句,輸出的結(jié)果是ostructdate{doubledog;long*cat;date*next;}too;cout?sizeof(too);分析.有以下程序:^include<iostream.h>structstudent(charname[10];floatscore;);voidprint_score(testpn)〃傳值{cout?<<"I”<<pn.socre?endl;}voidprint_score(test&pn)〃傳引用{cout??"/1”<<pn.socre<<endl;}voidprint_score(test*pn)//傳地址{cout?pn->name?*|*?pn->socre<<endl;}voidmain(){studenta[2]={{"marry”,88.5},{"jack”,98.5}};intnum=sizeof(a)/sizeof(test);for(inti=0;i<num;i++)(print_score(a[i]);〃行Aprint_score(&a[i]);}}請(qǐng)分析程序回答以下問題:①分析三個(gè)print_score函數(shù)的區(qū)別。②main函數(shù)中的num的功能:。③執(zhí)行行A時(shí)將調(diào)用哪一個(gè)print_score函數(shù)?三個(gè)print_score函數(shù)都能重載嗎?④上機(jī)調(diào)試本程序,驗(yàn)證你在第③步得到的結(jié)論。.設(shè)鏈表上結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)定義如下:structnodeintx;node*next;);設(shè)已建立了一個(gè)鏈表,h為鏈?zhǔn)字羔?。函?shù)DelAdd的功能是:若從鏈表上能找到結(jié)點(diǎn)的x值為value,則從鏈表上刪除該結(jié)點(diǎn)(假定鏈表上各個(gè)結(jié)點(diǎn)的值是不同的);否則構(gòu)造一個(gè)新結(jié)點(diǎn),其x的值為value,并將新結(jié)點(diǎn)插入鏈尾。該函數(shù)要返回新鏈表的首指針。node*DelAdd(node*h,intvalue)(node*pl,*p2;intflag=0;//值為1時(shí),表示已刪除值為value的結(jié)點(diǎn)pl=h;while(pl&&flag==0)(if(pl->x==value)(flag=l;if(pl=h){h=pl->next;deletepl;}〃行Aelse{p2->next=pl->next;deletepl;)〃行B)else{p2=pl;pl=;}〃行C)if(flag==0)(pl=newnode;pl->x=value;pl->next=0;if(h==0)h=pl;//行Eelse;〃行Dreturnh;請(qǐng)結(jié)合題意完成下列要求:①刪除鏈表中的某個(gè)結(jié)點(diǎn)時(shí),該結(jié)點(diǎn)要分成表首結(jié)點(diǎn)和非表首結(jié)點(diǎn)兩種情況。行A刪除的是結(jié)點(diǎn),行B刪除的是結(jié)點(diǎn)。②如果當(dāng)前節(jié)點(diǎn)不是所要找的結(jié)點(diǎn),則應(yīng)繼續(xù)訪問下一結(jié)點(diǎn),行C即是完成該功能,請(qǐng)將該行補(bǔ)充完整。③行D表示將新結(jié)點(diǎn)插入鏈尾,請(qǐng)將該行補(bǔ)充完整。④行E是什么意思?三、實(shí)驗(yàn)內(nèi)容.定義一個(gè)描述“商品信息”的結(jié)構(gòu)體及該結(jié)構(gòu)體變量和指向該變量的指針,通過指針完成結(jié)構(gòu)變量的輸入和輸出。設(shè)結(jié)構(gòu)體包含商品編號(hào)、商品名稱、單價(jià)、供貨日期(一個(gè)子結(jié)構(gòu),包括年、月、日)等內(nèi)容。.建立一條無序鏈表,每一個(gè)結(jié)點(diǎn)包含:學(xué)號(hào)、姓名、年齡和C++成績。要求一個(gè)函數(shù)完成建立鏈表的工作,一個(gè)函數(shù)對(duì)C++成績降序排序,一個(gè)函數(shù)輸出各結(jié)點(diǎn)值,一個(gè)函數(shù)釋放鏈表的動(dòng)態(tài)存儲(chǔ)空間。四、課后練習(xí)題.以下程序使用遞歸函數(shù)實(shí)現(xiàn)單向鏈表操作,完成鏈表的創(chuàng)建和顯示、釋放鏈表的結(jié)點(diǎn)。#include<iostream.h>stuctnode{floatdata;node*next;);voidShowChain(node*head)〃依次輸出每一個(gè)結(jié)點(diǎn)上的數(shù)據(jù){if(head)cout?head->data?endl;if(head-);}}voidAddNode(node*p,node*&head)〃將p所指向的結(jié)點(diǎn)插入鏈尾{elseAddNode(p,head->next);)voidDeleteChain(node*head)〃依次刪除鏈表上的每一個(gè)結(jié)點(diǎn){node*p=head;if(p)(deletep;if(head)DeleteChain(head);})voidmain(void)(node*head=NULL,*temp;temp=newnode;while(2)temp->next=NULL;cout<〈”輸入數(shù)據(jù):";cin>>temp->data;if(temp->data>0)AddNode(temp,head);〃將新點(diǎn)加入鏈表的尾部else(deletetemp;break;ShowChain(head);DeleteChain(head);}.設(shè)鏈表上結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)定義如下:structN0DE{intx;NODE*next;);函數(shù)create。的功能是:創(chuàng)建一個(gè)有序的鏈表(結(jié)點(diǎn)中x的值按升序排離),參數(shù)n為鏈表上要產(chǎn)生的結(jié)點(diǎn)的個(gè)數(shù),函數(shù)返回該有序鏈表的頭指針。算法思想:每產(chǎn)生一個(gè)新的結(jié)點(diǎn),插入到鏈表的恰當(dāng)位置,使得插入新結(jié)點(diǎn)以后的鏈表仍然保持有序。create(intn)NODE*p,*pl,*p2,*h=NULL;inti=0;if(n<l)returnNULL;{p=newNODE;cin>>p->x;p->next=NULL;)h=p;else{pl=p2=h;){pl=p2;p2=p2->next;}in(p2==h){p->next=p2;h=p;}else{p->next=p2;pl->next=p;}}i++}returnh;)3.設(shè)結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)定義如下:structPNODE{intx,y;PNODE*next;函數(shù)padd的功能是:根據(jù)pa、pb指向的兩個(gè)鏈表(按結(jié)點(diǎn)的y值升序排列)生成一個(gè)新鏈表(pc為鏈?zhǔn)字羔?。新生成鏈表仍按y值升序排列。生成新鏈表的規(guī)則是:當(dāng)在pa和pb鏈表中發(fā)現(xiàn)y值相同的結(jié)點(diǎn)時(shí),則在pc鏈表中增加一個(gè)新結(jié)點(diǎn),新結(jié)點(diǎn)的x取值為兩鏈表中對(duì)應(yīng)的兩個(gè)結(jié)點(diǎn)的x值之和,新結(jié)點(diǎn)的y取值為pa或pb鏈表中對(duì)應(yīng)結(jié)點(diǎn)的y值。PNODE*padd(PNODE*pa,PNODE*pb)(PNODE*pcr,*pt,*pc=0;w)(if(pa->y==pb->y)();pt->x=pa->x+pb->x;pt->y=pa->y:pt->next=NULL;if(pc==NULL)pc=pcr=pt;else{per->next=pt;;}pa=pa->next;pb=pb->next;)else)pb=pb->nextp;elsepa=pa->next;}returnpc;}實(shí)驗(yàn)17類和對(duì)象一、實(shí)驗(yàn)?zāi)康暮鸵?理解類的概念。.掌握類的定義和對(duì)象的聲明。.掌握通過類編寫簡單程序的方法及與傳統(tǒng)編程方法的區(qū)別。二、實(shí)驗(yàn)準(zhǔn)備知識(shí)點(diǎn).類和對(duì)象的基本概念及區(qū)別(1)類是一種數(shù)據(jù)類型,由 和組成,描述了屬于該類型的所有對(duì)象的性質(zhì)。(2)類定義最后的不可省略。(3)類中的任何數(shù)據(jù)成員均不能使用關(guān)鍵字、以及等(除外)來限定其存儲(chǔ)類型。(4)因?yàn)椴粸轭惙峙?所以不能對(duì)類中的數(shù)據(jù)成員初始化。(5)對(duì)象是具有類數(shù)據(jù)類型的變量,是類產(chǎn)生的o在創(chuàng)建對(duì)象時(shí),編譯系統(tǒng)只為對(duì)象中的分配存儲(chǔ)空間,而同類對(duì)象的的代碼卻是共享的。(6)類中的成員具有—作用域,它們只能供類中的訪問,外部環(huán)境不能直接訪問類的成員。在類外可以通過訪問類的成員。.成員的三種訪問權(quán)限(1)類的成員有三種訪問權(quán)限: 、 、 其中具有—訪問權(quán)限的成員可以被任意函數(shù)由問,11仃 訕問權(quán)限的成員只能被該類的成員函數(shù)訪問,而具有訪問權(quán)限的成員只能被該類的成員函數(shù)以及該類的派生類中的成員函數(shù)訪問。(2)通過對(duì)象訪問成員須使用成員運(yùn)算符—?對(duì)象只能訪問,對(duì)象只能通過間接地訪問其私有成員或保護(hù)成員。.成員函數(shù)的定義成員函數(shù)可以在類中給出定義,也可在類外給出定義,但此時(shí)必須要在類的定義中寫出該函數(shù)的原型聲明語句。在類中定義,默認(rèn)為 函數(shù)。在類外定義,缺省為非 函數(shù),要想聲明為內(nèi)聯(lián)函數(shù)則需在定義前加。.this指針的概念及使用方法(1)每一個(gè)對(duì)象都有一個(gè)隱藏的this指針,該指針指向,即表示當(dāng)前對(duì)象。(2)this指針是常量指針,只允許在 內(nèi)使用該指針。5.類和結(jié)構(gòu)體的異同(1)結(jié)構(gòu)體中定義函數(shù),限制其成員的訪問權(quán)限。(可以/不可以)(2)類的默認(rèn)訪問權(quán)限為,結(jié)構(gòu)體的默認(rèn)訪問權(quán)限為.(公有/私有)課前練習(xí)題.類中定義的成員,其隱含訪問權(quán)限為。A.publicB.privateC.protectedD.static2.結(jié)構(gòu)中定義的成員,其隱含訪問權(quán)限為OA.publicB.protectedC.privateD.static.關(guān)于成員函數(shù)的定義和使用,下面的說明是錯(cuò)誤的。A.成員函數(shù)可以定義在類外B.成員函數(shù)內(nèi)可以訪問類的所有數(shù)據(jù)成員C.必須通過對(duì)象調(diào)用成員函數(shù)D.只有成員函數(shù)能訪問類的數(shù)據(jù)成員.下列說法中不正確的是oA.對(duì)象是類的一個(gè)實(shí)例B.任何一個(gè)對(duì)象只能屬于一個(gè)類C.一個(gè)類只能有一個(gè)對(duì)象D.類與對(duì)象間的關(guān)系和數(shù)據(jù)類型與變量間的關(guān)系相類似5.下列說法中不正確的是。A.同一個(gè)類的兩個(gè)對(duì)象占用相同的內(nèi)存空間B.要在類的外部直接使用類中的私有成員是錯(cuò)誤的C.一個(gè)對(duì)象數(shù)組中的所有數(shù)組元素屬于同一個(gè)類D.當(dāng)在類的外部定義成員函數(shù)時(shí),必須在函數(shù)名前加上類名和作用域運(yùn)算符“::”分析.定義一個(gè)類student,其數(shù)據(jù)成員包含學(xué)生姓名、年齡及住址,然后錄入一個(gè)班(20人)學(xué)生的信息,并把他們顯示出來。#include<iostream.h>classstudent{charname[8];intage;〃行Acharaddr[40];public:voidSetDataO;voidDisplay();{cout?name?**?age?**?addr?endl;}〃行C);voidstudent::SetDataO〃行B(cout<<”請(qǐng)輸入學(xué)生情況:"<<endl;cout<<"姓名:cin>>name;COUt<<〃年齡:";cin>>age;coutC〈”地址:”;cin?addr;voidmain()studentdemo[20];〃定義20個(gè)student類的對(duì)象for(intj=0;j<20;j++)demo[j].SetDataO;cout?endl;for(j=0;j<20;j++)demo[j].Display();)請(qǐng)回答問題:①數(shù)據(jù)成員name、age>addr的訪問權(quán)限為,在main函數(shù)中是否可以通過demo[j]訪問這些數(shù)據(jù)成員?o②行A中定義成員age時(shí)可不可以直接初始化(如:intage=20;)?,為什么?③成員函數(shù)可以在類體內(nèi)部定義,默認(rèn)為 函數(shù);若在外部定義,卻省為非內(nèi)聯(lián)函數(shù),要想聲明為內(nèi)聯(lián)函數(shù)則需在定義前加inlineo④如行B所示,成員函數(shù)在內(nèi)外定義時(shí),在函數(shù)名前必須加上o⑤行C中如何用this指針表示name成員? O.有以下程序:#include<iostream.h>#include<string.h>#defineMAX100classstring(chars[MAX];public:voidinit(charstr[]){strcpy(s,str);}〃行AintgetLength()(inttemp=0;char*p=s;while(*p){temp++;p++;}//行Breturntemp;)voidremoveChar(intposition){if(position>=0&&position<=getLength()-1)(for(inti=position;i<getLength()-l;i++)〃行Cs[i]=s[i+l];//tfCs[i]-\0";〃行D})voidshow(){cout?s?endl;}};voidmain()stringobj,*p=&obj;p->init("wherethereiisawillthereisaway");obj.show。;cout?obj.getLength()?endl;(*p).removeChar(12);p->show();cout?p->getLength()?endl:〃行E〃行F//行G請(qǐng)回答問題:①回顧一下行A中使用strcpy函數(shù)的原因 o②函數(shù)getLength的功能: 。行B中的循環(huán)條件*p等價(jià)于③函數(shù)removeChar的功能:。行C中的for循環(huán)是“數(shù)組元素整體左移或右移一位”的典型算法,本函數(shù)實(shí)現(xiàn)了左移還是右移一位?o④行D有何意義? o⑤行E語句的另外兩種寫法:和.⑥行F的輸出結(jié)果,行G的輸出結(jié)果。如果沒有行D,貝IJ行F的輸出結(jié)果,行G的輸出結(jié)果三、實(shí)驗(yàn)內(nèi)容1.建立一個(gè)類Prime,用來判斷某整數(shù)是否為素?cái)?shù)。具體要求如下:(1)私有數(shù)據(jù)成員intn:存放某個(gè)整數(shù)。(2)公有成員函數(shù)voidset(int_n):將數(shù)據(jù)成員n的值設(shè)置為參數(shù)」1的值。intIsPrimeO:判斷數(shù)據(jù)成員n是否為素?cái)?shù),是素?cái)?shù)則返回I,否則返回0。voidprint():如果n為素?cái)?shù)(通過成員函數(shù)IsPrime判斷),則輸出"nisaprimenumber.",否則輸出"nisnotaprimenumber.n?(3)在主函數(shù)中對(duì)該類進(jìn)行測(cè)試。定義類Prime的對(duì)象p。調(diào)用對(duì)象p的set成員函數(shù),設(shè)置p的數(shù)據(jù)成員n為7o調(diào)用對(duì)象P的print成員函數(shù),輸出判斷結(jié)果。設(shè)置P的數(shù)據(jù)成員n為9。輸出判斷結(jié)果。本程序正確的輸出結(jié)果為:7isaprimenumber.9isnotaprimenumber..求正數(shù)a的平方根的迭代公式為:xn+l=(xn+a/xn)/2。建立一個(gè)類SQRT,用來求某正數(shù)平方根的近似值。具體要求如下:(1)私有數(shù)據(jù)成員floatn:存放某個(gè)正數(shù)。floatsq:存放正數(shù)n的近似平方根。(2)公有成員函數(shù)voidset(intm):用m初始化n。voidcalcO:用上述迭代公式計(jì)算正數(shù)n的平方根,要求前后兩次求出的根的近似值之差的絕對(duì)值小于10-5?voidprint():輸出n及sq的值。(3)在主函數(shù)中對(duì)該類進(jìn)行測(cè)試。定義實(shí)型變量m和類SQRT的對(duì)象s.給m賦值。調(diào)用對(duì)象s的set成員函數(shù),設(shè)置s的數(shù)據(jù)成員n為m的值。調(diào)用對(duì)象s的calc成員函數(shù),計(jì)算n的近似平方根。調(diào)用對(duì)象s的print成員函數(shù),輸出n及對(duì)應(yīng)的平方根。.建立一個(gè)類ARRAY,求一維數(shù)組中各元素的最大值、最小值和平均值。具體要求如下:(1)私有數(shù)據(jù)成員floatdata[10]:存儲(chǔ)待處理的數(shù)組元素。floatmax:存儲(chǔ)數(shù)組中元素的最大值。floatmin:存儲(chǔ)數(shù)組中元素的最小值。floataverage:存儲(chǔ)數(shù)組中元素的平均值。(2)公有成員函數(shù)init(floata[10]):初始化數(shù)組data。voidprocess():將數(shù)組data中的最大值、最小值和平均值分別存入max、min、average中。voidprint():屏幕輸出數(shù)組中各元素(每行輸出5各元素)及其最大值、最小值和平均值。(3)在主函數(shù)中定義一個(gè)具有10個(gè)元素的數(shù)組a,其初值為{3.0,4,5,2,1,10,5.5,7.5,8,9)e定義一個(gè)ARRAY類的對(duì)象arr,并用a數(shù)組初始化該對(duì)象。通過arr調(diào)用成員函數(shù),求出并輸出結(jié)果。本程序正確的輸出結(jié)果為:34521105.57.589max=10min=laverage=5.54.設(shè)一個(gè)類的定義如下:classT(private:char*pl,*p2;public:voidinit(char*sl,char*s2);voidprint(){cout?wp]="?pl?*\n*?wp2="?p2<*\n';}voidcopyT(T&t);voidfreeTO;};成員函數(shù)init將si和s2所指向的字符串分別送到pl和p2所指向的動(dòng)態(tài)申請(qǐng)的內(nèi)存空間,函數(shù)copyT將對(duì)象t中的兩個(gè)字符串拷貝到當(dāng)前的對(duì)象中,freeT釋放pl和p2所指向的動(dòng)態(tài)分配的空間。設(shè)計(jì)一個(gè)完整的程序,包括完成這四個(gè)函數(shù)的定義和測(cè)試。四、課后練習(xí)題.C++支持面向?qū)ο蟪绦蛟O(shè)計(jì)的四個(gè)要素是:封裝性、、.下列說法不正確的是.A.在類中,成員的默認(rèn)訪問權(quán)限是私有的B.類封裝了數(shù)據(jù)和操作C.類實(shí)質(zhì)上是一種數(shù)據(jù)類型D.在類的定義中,必須包含private、public,protected三種存取方式對(duì)應(yīng)的部分.下列有關(guān)類和對(duì)象的說明中,正確的是A.類與對(duì)象沒有區(qū)別B.要為類和對(duì)象分配存儲(chǔ)空間C.對(duì)象是類的實(shí)例,為對(duì)象分配存儲(chǔ)空間而不為類分配存儲(chǔ)空間D.類是對(duì)象的實(shí)例,為類分配存儲(chǔ)空間而不為對(duì)象分配存儲(chǔ)空間.下列說明中有關(guān)結(jié)構(gòu)體定義的正確說法是。A.不能指定其成員的權(quán)限B.不能包含成員函數(shù)C.其成員缺省的權(quán)限為公有的D.不能包含對(duì)象成員.以下說法不正確的是.A.程序中可以定義指向某個(gè)類的指針變量B.類中的數(shù)據(jù)成員不能為指針類型C.可以定義指向類中某個(gè)數(shù)據(jù)成員的指針變量D.當(dāng)使用指針變量訪問類的成員時(shí),必須先使指針變量指向該類的某個(gè)對(duì)象.以下說法不正確的是?A.在類中不能對(duì)所定義的數(shù)據(jù)成員進(jìn)行初始化B.類的公有成員函數(shù)是類與外界的接口C.在類的定義體中,決定成員訪問權(quán)限的關(guān)鍵字private、public和protected在類體內(nèi)出現(xiàn)的次序是一定的,且只能出現(xiàn)一次D.類的實(shí)現(xiàn)機(jī)制實(shí)現(xiàn)了數(shù)據(jù)隱藏7.閱讀以下程序。#include<iostream.h>classChar(private:charcl,c2;public:voidconvert(chara){c2=(cl=a)-32;}voiddisp(){cout?cl?,,轉(zhuǎn)換為"<<c2?endl;}};voidmain(){Chara,b;convert(*m');a.disp();convert(,n');b.disp();)執(zhí)行結(jié)果第一行為,第二行為O實(shí)驗(yàn)18構(gòu)造函數(shù)和析構(gòu)函數(shù)一、實(shí)驗(yàn)?zāi)康暮鸵?理解構(gòu)造函數(shù)和析構(gòu)函數(shù)的作用。.能熟練編寫構(gòu)造函數(shù)和析構(gòu)函數(shù),進(jìn)一步鍛煉針對(duì)類的編程能力。二、實(shí)驗(yàn)準(zhǔn)備知識(shí)點(diǎn).構(gòu)造函數(shù)和析構(gòu)函數(shù)的定義、使用方法及異同(1)構(gòu)造函數(shù)是用來 的一種特殊的成員函數(shù),在 被創(chuàng)建時(shí)自動(dòng)執(zhí)行,當(dāng)對(duì)象撤銷時(shí)自動(dòng)執(zhí)行的成員函數(shù)稱之為—(2)構(gòu)造函數(shù)返回值,指定為void類型, 重載,帶參數(shù)。析構(gòu)函數(shù)返回值,指定為void類型, 重載,帶參數(shù)。.類型轉(zhuǎn)換構(gòu)造函數(shù)(1)類型轉(zhuǎn)換構(gòu)造函數(shù)分為兩種: 和 o(2)假設(shè)類A存在只帶一個(gè)整型參數(shù)的構(gòu)造函數(shù),則定義"Aa=10;”等價(jià)于 O.拷貝構(gòu)造函數(shù)(1)拷貝構(gòu)造函數(shù)分為兩種:和。(2)拷貝構(gòu)造函數(shù)的參數(shù)通常是?對(duì)象類型構(gòu)造函數(shù)調(diào)用析構(gòu)函數(shù)調(diào)用全局對(duì)象程序運(yùn)行程序結(jié)束局部對(duì)象對(duì)象定義處離開程”,塊靜態(tài)局部對(duì)象對(duì)象定義處程序結(jié)束臨時(shí)對(duì)象參與運(yùn)算時(shí)參。運(yùn)算后New動(dòng)態(tài)創(chuàng)建的對(duì)象創(chuàng)建財(cái)象處Delete顯式撤消表18-1構(gòu)造函數(shù)、析構(gòu)函數(shù)調(diào)用時(shí)間一覽表.動(dòng)態(tài)分配和釋放對(duì)象的存儲(chǔ)空間new和delete總成對(duì)出現(xiàn),動(dòng)態(tài)分配存儲(chǔ)空間時(shí)會(huì)調(diào)用函數(shù),收回存儲(chǔ)空間時(shí)會(huì)調(diào)用函數(shù)。new出現(xiàn)在類體(一般是構(gòu)造函數(shù))內(nèi),則delete也應(yīng)出現(xiàn)在類體(-一般是析構(gòu)函數(shù))內(nèi)。new出現(xiàn)在類體外,則delete也應(yīng)出現(xiàn)在類體外。(4)撤銷對(duì)象時(shí),系統(tǒng)只自動(dòng)收回非動(dòng)態(tài)分配的存儲(chǔ)空間,而不自動(dòng)收回動(dòng)態(tài)申請(qǐng)的空間。.對(duì)象成員的初始化及應(yīng)用,稱之為對(duì)象成員。(2)類中對(duì)象數(shù)據(jù)成員的初始化工作必須在 完成。(3)對(duì)象成員初始化的順序取決于o(4)創(chuàng)建具有對(duì)象成員的類的對(duì)象時(shí),構(gòu)造函數(shù)的調(diào)用先后順序:課前練習(xí)題.在定義一個(gè)類時(shí),缺省的構(gòu)造函數(shù)是唯一的。當(dāng)自定義的構(gòu)造函數(shù)的每一個(gè)參數(shù)均有缺省值或時(shí),這種構(gòu)造函數(shù)是確省的構(gòu)造函數(shù)。.下面哪一個(gè)不是構(gòu)造函數(shù)的特征。A.構(gòu)造函數(shù)的函數(shù)名與類名相同B.構(gòu)造函數(shù)不能重載C.構(gòu)造函數(shù)可以設(shè)置缺省參數(shù)D.構(gòu)造函數(shù)沒有類型.類的析構(gòu)函數(shù)的作用是。A.一般成員函數(shù)B.類的初始化C.對(duì)象的初始化D.刪除對(duì)象.對(duì)于一個(gè)C++的類,。A.只能有一個(gè)構(gòu)造函數(shù)和一個(gè)析構(gòu)函數(shù).可有一個(gè)構(gòu)造函數(shù)和多個(gè)析構(gòu)函數(shù)C.可有多個(gè)構(gòu)造函數(shù)和一個(gè)析構(gòu)函數(shù)D.可有多個(gè)構(gòu)造函數(shù)和多個(gè)析構(gòu)函數(shù).假定AB為一個(gè)類,則該類的拷貝構(gòu)造函數(shù)的聲明語句為。A.AB&(ABx);B.AB(ABx);C.AB(AB*x);D.AB(AB&);.若AB為某個(gè)類的類名,執(zhí)行語句“ABa[5];“后,系統(tǒng)自動(dòng)調(diào)用該類的構(gòu)造函數(shù)的次數(shù)為.分析.有以下程序:#include<iostream.h>classTest(private:intx,y;public:Test0{x=O;y=O;}Test(intx,inty)this->x=x;this->y=y;)voidprint(){cout?*x=*?x?//,y=*?y?endl;}};voidmain()(Testtl;〃行ATestt2(50,100);〃行BTest= 1,&t2};t2=Test(100,200);〃行Cfor(inti=0;i<=l;i++)p[i]->print();}請(qǐng)回答問題:①行A定義了?個(gè)類Test的對(duì)象,它將調(diào)用哪個(gè)構(gòu)造函數(shù)?②行A能否寫成Testtl();?o如果不可以,Testtl();代表什么含義? O③行B定義了另一個(gè)類Test的對(duì)象,它將調(diào)用哪個(gè)構(gòu)造函數(shù)?。④解釋第二個(gè)構(gòu)造函數(shù)的函數(shù)體中用到this指針的原因: O⑤行c中的Test可否去掉?。解釋行B的含義: O.有以下程序:ttinclude<iostream.h>ttinclude<string.h>classString(char*s;public:String(char*p=0){if(p)(s=newchar[strlen(p)+l];strcpy(s,p);)elses=0;}String(String&p)(if(p.s)(s=newchar[strlen(p.s)+1];strcpy(s,p.s);elses=0;"String(){if(s)delete[]s;}voidShow(){cout?"s="<<s?'\n';}};voidmain(void){〃行A〃行BStringsi("張三”);Strings2(sl);〃行CShow();ShowO;)請(qǐng)回答問題:①行A中動(dòng)態(tài)申請(qǐng)的數(shù)組大小為何還要加1?。②String類中是否還存在默認(rèn)的構(gòu)造函數(shù)StringO;?o③行B開始的構(gòu)造函數(shù)稱之為構(gòu)造函數(shù)。解釋其功能。④執(zhí)行行C時(shí)會(huì)調(diào)用哪個(gè)構(gòu)造函數(shù)?O如果將行B開始的構(gòu)造函數(shù)刪掉,執(zhí)行行C時(shí)會(huì)有什么問題?⑤如果在main函數(shù)加一條語句:s2=sl;,運(yùn)行本程序又會(huì)出現(xiàn)什么問題?⑥上機(jī)驗(yàn)證輸出結(jié)果。三、實(shí)驗(yàn)內(nèi)容.建立一個(gè)類PrimeNUM,求指定數(shù)據(jù)范圍內(nèi)的所有素?cái)?shù)(質(zhì)數(shù))。具體要求如下:(1)私有數(shù)據(jù)成員intdata[25]:依次存放在指定范圍內(nèi)求出的所有素?cái)?shù)。intlow,high:存放指定的數(shù)據(jù)范圍的下限和上限。intnum:存放low與high之間的素?cái)?shù)個(gè)數(shù)。(2)公有成員函數(shù)PrimeNUM(int_low,int_high):構(gòu)造函數(shù),用參數(shù)」ow和_high初始化low和high,同時(shí)初始化isprime(intx):判斷x是否為素?cái)?shù)。若是素?cái)?shù),返回1;否則,返回0。voidprocess():求指定范圍內(nèi)的所有素?cái)?shù),把它們依次存放在數(shù)組data中,并將求出的素?cái)?shù)個(gè)數(shù)賦給num。voidprint():輸出求出的素?cái)?shù)個(gè)數(shù)及所有素?cái)?shù),每行輸出5個(gè)素?cái)?shù)。(3)在主函數(shù)中對(duì)該類進(jìn)行測(cè)試。定義一個(gè)PrimeNUM類的對(duì)象test,指定查找范圍為100?150,即求100至150之間的所有素?cái)?shù)。通過test調(diào)用成員函數(shù)完成求素?cái)?shù)及輸出素?cái)?shù)的工作。本題正確的輸出結(jié)果應(yīng)為:num=10101103107109113127131137139149.建立一個(gè)類SUM,求二維數(shù)組外圍各元素的和,并且輸出數(shù)組各元素及所求之和。具體要求如下:(1)私有數(shù)據(jù)成員inta[4][4]:二維數(shù)組,存放要處理的數(shù)據(jù)。ints:存放數(shù)組a外圍各元素的和。(2)公有成員函數(shù)SUM(intb[4][4]):構(gòu)造函數(shù),用數(shù)組b初始化數(shù)組a。voidprocess():求二維數(shù)組外圍各元素的和s。voidprint():按行列方式輸出數(shù)組a的各元素值,并輸出外圍各元素的和。(3)在主函數(shù)中完成對(duì)該類的測(cè)試。使用如下測(cè)試數(shù)據(jù)(外圍元素是指陰影部分的元素):12345678910111213141516.建立一個(gè)矩陣類Matrix,存儲(chǔ)一個(gè)4*4的矩陣并能在矩陣中查找某數(shù)。要求如下:(1)私有數(shù)據(jù)成員intp[4][4]:存儲(chǔ)一個(gè)4*4的矩陣的值。intn:矩陣的行數(shù)。intx:存儲(chǔ)根據(jù)查找要求在矩陣中要查找到的某數(shù)。introw,col:存儲(chǔ)該數(shù)所在的行、列值。(2)公有成員函數(shù)構(gòu)造函數(shù):初始化n的值為4,x、row,col為0。voidinput(inta[][4]):將一個(gè)矩陣賦給該對(duì)象中的數(shù)組。voidfind():在該對(duì)象存儲(chǔ)的矩陣中查找值最小的數(shù),保存該數(shù)及該數(shù)所在的行、列值到x、row、col中。voidprint():按行輸出矩陣的值。(3)在主函數(shù)中測(cè)試該類,使用以下測(cè)試數(shù)據(jù),輸出矩陣的值,查找值最小的數(shù)并輸出x、row、col的值。5678 13141516 1234 9101112.設(shè)定義一個(gè)類:classListArray(private:intsize;//整型數(shù)組的大小,表示可放元素的個(gè)數(shù)intelem;//整型數(shù)組當(dāng)前的元素個(gè)數(shù),初始應(yīng)為0,當(dāng)elem等于size時(shí),數(shù)組滿int*p;〃指向整型數(shù)組,動(dòng)態(tài)分配內(nèi)存空間public:ListArray(ints=100);〃用s初始化整型數(shù)組的大小voidput(intn);//將n加入整型數(shù)組,elem自增1voidprint。;〃輸出整型數(shù)組所有元素^ListArray(););請(qǐng)完成該類成員函數(shù)的定義和測(cè)試程序的設(shè)計(jì)。【提示】編寫voidput(intn)函數(shù)時(shí),注意考慮數(shù)組滿的情況。如果數(shù)組已滿,則沒有空間存儲(chǔ)n,此時(shí)需動(dòng)態(tài)申請(qǐng)新的內(nèi)存空間,其大小應(yīng)比原數(shù)組大小大1,并將原數(shù)組元素備份到新數(shù)組,新數(shù)組的最后一個(gè)元素存放n,當(dāng)然不要忘記釋放為原數(shù)組動(dòng)態(tài)分配的內(nèi)存空間。四、課后練習(xí)題.下列說明有關(guān)構(gòu)造函數(shù)的正確說法是A.任一類必定有構(gòu)造函數(shù)B.可定義沒有構(gòu)造函數(shù)的類C.構(gòu)造函數(shù)不能重載D.任一類必定有缺省的構(gòu)造函數(shù).一個(gè)類的析構(gòu)函數(shù)。A.是唯一的B.允許重載C.至多可有兩個(gè)D.只能是缺省的.下列有關(guān)類的構(gòu)造函數(shù)和析構(gòu)函數(shù)的說法中,不正確的是A.類的析構(gòu)函數(shù)可以重載B.類的構(gòu)造函數(shù)可以重載C.定義一個(gè)類時(shí)可以不顯式的定義構(gòu)造函數(shù)D.定義一個(gè)類時(shí)可以不顯式的定義析構(gòu)函數(shù).以下有關(guān)對(duì)象的敘述中,不正確的是。A.產(chǎn)生對(duì)象時(shí)必定要調(diào)用構(gòu)造函數(shù)B.撤消對(duì)象時(shí)必定要調(diào)用析構(gòu)函數(shù)C.對(duì)象被保護(hù),其私有成員不能任意訪問D.對(duì)象可以沒有構(gòu)造函數(shù)或析構(gòu)函數(shù).設(shè)P是指向一個(gè)類動(dòng)態(tài)對(duì)象的指針變量,則執(zhí)行語句"deleteP;”時(shí),將自動(dòng)調(diào)用該類的..已定義類A,該類構(gòu)造函數(shù)的參數(shù)都沒有缺省值。執(zhí)行語句:”Aal,a2(l,2),a3[3][3],*pl-&al,*p2[3]={&a2,&a2,&a2},(*p3)[3]=a3,*p4=newA⑶;”后,系統(tǒng)自動(dòng)調(diào)用該類的缺省(無參)構(gòu)造函數(shù)的次數(shù)為o.以下程序?qū)Ψ从硨W(xué)生情況的數(shù)組a進(jìn)行排序,按其數(shù)組元素的成員id(學(xué)號(hào))從小到大排序。請(qǐng)完善填空。[程序]#include<isotream.h>classElem{〃描述一名學(xué)生的成績和學(xué)號(hào)intscore;〃成績intid;〃學(xué)號(hào)public:Elem(ints=0,inti=0)(score=s;id=i;}intKeyO〃獲取學(xué)號(hào){returnid;}intGetScore()〃獲取成績r(jià)eturnscore;voidSelect(Elema[],intn)for(inti=0;i<nT;i++){intmin=a[i].Key();intp=i,j;Elemtemp;for(j=i+l;j<n;j++)if(a[j].Key(Xmin){;)if(p!=i){;a[i]=a[p];a[p]=temp;}}}voidmain(void)(ints[]={56,78,65,90,88,76,72,80);intid[]={8,1,2,6,7,4,3,5};Elema[8];for(inti=0;i<8;i++)Select(a,8);for(intj=0;j<8;j++)cout?a[j],GetScore()?*\t*?a[j].Key()?'\n';.以下程序的輸出結(jié)果為。#include<iostream.h>#include<math.h>classPoint(private:floatx,y;public:Point(floatxl,floatyl){x=xl;y=yl;}floatgetx(){returnx;}floatgety(){returny;}};classLine(private:Pointpl,p2;floatlength;public:Line(floatxl,floatyl,floatx2,floaty2):pl(xl,yl),p2(x2,y2){}voidcalcLength()length=sqrt(pow(pl.getx()-p2.getx(),2)+pow(pl.gety()-p2.gety(),2));}voiddispLengthO{cout?length?endl;});voidmain()(Lineline(0,0,3,4);line.calcLength();line.dispLength();}實(shí)驗(yàn)19類的繼承一、實(shí)驗(yàn)?zāi)康暮鸵?學(xué)習(xí)使用繼承方式派生新類的方法。.進(jìn)一步加深對(duì)訪問權(quán)限的理解。.掌握繼承中二義性問題的解決辦法。.進(jìn)一步鍛煉針對(duì)類的編程能力。二、實(shí)驗(yàn)準(zhǔn)備知識(shí)點(diǎn).繼承權(quán)限(1)繼承權(quán)限有三種:派生、派生、派生。(2)公有派生中,在派生類中是基類中的public成員在派生類中是—成員。—成員,protected成員(3)私有派生中,在派生類中是一基類中的public成員在派生類中是——成員。—成員,protected成員(4)保護(hù)派生中,在派生類中是 基類中的public成員在派生類中是_成員。成員,protected成員(5)class定義的默認(rèn)繼承權(quán)限為,struct定義的默認(rèn)繼承權(quán)限為(6)無論哪一種繼承權(quán)限,其基類的成員均不能為派生類所繼承。.繼承種類有兩種繼承: (一個(gè)基類)和 (多個(gè)基類)。.初始化基類成員的方法(1)使用派生類前需要先對(duì)基類初始化,初始化基類成員通常通過實(shí)現(xiàn)。(2)如果初始化列表中沒有調(diào)用基類構(gòu)造函數(shù)的初始化項(xiàng),則自動(dòng)調(diào)用基類的一 進(jìn)行初始化o(3)多重繼承中基類構(gòu)造函數(shù)的調(diào)用順序只與的順序有關(guān)。(4)一個(gè)類的構(gòu)造函數(shù)只能對(duì)它的的構(gòu)造函數(shù)傳遞實(shí)參。.沖突的解決辦法在多重繼承中,如果不同的基類具有名字相同的公有成員或保護(hù)成員,此時(shí)若在派生類對(duì)象的成員名前加上 通過— —連接,即可解決沖突。.支配規(guī)則(就近原則)如果派生類的新增成員和繼承成員同名,則通過派生類對(duì)象訪問該同名成員時(shí),所訪問的是成員,而不是成員。.賦值兼容性規(guī)則派生類對(duì)象可以賦值給基類對(duì)象。(2)基類對(duì)象賦值給派生類對(duì)象。(可以/不可以)(3)公有派生類對(duì)象的地址 賦值給基類的指針變量。(可以/不可以)(4)公有派生類對(duì)象初始化基類的引用。(可以/不可以).虛基類(1)將一個(gè)類聲明為虛基類,須使用關(guān)鍵字。(2)不管虛基類被繼承多少次,派生類均只保留 份該虛基類成員的拷貝,這樣可以避免在派生類中訪問這些成員時(shí)產(chǎn)生二義性。(3)虛基類的所有派生類(不管是直接的還是間接的)的構(gòu)造函數(shù)均要帶上虛基類的構(gòu)造函數(shù),但并不表示所有類都會(huì)調(diào)用虛基類的構(gòu)造函數(shù),只有正在的類才會(huì)構(gòu)造虛基類,該類的上層均忽略對(duì)虛基類的構(gòu)造,從而保證虛基類的數(shù)據(jù)成員只被初始化一次。課前練習(xí)題.如果類A繼承類B,則類A稱之為,類B稱之為。.以下程序輸出結(jié)果的第一行是。#include<iostream.h>classX(public:voidf(){cout〈<"aa\n”;});classY:publicX(public:voidf(){cout?*bb\n*;});voidmain(void)(Yy,*xy=&y;X*xp=&y;xy->f();xp->f();)3.設(shè)類B是基類A的派生類,并有語句"Aal,*pa=&al;Bbl,*pb=&bl;",則正確的語句是。A.pb=pa;B.bl=al;C.al=bl;D.*pb=*pa;4.在多重派生中,要使一個(gè)基類在派生類中只有一個(gè)拷貝,則必須將這個(gè)基類說明為。分析.有以下程序:#include<iostream.h>classx(protected:inti,j;public:x(){i=0;j=0;}x(inti,intj){x::i=i;x::j=j;}voidprint(){cout<<"i=j="<<j<<endl;}};classy:publicx(intk;public:y(){k=0;}y(inti,intj):x(i,j){k=i*j;}voidprint(){cout〈<"i="<<i<<"j="<<="<<k<<endl;}};classz:publicy{〃行A〃行B〃初始化列表public:z(inti,intj):y(i,j){}〃行Cvoidprintl(){cout<<*i=*?i?*j=*?j<<endl;}voidprint(){y::print():});voidmainO{yyl(23,45);yl.print();//行Dyl.x::print();〃行Ezzl(10,20);zl.print();zl.printl();zl.y::print();zl.x::print();yl=zl;//行Fyl.print();〃行G)請(qǐng)回答問題:①行A中的x::i=i可否寫成i=i?,該表達(dá)式如果不用類名x而使用this指針,則可表示為:。②類y派生于類x。行B為類y的構(gòu)造函數(shù),但沒有列出基類x的構(gòu)造函數(shù),這條語句能正常運(yùn)行的前提是:o③類z派生于類y。行C為何沒有列舉出類x的構(gòu)造函數(shù)?o④根據(jù) —規(guī)則,行D調(diào)用的是類—的print函數(shù),然俞出外果為: o⑤按照沖突的解決辦法,行E調(diào)用的是類的print函數(shù),其輸出結(jié)果為:。⑥實(shí)際上類z存在 個(gè)print函數(shù),在main函數(shù)中通過zl如何訪問其它繼承下來的print函數(shù)?⑦行F使用的是規(guī)則。⑧行G調(diào)用的是類的print函數(shù),輸出結(jié)果為: ⑨上機(jī)驗(yàn)證輸出結(jié)果。.有以下程序:#include<iostream.h>classA(private:intx;public:voidsetx(inta){x=a;}voidgetx(){cout?x;});classB:virtualpublicA{};〃行AclassC:virtualpublicA(};classD:publicB,publicC{};voidmain()(Dm;m.B::setx(l);m.A::getx();m.B::getx();m.C::getx();〃行Bcout?,\nf;m.C::setx(2);m.A::getx();m.B::getx0;m.C::getx();cout?,\n9;m.A::setx(3);m.A::getx():m.B::getx();m.C::getx();cout?,\n';m.setx(4);m.getx();//行C)請(qǐng)回答問題:①行A是類的定義方式。②類D有個(gè)類A的拷貝。③行B的輸出結(jié)果為:。④行C會(huì)不會(huì)產(chǎn)生沖突?為什么?O⑤上機(jī)驗(yàn)證輸出結(jié)果。三、實(shí)驗(yàn)內(nèi)容1.建立一個(gè)形狀類Shape作為基類,派生出圓類Circle和矩形類Rectangle,求出面積并獲取相關(guān)信息。具體要求如下:(1)形狀類Shape(a)保護(hù)數(shù)據(jù)成員doublex,y:對(duì)于不同的形狀,x和y表示不同的含義,如對(duì)于圓,x和y均表示圓的半徑,而對(duì)于矩形,x表示矩形的長,y表示矩形的寬。訪問權(quán)限定義為保護(hù)類型是為了能被繼承下去,以便派生類能直接訪問x和y。(b)公有成員函數(shù)構(gòu)造函數(shù)Shape(doublex,double_y):用_x、_y分別初始化x、y.doubleGetAreaO:求面積,在此返回0.0。(2)圓類Circle,從Shape公有派生(a)公有成員函數(shù)Circle(doubler):構(gòu)造函數(shù),并用r構(gòu)造基類的x和y。doubleGetAreaO:求圓的面積。doubleGetRadiusO:獲取圓的半徑。(3)矩形類Rectangle,從Shape公有派生(a)公有成員函數(shù)Rectangle(double1,doublew):構(gòu)造函數(shù),并用1和w構(gòu)造基類的x和y。doubleGetAreaO:求矩形的面積。doubleGetLengthO:獲取矩形的長。doubleGetWidthO:獲取矩形的寬。(4)在主函數(shù)中對(duì)派生類進(jìn)行測(cè)試。注意,在程序的開頭定義符號(hào)常量PI的值為3.14。測(cè)試的輸出結(jié)果如下:circle:r=l,area=3.14rectangle:1ength=3,width=4,area=122.對(duì)一個(gè)5位數(shù)的任意整數(shù),求出其降序數(shù)。例如,整數(shù)是82319,則其降序數(shù)是98321。算法提示:將整數(shù)的各位數(shù)分解到一維整型數(shù)組a中,再將a數(shù)組中的元素按降序排序,最后輸出a數(shù)組元素值。試建立一個(gè)類DescendNUM,用于完成該功能。具體要求如下:(1)私有數(shù)據(jù)成員intn:存放5位數(shù)的整數(shù)。inta[5]:存放其元素的降序排列值。(2)公有成員函數(shù)DescendNUM(intx=0):構(gòu)造函數(shù),用參數(shù)x初始化n。voiddecompose():將n的各位數(shù)分解到a數(shù)組。voiddsortO:將a數(shù)組排成降序。voidshow():顯示元素及其降序數(shù)。(3)在主函數(shù)中輸入一個(gè)5位數(shù)的任意整數(shù),然后定義一個(gè)DescendNUM類對(duì)象num,用上述輸入的數(shù)初始化num,然后完成對(duì)該類的測(cè)試。.編程將一個(gè)二維數(shù)組元素變換為逆向存放,即按元素在內(nèi)存中的物理排列位置,第一個(gè)元素變成倒數(shù)第一個(gè)元素,第二個(gè)元素變成倒數(shù)第二個(gè)元素,依此類推。1324 1112109 ,逆向存放后變?yōu)?865。試建87例如,原始二維數(shù)組為56 9101211 4231立一個(gè)類REVARR,完成上述工作。具體要求如下:(1)私有數(shù)據(jù)成員inta[M][N]:初始化時(shí)存放原始二維數(shù)組,最終存放逆向存放后的二維數(shù)組。(2)公有成員函數(shù)REVARR(intx[M][N]):構(gòu)造函數(shù),用形參x初始化數(shù)據(jù)成員a。voidreverseO:按題目要求處理二維數(shù)組。voidprint():按二維數(shù)組方式輸出a數(shù)組值。(3)在主函數(shù)中完成對(duì)該類的測(cè)試。在程序的開頭,定義符號(hào)常數(shù)M和N的值分別為3和4,表示數(shù)組的行數(shù)和列數(shù)。在主函數(shù)中定義數(shù)組intdata[M][N],其初值如上。定義一個(gè)REVARR類的對(duì)象arr,并用數(shù)組data初始化該對(duì)象的成員a,輸出原數(shù)組值,然后調(diào)用成員函數(shù)逆序存放二維數(shù)組,最后輸出逆序后的二維數(shù)組。.定義一個(gè)字符串類DelSameStr,從左到右對(duì)字符串中每個(gè)字符刪除其后所有相同的字符,只留下第一次出現(xiàn)的那一個(gè)。例如,若字符串為"cocoon",刪除重復(fù)出現(xiàn)的字符后,其結(jié)果是字符串“con”。具體要求如下:(1)私有數(shù)據(jù)成員。char*sl:指向原字符串。char*s2:指向結(jié)果字符串。(2)公有成員函數(shù)。DelSameStr(char*s):構(gòu)造函數(shù),動(dòng)態(tài)分配si和s2指向的空間,并用s初始化si<>voiddelsame():刪除重復(fù)出現(xiàn)的字符。voidshow():輸出原字符串和結(jié)果字符串。'DelSameStrO:析構(gòu)函數(shù),釋放動(dòng)態(tài)分配的存儲(chǔ)空間。(3)在主函數(shù)中定義一個(gè)DelSameStr類的對(duì)象test,用字符串"cocoon”初始化test,通過test調(diào)用成員函數(shù)完成刪除工作,輸出刪除前后的兩個(gè)字符串。四、課后練習(xí)題.C++語言提供的機(jī)制允許一個(gè)派生類繼承多個(gè)基類,即使這些基類是相互無關(guān)的。.下列說法正確的是。A.如果派生類包含對(duì)象成員,則編譯器調(diào)用構(gòu)造函數(shù)的順序?yàn)椋簩?duì)象成員、基類、派生類。B.一個(gè)類的構(gòu)造函數(shù)可以對(duì)它的間接基類的構(gòu)造函數(shù)傳遞實(shí)參。C.多重繼承中基類構(gòu)造函數(shù)的調(diào)用順序與初始化成員列表中構(gòu)造函數(shù)順序完全相同。D.派生類的初始化成員列表可以為空。.程序輸出的第一行是,第二行是#include<iostream.h>classBa(inty;public:intx;Ba(intb){x=b;y=x+x;}intGety(void){returny;}};classA:publicBapublic:A(intc):Ba(c){}intGetx(void){returnx;}};classB:publicBa(public:B(intd):Ba(d){}intGetx(){returnx;}};classC:publicB,publicA(public:C(inte):A(e+30),B(e+100){}};voidmain(void)(Cc(100);cout?c.A::Gety()<〈'\t'<<c.B::Gety()<〈'\n;cout?c.A::Getx()?'\tf<<c.B::Getx()<<'\n;).以下程序輸出的第一行是。#include<iostream.h>classApublic:intx;A(){x=100;}A(inti){x=i;}voidShow(){cout<<"x="<<x?'\t'<<"AA\n";}};classB(public:inty;B(){y=300;}B(inti){y=i;}voidShow。{cout<<"y="<<y<<'\t'<<"BB\n";}};classC:publicA,publicB(public:inty;C(inta,intb,intc):A(a),B(b){y=c;}voidShowO{cout?*y=<?y?*\t*?*CC\n*;}};voidmain(void)Ccl(400,500,600);cl.y=200;cl.Show();cl.A::Show();cl.B*IShow();)5.以下程序輸出的第一行是,第三行是,第四行是。#include<iostream.h>#include<string.h>classBase{charstr[20];public:Base(char*s="default")(strcpy(str,s);cout?str?,\n;}};classhl:publicvirtualBase(charstrl[20];public:hl(char*sl,char*s2):Base(si)strcpy(strl,s2);cout<<strl?,\n;});classh2:virtualpublicBase(charstr2[20];public:h2(char*sl,char*s2):Base(si){strcpy(str2,s2);cout<<str2?,\n*;}};classh3:publichl,publich2(charstr3[20];public:h3(char*sl,char*s2,char*s3,char*s4):hl(si,s2),h2(si,s3)(strcpy(str3,s4);cout<<str3?,\n;)};voidmain()h3a("Base",〃hl",〃h2〃,”h3〃);實(shí)驗(yàn)20友元函數(shù)、靜態(tài)成員和虛函數(shù)一、實(shí)驗(yàn)?zāi)康暮鸵?理解友元函數(shù)的特性,掌握友元函數(shù)的定義方法。.理解虛函數(shù)的特性。.掌握利用虛函數(shù)實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性的解題方法。.掌握靜態(tài)數(shù)據(jù)成員的特性。.進(jìn)一步鍛煉針對(duì)類的編程能力。二、實(shí)驗(yàn)準(zhǔn)備知識(shí)點(diǎn).友元函數(shù)與友元類C++中的突破了類的封裝性,給予其它的類或非成員函數(shù)訪問類的私有、保護(hù)成員。(2)友元必須在類中先用關(guān)鍵字聲明。(3)友元函數(shù)類的成員函數(shù)。(是/不是)(4)在類外定義友元函數(shù)時(shí),函數(shù)名前加關(guān)鍵字friend,加類名及域運(yùn)算符”::”。(需要/不需要)(5)要想類B的所有成員函數(shù)均能訪問類A的所有成員,則應(yīng)將類B聲明為類A的 O.靜態(tài)成員(1)同類的不同對(duì)象成員函數(shù)代碼空間,一般數(shù)據(jù)成員分配的空間,但 靜態(tài)成員分配的空間。(共享/不共享)(2)靜態(tài)數(shù)據(jù)成員在類中用關(guān)鍵字聲明,(能/不能)通過構(gòu)造函數(shù)進(jìn)行初始化。(3)公有靜態(tài)成員可以直接通過訪問。(4)靜態(tài)成員函數(shù)訪問類中的非靜態(tài)成員。(能/不能)(5)靜態(tài)成員函數(shù)隱含的this指針。(含有/不含有).多態(tài)性的分類及區(qū)別(1)多態(tài)性就是當(dāng)不同對(duì)象接受到相同消息時(shí)能產(chǎn)生不同動(dòng)作,它常用或.來實(shí)現(xiàn)。(2)多態(tài)性分為兩種: (編譯時(shí)多態(tài))和 (運(yùn)行時(shí)多態(tài))。.虛函數(shù)(1)聲明虛函數(shù)的方法是在基類中的成員函數(shù)原型前加上關(guān)鍵字,并在派生類中重新實(shí)現(xiàn)該成員函數(shù)。(2)虛函數(shù)必須存在于類的繼承環(huán)境下,它的使用方法是:通過或訪問虛函數(shù),該虛函數(shù)屬于哪個(gè)類,就訪問哪個(gè)類。(3)同一組虛函數(shù)要求完全相同,如果不同,這組函數(shù)將轉(zhuǎn)換為普通的 關(guān)系。.純虛函數(shù)和抽象類(1)是一個(gè)在基類中說明的虛函數(shù),但無函數(shù)實(shí)現(xiàn)部分,要求在派生類中實(shí)現(xiàn)。(2)純虛函數(shù)的聲明方法是將 置于虛函數(shù)的函數(shù)原型末尾。(3)包含純虛函數(shù)的類稱之為o(4)抽象類只能用作其它類的,不能建立抽象類的,但可以聲明抽象類的或,通過它們可以調(diào)用抽象類中的非純虛函數(shù)。課前練習(xí)題.若需要將函數(shù)"voidf();”聲明為類A的友元函數(shù),則應(yīng)在類A的定義中加入一條語句:。.下面有關(guān)一個(gè)類的友元函數(shù)的敘述中,正確的是A.允許在類外訪問類中除私有成員以外的任何成員B.允許在類外訪問類中的任何成員C.友元函數(shù)也是該類的成員D.友元函數(shù)的定義必須放在該類的公有部分.虛函數(shù)。A.可實(shí)現(xiàn)靜態(tài)多態(tài)性B.可實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性C.不能實(shí)現(xiàn)多態(tài)性D.既可實(shí)現(xiàn)靜態(tài)多態(tài)性,又可實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性.函數(shù)重載屬于兩種多態(tài)性中的哪一種:。.以下程序輸出的第一行是,第二行是,第三行是。#include<iostrem.h>classT{public:staticintx;};intT::x=l;voidmain(void){Ta,b;a,x=10;b.x=20;cout?//a.x=”<<a.x<<'\n'<<"b.x="<<b.x?>\n<<,ZT::x="<〈T:::x?J\n;}.以下程序輸出結(jié)果的第一行是。#include<iostream.h>classX{public:virtualvoidf(){cout<<"aa\n”;}};classY:publicX{public:voidf(){cout<〈"bb\n”;}};voidmain(void){Yy,*xy=&y;X*xp=&y;xy->f();xp->f();}分析.有以下程序:#include<iostream.h>classA(inta,b;staticint

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論