类的使用(类和对象,构造函数和析构函数)

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

 

 

接下来需要学习类的组合

先预习吧,害

 

posted @ 2020-04-05 22:56  Danzel♂  阅读(854)  评论(0编辑  收藏  举报