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


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

    接下来需要学习类的组合

    先预习吧,害

  • 相关阅读:
    Django model 常用方法记录
    程序员的注意事项
    硬件天使的使用
    你是否应该成为一名全栈工程师?
    web技术
    6个处理上面代码异味的重构方法(手法)
    git 命定
    ie console报错
    apache 省略index.php访问
    myisam和innodb的区别
  • 原文地址:https://www.cnblogs.com/Danzel-Aria233/p/12639755.html
Copyright © 2020-2023  润新知