对象的使用
目錄
一、對象指針
二、對象引用
三、對象數組
四、動態對象 ?
五、this指針
六、組合對象
一、對象指針
定義:占用一塊連續的內存區域,由此可以使用一個指向對象的指針來訪問對象。它指向存放該對象的地址。
優點:
(1)實現地址傳遞
(2)使用對象指針效率高
//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;}?
?
二、對象引用
對象引用就是對某類對象定義一個引用,其實只是通過將被引用對象的地址賦給引用對象,使二者指向同一塊內存空間,引用對象是被引用對象的別名。
PS:
(1)對象引用與被引用對象必須是同類型的。
(2)除非是作為函數參數與函數返回值,對象引用在定義時必須要初始化。
(3)定義一個對象引用并沒有定義一個對象,所以不分配地址空間,不調用構造函數。
(4)對象引用通常作為函數的參數,它具有指針的優點,還比指針更簡潔。
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);.
運行結果和上圖相同。
三、對象數組
概念:對象數組是以對象為元素的數組。對象數組的定義、賦值、引用和普通數組相同。
//Score.h #include<iostream> using namespace std;const double Rate = 0.7; //平時成績比例class Score { public:Score(long = 0,char * = NULL,int = 0,int = 0, int = 0);//構造函數void Count(); //計算總評成績void ShowScore(); //顯示成績 private: long Sno; //學號char *Sname; //姓名int Speace; //平時成績int Sfinale; //期末考試成績int Stotal; //總評成績 };//構造函數 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();} }四、動態對象 ?
//在之前的Score.h 文件里增加這個函數 //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; }運行結果與之前的截圖相同。
PS:在建立動態對象數組時,要調用構造函數,調用的次數與數組的大小相同,刪除的時候要調用析構函數,調用的次數與數組的大小相同。
五、this指針
概念:this指針是一個系統預定義的特殊指針,指向當前對象 ,表示當前對象的地址。
在函數SetTime()中,函數體中這三行是等效的。
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指針不是調用對象的名稱,而是指向對象的指針的名稱。
(2)this的值不能改變,他總是指向當前調用對象。
六、組合對象
概念:組合概念體現的是一種包含與被包含的關系,即在邏輯上A是B的一部分。一個類內嵌其他類的對象作為成員,將對象嵌入到類中的這樣一種描述復雜類的方法叫做類的組合,一個含有其他類對象稱為組合類,組合類的對象稱為組合對象。
我們以計算火車旅途時間的組合類來看。
?
| ????????? 類名 | ?????????????????????????????????? 成員名 | |
| ???????? TrainTrip | ?Clock?? StartTime | H,M,S |
| SetTime(),ShowTime() | ||
| Clock?? EndTime | H,M,S | |
| SetTime(),ShowTime() | ||
| char * TrianNO | ||
| char * TripTime() | ||
?????????????????????????????????????????????????????????????????????????? 類TrainTrip的構成與成員
//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)//構造函數{this -> TrainNo = trainno;this -> StartTime = s;this -> EndTime = e;}Clock TrainTime(){//臨時存儲小時,分鐘,秒int tH; int tM;int tS;//借位int carry = 0;//臨時存儲時間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; //出發時間Clock EndTime; //到達時間 }; //main.cpp #include<iostream> #include"TrainTrip.h" using namespace std;int main() {Clock C1 (8,10,10);//定義Clock類的對象Clock C2(6,1,2);Clock C3;//定義Clock類對象,存儲結果TrainTrip T1("K16",C1,C2);//定義TrainTrip對象C3 = T1.TrainTime();C3.ShowTime();return 0; }運行結果:
時分秒 H,M,S是Clock類的私有成員,在Clock類外無法存取,而在TrainTrip類中需要H,M,S的值,因此在Clock類中提供了一個公有的存取H,M,S值的接口函數GetH(),GetM(),GetS()供TrainTrip類讀取H,M,S。
PS:
(1)建立對象時,通過成員類的構造函數對成員對象進行初始化,初始化值在初始化表中提供。
(2)在定義一個組合對象時:
????????? a.成員對象按照在其組合類的聲明中出現的次序依次調用各自的構造函數。
????????? b.組合類對象調用組合類構造函數。
????????? c.調用析構函數,析構函數的調用順序與構造函數相反。
(3)組合類成員對象的訪問權限
| ???????????? 成員對象 組合類 | public | protected | private |
| public | public | 不可訪問 | 不可訪問 |
| protected | protect | 不可訪問 | 不可訪問 |
| private | private | 不可訪問 | 不可訪問 |
???????????????????????????????????????????????????????????? 各個成員對象在組合類中的訪問控制屬性
?
總結
- 上一篇: oracle管理员登录报错,关于Orac
- 下一篇: electron开发_基于Electro