对象的使用
目錄
一、對(duì)象指針
二、對(duì)象引用
三、對(duì)象數(shù)組
四、動(dòng)態(tài)對(duì)象 ?
五、this指針
六、組合對(duì)象
一、對(duì)象指針
定義:占用一塊連續(xù)的內(nèi)存區(qū)域,由此可以使用一個(gè)指向?qū)ο蟮闹羔榿碓L問對(duì)象。它指向存放該對(duì)象的地址。
優(yōu)點(diǎn):
(1)實(shí)現(xiàn)地址傳遞
(2)使用對(duì)象指針效率高
//Clock.h #include<iostream> using namespace std;class Clock { public:Clock(int h = 0,int m = 0,int s = 0){H = h;M = m;S = s;cout << "Clock()" << endl;}~Clock(){cout << "~Clock()" << endl;}void SetTime(int h,int m,int s){H = h;M = m;S = s;}void ShowTime(){cout << H << ":" << M << ":" << S <<endl;}Clock(Clock &p){H = p.H;M = p.M;S = p.S;}void AddTime(Clock *Cp){H = (Cp -> H + H + (Cp -> M + M + (Cp -> S + S ) / 60 ) / 60 ) % 24;M = (Cp -> M + M + (Cp -> S + S) / 60 ) % 60;S = (Cp ->S + S ) % 60;}void AddTime(int h,int m,int s){H = (h+ H + (m + M + ( s + S) / 60 ) / 60) % 24;M = (m + M + (s + S) / 60) % 60; S = (s + S) % 60;}void AddTime(int s){H = (H + (M + ( s + S) / 60 ) / 60) % 24;M = (M + (s + S) / 60) % 60; S = (s + S) % 60;} private:int H;int M;int S; }; //main.cpp #include<iostream> #include"Clock.h" using namespace std;int main() {Clock C1;Clock C2(8,20,20);C1.AddTime(4000);C1.ShowTime();C2.AddTime(&C1);C2.ShowTime();return 0;}?
?
二、對(duì)象引用
對(duì)象引用就是對(duì)某類對(duì)象定義一個(gè)引用,其實(shí)只是通過將被引用對(duì)象的地址賦給引用對(duì)象,使二者指向同一塊內(nèi)存空間,引用對(duì)象是被引用對(duì)象的別名。
PS:
(1)對(duì)象引用與被引用對(duì)象必須是同類型的。
(2)除非是作為函數(shù)參數(shù)與函數(shù)返回值,對(duì)象引用在定義時(shí)必須要初始化。
(3)定義一個(gè)對(duì)象引用并沒有定義一個(gè)對(duì)象,所以不分配地址空間,不調(diào)用構(gòu)造函數(shù)。
(4)對(duì)象引用通常作為函數(shù)的參數(shù),它具有指針的優(yōu)點(diǎn),還比指針更簡潔。
void AddTime(Clock &Cr) {H = (Cr.H + H + (Cr.M + M + (Cr.S + S ) / 60 ) / 60 ) % 24;M = (Cr.M + M + (Cr.S + S) / 60 ) % 60;S = (Cr.S + S ) % 60; }將main.cpp中C2.AddTime(&C1);替換成 C2.AddTime(C1);.
運(yùn)行結(jié)果和上圖相同。
三、對(duì)象數(shù)組
概念:對(duì)象數(shù)組是以對(duì)象為元素的數(shù)組。對(duì)象數(shù)組的定義、賦值、引用和普通數(shù)組相同。
//Score.h #include<iostream> using namespace std;const double Rate = 0.7; //平時(shí)成績比例class Score { public:Score(long = 0,char * = NULL,int = 0,int = 0, int = 0);//構(gòu)造函數(shù)void Count(); //計(jì)算總評(píng)成績void ShowScore(); //顯示成績 private: long Sno; //學(xué)號(hào)char *Sname; //姓名int Speace; //平時(shí)成績int Sfinale; //期末考試成績int Stotal; //總評(píng)成績 };//構(gòu)造函數(shù) Score :: Score(long no,char * name,int peace,int finale, int total) {Sno = no;Sname = name;Speace = peace;Sfinale = finale;Stotal = total; }void Score :: Count() {Stotal =(int) (Speace * Rate + Sfinale * (1- Rate)); } void Score :: ShowScore() {cout << Sno << "\t" << Speace << "\t" << Sfinale << "\t" << Stotal << endl; } //main.cpp #include<iostream> #include"Score.h"int main() {Score ClassScore1[3];Score ClassScore2[3] = { Score(20190101,"zhangsan",80,79),Score(20190102,"lisi",90,85),Score(20190103,"wangwu",70,55)};for(int i = 0;i < 3;i++){ClassScore2[i].Count();}for(int i = 0;i < 3;i++){ClassScore2[i].ShowScore();} }四、動(dòng)態(tài)對(duì)象 ?
//在之前的Score.h 文件里增加這個(gè)函數(shù) //Score.h void Score :: SetScore(long no,char * name,int peace,int finale, int total) {Sno = no;Sname = name;Speace = peace;Sfinale = finale;Stotal = total; }?
//main.cpp #include<iostream> #include"Score.h"int main() {Score * ClassScore;ClassScore = new Score[3];ClassScore[0].SetScore(20190101,"zhangsan",80,79),ClassScore[1].SetScore(20190102,"lisi",90,85),ClassScore[2].SetScore(20190103,"wangwu",70,55);for(int i = 0;i < 3;i++){ClassScore[i].Count();}for(int i = 0;i < 3;i++){ClassScore[i].ShowScore();}delete [ ] ClassScore;return 0; }運(yùn)行結(jié)果與之前的截圖相同。
PS:在建立動(dòng)態(tài)對(duì)象數(shù)組時(shí),要調(diào)用構(gòu)造函數(shù),調(diào)用的次數(shù)與數(shù)組的大小相同,刪除的時(shí)候要調(diào)用析構(gòu)函數(shù),調(diào)用的次數(shù)與數(shù)組的大小相同。
五、this指針
概念:this指針是一個(gè)系統(tǒng)預(yù)定義的特殊指針,指向當(dāng)前對(duì)象 ,表示當(dāng)前對(duì)象的地址。
在函數(shù)SetTime()中,函數(shù)體中這三行是等效的。
void Clock :: SetTime(int h,int m,int s) {H = h; M = m; S = s;this -> H = h; this -> M = m; this -> S = s;(* this).H = h; (*this).M = m; (*this).S = s; }PS:
(1)this指針不是調(diào)用對(duì)象的名稱,而是指向?qū)ο蟮闹羔樀拿Q。
(2)this的值不能改變,他總是指向當(dāng)前調(diào)用對(duì)象。
六、組合對(duì)象
概念:組合概念體現(xiàn)的是一種包含與被包含的關(guān)系,即在邏輯上A是B的一部分。一個(gè)類內(nèi)嵌其他類的對(duì)象作為成員,將對(duì)象嵌入到類中的這樣一種描述復(fù)雜類的方法叫做類的組合,一個(gè)含有其他類對(duì)象稱為組合類,組合類的對(duì)象稱為組合對(duì)象。
我們以計(jì)算火車旅途時(shí)間的組合類來看。
?
| ????????? 類名 | ?????????????????????????????????? 成員名 | |
| ???????? TrainTrip | ?Clock?? StartTime | H,M,S |
| SetTime(),ShowTime() | ||
| Clock?? EndTime | H,M,S | |
| SetTime(),ShowTime() | ||
| char * TrianNO | ||
| char * TripTime() | ||
?????????????????????????????????????????????????????????????????????????? 類TrainTrip的構(gòu)成與成員
//Clock.h #include<iostream> using namespace std;class Clock { public:Clock(int h = 0,int m = 0,int s = 0){this -> H = (h > 0 && h < 24) ? h : 0;this -> M = (m > 0 && m < 60 ) ? m : 0;this -> S = (s > 0 && s < 60 ) ? s : 0;}void SetTime(int h,int m,int s){this -> H = (h > 0 && h < 24) ? h : 0;this -> M = (m > 0 && m < 60 ) ? m : 0;this -> S = (s > 0 && s < 60 ) ? s : 0;}void ShowTime(){cout << H << ":" << M << ":" << S << endl;}int GetH(){return H;}int GetM(){return M;}int GetS(){return S;} private:int H;int M;int S; }; //TrainTrip.h #include<iostream> #include"Clock.h" using namespace std;class TrainTrip { public:TrainTrip(char * trainno,Clock s,Clock e)//構(gòu)造函數(shù){this -> TrainNo = trainno;this -> StartTime = s;this -> EndTime = e;}Clock TrainTime(){//臨時(shí)存儲(chǔ)小時(shí),分鐘,秒int tH; int tM;int tS;//借位int carry = 0;//臨時(shí)存儲(chǔ)時(shí)間Clock tTime;(tS = EndTime.GetS() - StartTime.GetS() ) > 0 ? carry = 0 : tS += 60,carry = 1;(tM = EndTime.GetM() - StartTime.GetM() - carry ) > 0 ? carry = 0 : tM += 60,carry = 1;(tH = EndTime.GetH() - StartTime.GetH() - carry ) > 0 ? carry = 0 : tH += 24;tTime.SetTime(tH,tM,tS);return tTime;} private:char * TrainNo; //車次Clock StartTime; //出發(fā)時(shí)間Clock EndTime; //到達(dá)時(shí)間 }; //main.cpp #include<iostream> #include"TrainTrip.h" using namespace std;int main() {Clock C1 (8,10,10);//定義Clock類的對(duì)象Clock C2(6,1,2);Clock C3;//定義Clock類對(duì)象,存儲(chǔ)結(jié)果TrainTrip T1("K16",C1,C2);//定義TrainTrip對(duì)象C3 = T1.TrainTime();C3.ShowTime();return 0; }運(yùn)行結(jié)果:
時(shí)分秒 H,M,S是Clock類的私有成員,在Clock類外無法存取,而在TrainTrip類中需要H,M,S的值,因此在Clock類中提供了一個(gè)公有的存取H,M,S值的接口函數(shù)GetH(),GetM(),GetS()供TrainTrip類讀取H,M,S。
PS:
(1)建立對(duì)象時(shí),通過成員類的構(gòu)造函數(shù)對(duì)成員對(duì)象進(jìn)行初始化,初始化值在初始化表中提供。
(2)在定義一個(gè)組合對(duì)象時(shí):
????????? a.成員對(duì)象按照在其組合類的聲明中出現(xiàn)的次序依次調(diào)用各自的構(gòu)造函數(shù)。
????????? b.組合類對(duì)象調(diào)用組合類構(gòu)造函數(shù)。
????????? c.調(diào)用析構(gòu)函數(shù),析構(gòu)函數(shù)的調(diào)用順序與構(gòu)造函數(shù)相反。
(3)組合類成員對(duì)象的訪問權(quán)限
| ???????????? 成員對(duì)象 組合類 | public | protected | private |
| public | public | 不可訪問 | 不可訪問 |
| protected | protect | 不可訪問 | 不可訪問 |
| private | private | 不可訪問 | 不可訪問 |
???????????????????????????????????????????????????????????? 各個(gè)成員對(duì)象在組合類中的訪問控制屬性
?
總結(jié)
- 上一篇: oracle管理员登录报错,关于Orac
- 下一篇: electron开发_基于Electro