1. 程式人生 > >類的使用(類和物件,建構函式和解構函式)

類的使用(類和物件,建構函式和解構函式)

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