類的使用(類和物件,建構函式和解構函式)
阿新 • • 發佈:2020-04-06
最近c艹在學類與物件
擅長划水的我並沒有聽課,害,所以東西有點雲裡霧裡,
所以寫下這一篇部落格來理解一下。
類的使用就像是封裝一類的東西,定義為一個類
定義的地方和結構體其實還是有點相似的。
這東西在演算法裡面用的感覺不多,
以前也沒接觸過,
現在發現實際運用還是很有意思的。
首先是定義
class Clock{ public: void showtime(); void settime(int a,int b,int c); private: int hour,minute,second; protected: }; /* class 類的名稱{ public://外部介面 公有成員 private: 私有成員 protected: 保護型成員 }; */
public是外部介面,公有成員,就是所有部分都可以去呼叫的,就是整個程式的Clock形式的class類都可以呼叫;
而private是私有成員,只能允許內部的成員進行使用和調動,外部無法呼叫。
簡單來說就是,假如定義了Clock c;c.公有成員()是合法的,而c.私有成員()是無效的。
成員函式的實現
void Clock::showtime(){ cout<<hour<<":"<<minute<<":"<<second<<endl; } /* 返回值 類名::函式成員名(引數表) { 函式體 }*/
內聯成員函式
有兩種宣告方式
- 隱式宣告方式
-
class Clock{ public: void showtime(); void settime(int a,int b,int c){ hour=a; minute=b; second=c; } private: int hour,minute,second; protected: };
settime函式就是隱式宣告
- 顯式宣告方式
-
class Clock{ public: void showtime(); void settime(int a,int b,int c); private: int hour,minute,second; protected: }; inline void Clock::settime(int a,int b,int c){//顯式 hour=a,minute=b,second=c; }
建構函式
建構函式是在類建立之初自己生成的,預設的
還是以clock為例子來說明一下
class Clock{ public: Clock(int a,int b,int c);//建構函式 Clock(){//建構函式 hour=0;minute=0;second=0; } void showtime(); void settime(int a,int b,int c); private: int hour,minute,second; }; Clock::Clock(int a,int b,int c){ hour=a,minute=b,second=c; } //其他成員函式略 int main(){ Clock c1(1,1,1);//呼叫了 有引數 的建構函式 Clock c2; //呼叫了 無引數 的建構函式 //其他略 }
ps:如果類裡面沒有無引數建構函式的那一句話,則 Clock c2是會報錯的;
複製建構函式/拷貝建構函式
class 類名{ public: 類名(形參表); //建構函式 類名(類名 &物件名);//拷貝建構函式 ...... }; 類名::類名(類名 &物件名){//拷貝建構函式的實現 函式體 }
拷貝建構函式有3種呼叫方式:
(暫時未梳理,先空出來)
解構函式
解構函式和建構函式都是直接預設存在的
解構函式的進行清理的,完成物件被刪除前的清理工作;
class Clock{ ..... ~Clock();//解構函式 };
- 解構函式不接受任何引數
- 被刪除前是會自動清理的,~clock解構函式可以用在需要提前清理的時候 (感覺和return break類似)
以一個體型來儘量用到所用的以上知識
例4-3
一個圓形游泳池周圍需要建圓形過道
在圓形過道外圍圍上柵欄
柵欄價格為35元/米
過道的建造價格為20元/平方米
過道的寬度為3米
游泳池半徑由鍵盤輸入
/* 例4-3 一個圓形游泳池周圍需要建圓形過道 在圓形過道外圍圍上柵欄 柵欄價格為35元/米 過道的建造價格為20元/平方米 過道的寬度為3米 游泳池半徑由鍵盤輸入 */ #include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> #include<queue> #include<utility> #include<stack> #include<cstdlib> #define ll long long #define inf 0x3fffffff #define pi 3.1415926535 #define concrete_price 20 #define fence_price 35 #define length 3 using namespace std; class price{ //類的定義 用來解決費用 private: //私有資料成員(僅供內部呼叫 double cir,area; public: //外部介面 or 公有成員 price(double c,double a){ //內聯建構函式隱式宣告 cir=c,area=a; } double buy_concrete(); double buy_fence(){ //內聯成員函式隱式宣告 return area*concrete_price; } }; inline double price::buy_concrete(){ //內聯成員函式顯式宣告 return cir*fence_price; } class circle{ //類的定義 用來解決面積和周長 private: double radius; double real_area(){ //私有成員函式 計算實際面積 double r=radius; double R=radius+3; double s1=pi*r*r; double s2=pi*R*R; return s2-s1; } public: circle(double r); //建構函式 circle(){ //建構函式 初始化私有成員的值 radius=0; } circle(circle &C); //拷貝建構函式 or 複製建構函式 double make_circumference(); double make_area(); ~circle(){}; //解構函式 (後面跟著的 {} 不能少) 用於刪除資料,做清理工作 }; circle::circle(double r){ //建構函式的實現 radius=r; } circle::circle(circle &C){ //拷貝建構函式的實現 radius=C.radius; } double circle::make_circumference(){ //成員函式的實現 return 2*pi*(radius+3); } double circle::make_area(){ //成員函式的實現 return real_area(); } int main(){ int r; cin>>r; circle Circle(r); //建構函式初始化半徑的值 circle c1=Circle; //拷貝建構函式的呼叫來初始化值 circle c2; //建構函式直接初始化為0 double c_a=c1.make_area(); double c_c=c1.make_circumference(); cout<<c_c*fence_price<<endl<<c_a*concrete_price; price ans(c_c,c_a); //初始化建構函式的值 cout<<"柵欄價格:"<<ans.buy_fence()<<endl; cout<<"過道價格:"<<ans.buy_concrete()<<endl; return 0; }
接下來需要學習類的組合
先預習吧,害
&n