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

最近c艹在學類與對象ios

擅長划水的我並無聽課,害,因此東西有點雲裏霧裏,算法

因此寫下這一篇博客來理解一下。函數

 

類的使用就像是封裝一類的東西,定義爲一個類學習

定義的地方和結構體其實仍是有點類似的。spa

這東西在算法裏面用的感受很少,code

之前也沒接觸過,對象

如今發現實際運用仍是頗有意思的。blog


 

首先是定義接口

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類均可以調用;ci

而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;
}

 

 

接下來須要學習類的組合

先預習吧,害

相關文章
相關標籤/搜索