类的使用(类和对象,构造函数和析构函数)
最近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; }
接下来需要学习类的组合
先预习吧,害