最近c艹在學類與對象 擅長划水的我並沒有聽課,害,所以東西有點雲里霧裡, 所以寫下這一篇博客來理解一下。 類的使用就像是封裝一類的東西,定義為一個類 定義的地方和結構體其實還是有點相似的。 這東西在演算法裡面用的感覺不多, 以前也沒接觸過, 現在發現實際運用還是很有意思的。 首先是定義 class C ...
最近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; }
接下來需要學習類的組合
先預習吧,害