您的位置:首页 > 其它

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

2020-04-05 22:56 337 查看

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

 

 

接下来需要学习类的组合

先预习吧,害

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐