類的使用(類和對象,構造函數和析構函數)

最近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;  }

 

 

接下來需要學習類的組合

先預習吧,害