![第3章-類與對象(二)_第1頁](http://file4.renrendoc.com/view/79e709c96e646abb1f5a1cc515794e47/79e709c96e646abb1f5a1cc515794e471.gif)
![第3章-類與對象(二)_第2頁](http://file4.renrendoc.com/view/79e709c96e646abb1f5a1cc515794e47/79e709c96e646abb1f5a1cc515794e472.gif)
![第3章-類與對象(二)_第3頁](http://file4.renrendoc.com/view/79e709c96e646abb1f5a1cc515794e47/79e709c96e646abb1f5a1cc515794e473.gif)
![第3章-類與對象(二)_第4頁](http://file4.renrendoc.com/view/79e709c96e646abb1f5a1cc515794e47/79e709c96e646abb1f5a1cc515794e474.gif)
![第3章-類與對象(二)_第5頁](http://file4.renrendoc.com/view/79e709c96e646abb1f5a1cc515794e47/79e709c96e646abb1f5a1cc515794e475.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章類和對象2/3/20231面向對象程序設計技術本章主要介紹:類和對象的基本概念構造函數(shù)與析構函數(shù)對象數(shù)組、對象指針及引用
string類向函數(shù)傳遞對象對象的賦值和復制靜態(tài)成員友元類的組合常量對象及常量成員3.3對象數(shù)組與對象指針3.3.1對象數(shù)組1、定義每一數(shù)組元素都是對象的數(shù)組聲明:類名數(shù)組名[元素個數(shù)];訪問方法:通過下標訪問數(shù)組名[下標].成員名2、對象數(shù)組初始化數(shù)組中每一個元素對象被創(chuàng)建時,系統(tǒng)都會調用類構造函數(shù)初始化該對象。對類對象數(shù)組中的元素初始化,必須通過該類的構造函數(shù)來進行。通過初始化列表賦值。例:
PointA[2]={Point(1,2),Point(3,4)};若在定義對象數(shù)組時,不想立即對數(shù)組中對象賦初值,其構造函數(shù)中必須含有一個不帶參數(shù)的或是缺省參數(shù)的構造函數(shù)。3.3對象數(shù)組與對象指針不聲明構造函數(shù),則采用缺省構造函數(shù)。(注意:全局或靜態(tài)對象的數(shù)據(jù)成員的值為0,局部(動態(tài))對象的數(shù)據(jù)成員的值為隨機的。)各元素對象的初值要求為相同的值時,可以聲明具有默認形參值的構造函數(shù)。各元素對象的初值要求為不同的值時,需要聲明帶形參的構造函數(shù)。當數(shù)組中每一個對象被刪除時,系統(tǒng)都要調用一次析構函數(shù)。3.3對象數(shù)組與對象指針例3.3.1對象數(shù)組應用舉例//Point.hclass
Point{public:
Point();Point(intxx,intyy);~Point();voidMove(intx,inty);intGetX(){returnX;}intGetY(){returnY;}private:intX,Y;};3.3對象數(shù)組與對象指針#include<iostream.h>#include"Point.h"Point::Point(){X=Y=0;cout<<"DefaultConstructorcalled."<<endl;}Point::Point(intxx,intyy){X=xx;Y=yy;cout<<"Constructorcalled."<<endl;}Point::~Point(){cout<<"Destructorcalled."<<endl;}voidPoint::Move(intx,inty){X=x;Y=y;}7#include<iostream.h>#include"Point.h"intmain(){cout<<"Enteringmain..."<<endl;
Point
A[2];for(inti=0;i<2;i++)
A[i].Move(i+10,i+20);cout<<"Exitingmain..."<<endl;
return0;}8運行結果:Enteringmain...DefaultConstructorcalled.DefaultConstructorcalled.Exitingmain...Destructorcalled.Destructorcalled.9例3.3.2對象數(shù)組應用舉例classPoint{public:Point(intxx,intyy){X=xx;Y=yy;}……private:intX,Y;};main(){Pointpoint1(3,4);……Pointpoint2[20];……}正確否?出錯!因為沒有無參構造函數(shù)3.3對象數(shù)組與對象指針classPoint{public:Point(){x=y=0;}Point(intxx,intyy){X=xx;Y=yy;}……private:intX,Y;};main(){Pointpoint1(3,4);……Pointpoint2[20];……}正確否?正確!3.3對象數(shù)組與對象指針例3.3.2對象數(shù)組應用舉例3.3.2對象指針1.用指針訪問單個對象成員聲明對象指針的一般語法格式
類名*對象指針名;當用指向對象的指針來訪問對象成員時,要用“->”操作符。例3.3.3對象指針的使用。3.3對象數(shù)組與對象指針 #include<iostream.h> classexe{intx; public: voidset_a(inta){x=a;} voidshow_a(){cout<<x<<endl;}}; voidmain() {exeob,*p;//聲明類exe的對象ob和類exe的對象指針p ob.set_a(2); ob.show_a();//利用對象名訪問對象的成員
p=&ob;//將對象ob的地址賦給對象指針p
p->show_a();//利用對象指針訪問對象的成員 }3.3對象數(shù)組與對象指針3.3對象數(shù)組與對象指針2.用對象指針訪問對象數(shù)組例如將例3.3.3的main()改寫為:voidmain() {exeob[2],*p; ob[0].set_a(10);ob[1].set_a(20);p=ob; p->show_a(); p++; p->show_a(); }3.3.3自引用指針thisC++提供了一個特殊的對象指針——this指針;this指針為成員函數(shù)所屬對象的指針,指向對象的地址;this指針是一種隱含指針,隱含于每個類的成員函數(shù)中,即調用某成員函數(shù)時,都將自動產(chǎn)生一個this指針。this指針可以隱式調用——即在類內部直呼其名(前面介紹的所有例子)——通常均采用此種方法。顯式調用this指針的格式:this->成員名注意:this指針是系統(tǒng)自定義的,用戶不能再定義3.3對象數(shù)組與對象指針3.3.3自引用指針this例3.3.4this指針的引例。#include<iostream.h>classA{intx;public:A(intx1){x=x1;}voiddisp(){cout<<"x="<<x<<endl;}};main(){Aa(1),b(2);cout<<"a:";a.disp();cout<<"b:";b.disp();return0;}相當于this->x相當于this->x3.3對象數(shù)組與對象指針例3.3.5顯示this指針的值。#include<iostream.h>classA{intx;public:A(intx1){x=x1;}voiddisp(){cout<<"\nthis="<<this<<"whenx="<<this->x;}};main(){Aa(1),b(2),c(3);a.disp();b.disp();c.disp();return0;}3.3對象數(shù)組與對象指針1、串的基本概念1)串(又稱字符串)是由n(n≥0)個字符組成的有限序列。(它是數(shù)據(jù)元素為單個字符的特殊線性表。)記為:s=“s0,s1,……,sn-1”(n≥0)
串名串值(用“”括起來)2)串長串中字符的個數(shù)(n≥0)。3)空串串中字符的個數(shù)為0時稱為空串。4)空白串由一個或多個空格符組成的串。5)子串串S中任意個連續(xù)的字符序列叫S的子串;S叫主串。3.4string類6)子串位置子串的第一個字符在主串中的序號。7)字符位置字符在串中的序號。8)串相等串長度相等,且對應位置上字符相等。(即兩個串中的字符序列一一對應相等。)空串和空白串的區(qū)別空串(NullString)是指長度為零的串;而空白串(BlankString),是指包含一個或多個空白字符‘’(空格鍵)的字符串.注:串與字符的區(qū)別“a”串,長度為1的串。(它不僅要存儲字符‘a(chǎn)’,還要存儲該串的長度數(shù)據(jù)1)‘a(chǎn)’字符a。(只存儲字符‘a(chǎn)’)
3.4string類2、C-串結構每個字符占據(jù)1個字節(jié)一個C-串是一個字符序列,用來表示各種名字或者文字說明C-串的字符序列的最后總是添加有一個結束標志.即在6個字符的字串(“Hello!”)其空間存儲有7個字節(jié)右邊三圖是不同細節(jié)的同一空間結構描述’H’’e’’l’’l’’o’’!’’\0’72101108108111330010010000110010101101100011011000110111100100001000000003.4string類知道了C-串首地址,即可知道整個串,所以可以藉字符首址(字符指針)來操作C-串,但要注意,串的第一個字符與整個串的操作不同,如,C-串的輸出操作:
char*str=”Hello”;cout<<*str<<endl;//顯示Hcout<<str<<endl;//顯示Hello3.4string類3、C-串配備專門操作庫函數(shù)C-串不能直接比較:
cout<<(“join”==”join”?””:”not“)<<”equal\n”;//字面值比較
char*str1=”good”;
char*str2=”good”;cout<<(str1==str2?””:”not“)<<”equal\n”;//字符指針比較
charbuffer1[6]=”Hello”;
charbuffer2[6]=”Hello”;cout<<(buffer1==buffer2?””:”not“)<<”equal\n”;//字符數(shù)組比較結果:notequalnotequalnotequal3.4string類所以C-串配備專門操作庫函數(shù):strcpy(s1,s2);//從s2拷貝到s1strcmp(s1,s2);//比較s1與s2strcat(s1,s2);//連接s2到s1strrev(s);//將s倒排strset(s,‘c’);//將s全置為cstrstr(s,“ell”);//查找s中的子串strchr(s,‘c’);//查找s中的字符等等3.4string類4、字符指針操作C-串的不安全性char*str1;char*str2=new
char[5];strcpy(str2,”ugly”);strcpy(str1,str2);//錯:str1沒有空間可儲strcpy(str2,”Hello”);//錯:str2空間不夠大str2=”Hello”;//錯:原來的”ugly”空間脫鉤,導致內存泄漏根源:復制操作須以足夠的目的地空間為前提,而所有C-串操作的空間調配都是人為安排的,C-串庫函數(shù)一概不管3.4string類C++支持兩種類型的字符串時,一是C語言介紹的串,另一種是更方便的字符串類型,即字符串類string,string類提供了對字符串處理所需要的操作。3.4string類5、string類和對象使用string類,需要包含頭文件#include<string>定義串對象格式,string對象1,對象2……string串的運算符:+、=、+=、==、!=、<、<=、>、>=、[]、<<、>>例3.4.1:stringa,s1="Hello";strings2="123";a=s1;//copycout<<(a==s1?"":"not")<<"equal\n";//comparecout<<a+s2<<endl;//concatenatereverse(a.begin(),a.end());cout<<a<<endl;//reversecout<<a.replace(0,9,9,'c')<<endl;//setcout<<(s1.find("ell")!=-1?"":"not")<<"found\n";//findstringcout<<(s1.find('c')!=-1?"":"not")<<"found\n";//findchar3.4string類6、C-串和string輸入:cin>>的讀入方式總是將前導的空格(所謂空格,即包括空格、回車、水平或垂直制表符等)濾掉,將單詞讀入,在遇到空格時結束本次輸入getline總是將行末的回車符濾掉,將其整行輸入對字串”Hello,Howareyou?”的兩種輸入方式for(strings;cin>>s;)cout<<s<<”“;cout<<endl;
strings;getline(cin,s);cout<<s<<endl;3.4string類3.5向函數(shù)傳遞對象3.5.1使用對象作為函數(shù)參數(shù)例3.4.2使用對象作為函數(shù)參數(shù)。#include<iostream.h>class
aClass{public:aClass(intn){i=n;}voidset(intn){i=n;}intget(){returni;}private:inti;};voidsqr(aClass
ob){ob.set(ob.get()*ob.get());cout<<"copyofobjhasivalueof";cout<<ob.get()<<"\n";}main(){aClassobj(10);sqr(obj);cout<<"But,obj.iisunchangedinmain:";cout<<obj.get();return0;}3.5向函數(shù)傳遞對象先拷貝再使用3.5.2使用對象指針作為函數(shù)參數(shù)
例3.5.1使用對象指針作為函數(shù)參數(shù)。
#include<iostream.h>classaClass{public: aClass(intn){i=n;} voidset(intn){i=n;} intget(){returni;}private: inti;};3.5向函數(shù)傳遞對象voidsqr(aClass
*ob){ob->set(ob->get()*ob->get());cout<<"Copyofobjhasivalueof";cout<<ob->get()<<"\n";}main(){aClassobj(10);sqr(&obj);cout<<"Now,obj.iinmain()hasbeenchanged:";cout<<obj.get()<<"\n";return0;}3.5向函數(shù)傳遞對象傳地址,直接引用3.5向函數(shù)傳遞對象3.5.3使用對象引用作為函數(shù)參數(shù)例3.5.2使用對象引用作為函數(shù)參數(shù)。#include<iostream.h>classaClass{public: aClass(intn){i=n;} voidset(intn){i=n;} intget(){returni;}private: inti;};voidsqr(aClass&ob){ob.set(ob.get()*ob.get());cout<<"Copyofobjhasivalueof";cout<<ob.get()<<"\n";}main(){aClassobj(10);sqr(obj);cout<<"Now,obj.iinmain()hasbeenchanged:";cout<<obj.get()<<"\n";return0;}3.5向函數(shù)傳遞對象用別名,直接引用3.6.1對象的賦值語句變量可以直接賦值,如intxy=10;x=y;兩個同類型的對象是否可以直接賦值呢?例3.6.1所示3.6對象的賦值和復制#include<iostream.h>classabc{ public:voidinit(inti,intj){a=i;b=j;}voidshow(){cout<<a<<""<<b<<endl;} private:inta,b;}; main() {abco1,o2; o1.init(12,34);
o2=o1;
//將對象o1數(shù)據(jù)成員的值賦給對象o2 o1.show(); o2.show(); return0; }將對象o1的所有數(shù)據(jù)成員對應地賦值給對象o2的所有數(shù)據(jù)成員(這里實質上調用了缺省賦值運算符函數(shù))3.6對象的賦值和復制賦值說明:兩個對象類型必須一致賦值過程是,將一個對象的所有數(shù)據(jù)成員的值復制給另外一個對象對應的數(shù)據(jù)成員思考:僅僅是數(shù)據(jù)成員的簡單復制,是否適合所有類型的對象賦值?3.6對象的賦值和復制3.6.2拷貝構造函數(shù)拷貝構造函數(shù)是一種特殊的構造函數(shù),其形參是本類對象的引用。其作用是使用一個已經(jīng)存在的對象去初始化另一個同類的對象??截悩嬙旌瘮?shù)具有以下特點:因為該函數(shù)也是一種構造函數(shù),所以其函數(shù)名與類名相同,并且該函數(shù)也沒有返回值類型。該函數(shù)只有一個參數(shù),并且是同類對象的引用。每個類都必須有一個拷貝構造函數(shù)。程序員可以根據(jù)需要定義特定的拷貝構造函數(shù),以實現(xiàn)同類對象之間數(shù)據(jù)成員的傳遞。如果程序員沒有定義類的拷貝構造函數(shù),系統(tǒng)就會自動生成產(chǎn)生一個缺省的拷貝構造函數(shù)。3.6對象的賦值和復制3.6.2拷貝構造函數(shù)調用拷貝構造函數(shù)的一般形式:類名對象2(對象1)類名對象2=對象1調用拷貝構造函數(shù)的3中情況用一個對象去初始化另一個對象時函數(shù)調用時,實參對象傳遞給形參對象函數(shù)返回時,返回值是類類型時。3.6對象的賦值和復制自定義拷貝構造函數(shù)自定義拷貝構造函數(shù)的一般形式如下:類名::類名(類名&對象名){//拷貝構造函數(shù)的函數(shù)體}例3.6.2自定義拷貝構造函數(shù)的使用。3.6.2拷貝構造函數(shù)3.6對象的賦值和復制#include<iostream.h>classCoord {public:Coord(inta,intb)//構造函數(shù){x=a;y=b;cout<<"Usingnormalconstructor\n";}
Coord(constCoord&p)//拷貝構造函數(shù){x=2*p.x;y=2*p.y;cout<<"Usingcopyconstructor\n";}voidprint(){cout<<x<<""<<y<<endl;}private:intx,y;};main(){Coordp1(30,40);//定義對象p1,調用了普通的構造函數(shù)Coordp2(p1);//以“代入”法調用拷貝構造函數(shù),用對象p1初始化對象p2p1.print();p2.print();return0;}3.6對象的賦值和復制在默認拷貝構造函數(shù)中,拷貝的策略是逐個成員依次拷貝。但是,一個類可能會擁有資源,當其構造函數(shù)分配了一個資源(例如堆內存)的時候,會發(fā)生什么?如果拷貝構造函數(shù)簡單地制作了一個該資源的拷貝,而不對它本身分配,就得面臨一個麻煩的局面:兩個對象都擁有同一個資源。當對象析構時,該資源將經(jīng)歷兩次資源返還。3.6對象的賦值和復制3.6.3淺拷貝與深拷貝淺拷貝實現(xiàn)對象間數(shù)據(jù)元素的一一對應復制。默認的拷貝函數(shù)都是淺拷貝深拷貝當被復制的對象數(shù)據(jù)成員是指針類型時,不是復制該指針成員本身,而是將指針所指的對象進行復制。3.6對象的賦值和復制下面的程序描述了Person對象被淺拷貝后,面臨析構時的困惑:#include<iostream.h>#include<string.h>classPerson{public:Person(char*pN){cout<<"Constructing"<<pN<<endl;pName=newchar[strlen(pN)+1];3.6對象的賦值和復制
if(pName!=0)strcpy(pName,pN);}~Person(){cout<<"Destructing"<<pName<<endl;pName[0]='\0';deletepName;}protected:char*pName;};443.6對象的賦值和復制
voidmain(){Personp1("Randy");Personp2=p1;//即Personp2(p1);,調用默認拷貝構造函數(shù),}//p2與p1完全一樣運行結果:45Destructing葺葺葺葺葺程序出錯!ConstructingRandy創(chuàng)建p1對象時輸出DestructingRandy主函數(shù)結束時,析構p2主函數(shù)結束時,析構p13.6對象的賦值和復制46內存邏輯示意圖:3.6對象的賦值和復制淺拷貝與深拷貝在上例基礎上,增加一個Person類的深拷貝構造函數(shù):#include<iostream.h>#include<string.h>classPerson{public:Person(char*pN);Person(Person&p);~Person();protected:char*pName;};Person::Person(char*pN){cout<<"Constructing"<<pN<<endl;pName=newchar[strlen(pN)+1];if(pName!=0)strcpy(pName,pN);}Person::Person(Person&p){cout<<"Copying"<<p.pName<<"intoitsownblock\n";pName=newchar[strlen(p.pName)+1];if(pName!=0)strcpy(pName,p.pName);}48Person::~Person(){cout<<"Destructing"<<pName<<endl;pName[0]='\0';deletepName;}voidmain(){Personp1("Randy");Personp2=p1;//即Personp2(p1);}49運行結果:ConstructingRandyCopyingRandyintoitsownblockDestructingRandyDestructingRandy503.7靜態(tài)成員3.7.1靜態(tài)數(shù)據(jù)成員在一個類中,若將一個數(shù)據(jù)成員說明為static,這種成員稱為靜態(tài)數(shù)據(jù)成員。與一般的數(shù)據(jù)成員不同,無論建立多少個類的對象,都只有一個靜態(tài)數(shù)據(jù)的拷貝。從而實現(xiàn)了同一個類的不同對象之間的數(shù)據(jù)共享。定義靜態(tài)數(shù)據(jù)成員的格式如下:
static數(shù)據(jù)類型
數(shù)據(jù)成員名;
例3.7.1靜態(tài)數(shù)據(jù)成員的使用引例。解決共享全局變量的問題#include<iostream.h>#include<string.h>classStudent{public:Student(char*name1,char*stu_no1,floatscore1); ~Student();voidshow();//輸出姓名、學號和成績 voidshow_count_sum_ave();//輸出學生人數(shù)、總成績和平均成績private: char*name;//學生姓名 char*stu_no;//學生學號 floatscore;//學生成績
staticintcount;//靜態(tài)數(shù)據(jù)成員,統(tǒng)計學生人數(shù)
staticfloatsum;//靜態(tài)數(shù)據(jù)成員,統(tǒng)計總成績
staticfloatave;//靜態(tài)數(shù)據(jù)成員,統(tǒng)計平均成績};Student::Student(char*name1,char*stu_no1,floatscore1){name=newchar[strlen(name1)+1];strcpy(name,name1);stu_no=newchar[strlen(stu_no1)+1];strcpy(stu_no,stu_no1); score=score1;++count;//累加學生人數(shù)
sum=sum+score;//累加總成績
ave=sum/count;//計算平均成績}Student::~Student(){delete[]name;delete[]stu_no;
--count;
sum=sum-score;}相當于this->x修改共享變量voidStudent::show(){cout<<"\nname:"<<name;cout<<"\nstu_no:"<<stu_no;cout<<"\nscore:"<<score;}voidStudent::show_count_sum_ave(){cout<<"\ncount:"<<count;//輸出靜態(tài)數(shù)據(jù)成員countcout<<"\nsum:"<<sum;//輸出靜態(tài)數(shù)據(jù)成員sumcout<<"\nave:"<<ave;//輸出靜態(tài)數(shù)據(jù)成員ave}intStudent::count=0;//靜態(tài)數(shù)員count初始化floatStudent::sum=0.0;//靜態(tài)數(shù)員sum初始化floatStudent::ave=0.0;//靜態(tài)數(shù)員ave初始化初始化格式如下:<類型><類名>::<靜態(tài)數(shù)據(jù)成員名>=<值>;voidmain(){ Studentstu1("Liming","990201",90); stu1.show(); stu1.show_count_sum_ave();Studentstu2("Zhanghao","990202",85);stu2.show(); stu2.show_count_sum_ave();}3.7靜態(tài)成員
3.7.2靜態(tài)成員函數(shù)引用類中說明的靜態(tài)數(shù)據(jù)成員,但不能直接引用非靜態(tài)數(shù)據(jù)成員定義靜態(tài)成員函數(shù)的格式如下:static返回類型靜態(tài)成員函數(shù)名(參數(shù)表);與靜態(tài)數(shù)據(jù)成員類似,調用公有靜態(tài)成員函數(shù)的一般格式有如下幾種:
類名::靜態(tài)成員函數(shù)名(實參表)對象.靜態(tài)成員函數(shù)名(實參表)對象指針->靜態(tài)成員函數(shù)名(實參表)例3.7.2靜態(tài)成員函數(shù)來訪問靜態(tài)數(shù)據(jù)成員。解決靜態(tài)數(shù)據(jù)成員的訪問問題#include<iostream.h>#include<string.h>classStudent{private: char*name;//學生姓名 char*stu_no;//學生學號 floatscore;//學生成績
staticintcount;//靜態(tài)數(shù)據(jù)成員,統(tǒng)計學生人數(shù)
staticfloatsum;//靜態(tài)數(shù)據(jù)成員,統(tǒng)計總成績public:Student(char*name1,char*stu_no1,floatscore1); ~Student();voidshow();//普通成員函數(shù),輸出姓名、學號和成績staticvoidshow_count_sum();//靜態(tài)成員函數(shù),輸出學生人數(shù)和總成績};Student::Student(char*name1,char*stu_no1,floatscore1){name=newchar[strlen(name1)+1];strcpy(name,name1);stu_no=newchar[strlen(stu_no1)+1];strcpy(stu_no,stu_no1);score=score1;
++count;//累加學生人數(shù)
sum=sum+score;//累加總成績}Student::~Student(){delete[]name;delete[]stu_no;
--count;
sum=sum-score;}相當于this->x修改共享變量voidStudent::show(){ cout<<"\nname:"<<name; cout<<"\nstu_no:"<<stu_no; cout<<"\nscore:"<<score;}voidStudent::show_count_sum()//靜態(tài)成員函數(shù){ cout<<"\ncount:"<<count;//輸出靜態(tài)數(shù)據(jù)成員cout<<"\nsum:"<<sum;//輸出靜態(tài)數(shù)據(jù)成員}intStudent::count=0;//靜態(tài)數(shù)據(jù)成員初始化floatStudent::sum=0.0;//靜態(tài)數(shù)據(jù)成員初始化voidmain(){Studentstu1("Liming","990201",90); stu1.show();
Student::show_count_sum();//使用類名訪問靜態(tài)成員函數(shù)Studentstu2("Zhanghao","990202",85); stu2.show();
stu2.show_count_sum();//使用對象stu2訪問靜態(tài)成員函數(shù)}3.7靜態(tài)成員3.7.3通過普通指針訪問靜態(tài)成員例3.7.3通過指針訪問類的靜態(tài)數(shù)據(jù)成員。 #include<iostream.h>classmyclass{public:myclass()//構造函數(shù),每定義一個對象,{++i;}//靜態(tài)數(shù)據(jù)成員i加1
staticinti;//聲明靜態(tài)數(shù)據(jù)成員i };intmyclass::i=0;//靜態(tài)數(shù)據(jù)成員i初始化,//不必在前面加staticmain(){int*count=&myclass::i;//聲明一個int型指針,//指向類的靜態(tài)成員myclassob1,ob2,ob3,ob4;cout<<"myclass::i="<<*count<<endl;//通過指針直接//訪問靜態(tài)數(shù)據(jù)成員return0;}3.7靜態(tài)成員3.8友元
友元既可以是不屬于任何類的一般函數(shù),也可以是另一個類的成員函數(shù),還可以是整個的類。3.8.1友元函數(shù)友元函數(shù)不是當前類的成員函數(shù),而是獨立于當前類的外部函數(shù),但它可以訪問該類的對象的所有成員,包括私有成員、保護成員和公有成員。友元函數(shù)的定義和調用與一般函數(shù)是一樣的。例3.8.1友元函數(shù)的使用。#include<iostream.h>#include<string.h>classgirl{ public:girl(char*n,intd){name=newchar[strlen(n)+1];strcpy(name,n);age=d;}friend
voiddisp(girl&);//聲明友元函數(shù)~girl(){delete[]name;}private:char*name;intage;};voiddisp(girl&x)//定義友元函數(shù){cout<<"Girl\'snameis"<<<<",age:"<<x.age<<"\n";}voidmain(){girle("ChenXingwei",18);disp(e);//調用友元函數(shù)}在私有段和公有段都可3.8友元
3.8.2友元成員一個類的成員函數(shù)也可以作為另一個類的友元,這種成員函數(shù)不僅可以訪問自己所在類對象中的所有成員,還可以訪問friend聲明語句所在類對象中的所有成員。這樣能使兩個類相互合作、協(xié)調工作,完成某一任務。例3.8.2一個類的成員函數(shù)作為另一個類的友元。#include<iostream.h>#include<string.h>classgirl;classboy{public:boy(char*n,intd){name=newchar[strlen(n)+1];strcpy(name,n);age=d;}voiddisp(girl&);//聲明disp()為類boy的成員函數(shù)~boy(){deletename;}private:char*name;intage;};classgirl{public:girl(char*n,intd){name=newchar[strlen(n)+1];strcpy(name,n);age=d;}
friendvoidboy::disp(girl&);//聲明類boy的成員函數(shù)disp()//為類girl的友元函數(shù)~girl(){deletename;}private:char*name;intage;};voidboy::disp(girl&x)//定義友元函數(shù)disp(){cout<<"Boy\'snameis"<<name<<",age:"<<age<<"\n";//訪問boy類對象的成員cout<<"Girl\'snameis"<<<<",age:"<<x.age<<"\n";}//訪問girl類對象的成員
通過對象訪問私有成員的又一例外通過對象訪問私有成員的又一例外voidmain() { boyb("ChenHao",25); girle("ZhangWei",18);
b.disp(e); }
程序運行結果如下:Boy'snameisChenHao,age:25Girl'snameis:ZhangWei,age:183.8友元3.8.3友元類一個類也可以作為另一個類的友元。例如:classY{//…};classX{//…
friendY;//聲明類Y為類X的友元類//…};3.9對象成員
如果一個類的對象是另一個類的數(shù)據(jù)成員,則稱這樣的數(shù)據(jù)成員為對象成員。例如:classA{//...};classB{
Aa;//類A的對象a為類B的對象成員public://…};使用對象成員著重要注意的問題是對象成員的初始化問題,即類B的構造函數(shù)如何定義?例如有以下的類:classX{類名1對象成員名1;類名2對象成員名2;…類名n對象成員名n;};一般來說,類X的構造函數(shù)的定義形式為;X::X(形參表0):對象成員名1(形參表1),…,對象成員名i(形參表i),…,對象成員名n(形參表n){//…構造函數(shù)體}3.10常類型3.10.1常引用如果在說明引用時用const修飾,則被說明的引用為常引用。常引用的說明形式如下:const類型&引用名[=初值];或:類型const&引用名[=初值];例如:
inta=5;
constint&b=a;b是一個常引用,它所引用的對象不允許更改。例3.10.1常引用作函數(shù)形參。#include<iostream.h>intadd(
const
int&i
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子商務在醫(yī)療領域的應用與案例分析
- 影視道具制作與機械原理探究考核試卷
- 現(xiàn)代辦公空間中綠色建筑的結構設計趨勢
- 現(xiàn)代辦公空間中的家用紡織品配置策略
- 用直播為品牌增值-以商家如何在各個不同平臺上實施為例
- 海洋守護計劃實施生態(tài)修復保護海洋生物多樣性
- 2025-2030年掌上詩詞創(chuàng)作助手行業(yè)深度調研及發(fā)展戰(zhàn)略咨詢報告
- 2025-2030年按摩功能沙發(fā)行業(yè)跨境出海戰(zhàn)略研究報告
- 現(xiàn)代化企業(yè)管理中的風險控制策略
- 2025-2030年新能源汽車充電站合作行業(yè)跨境出海戰(zhàn)略研究報告
- 人教版二年級上冊加減混合計算300題及答案
- 車間主管年終總結報告
- 2023年四川省成都市武侯區(qū)中考物理二診試卷(含答案)
- 鮮切水果行業(yè)分析
- 《中國探月工程》課件
- 義務教育物理課程標準(2022年版)測試題文本版(附答案)
- 人工智能在地理信息系統(tǒng)中的應用
- 第7章-無人機法律法規(guī)
- 藥劑科基本藥物處方用藥狀況點評工作表
- 拆遷征收代理服務投標方案
- 完形療法概述
評論
0/150
提交評論