抽象与封装
抽象 对一类具体对象进行操作,提炼出这一类对象的公共性质
如人->
数据抽象:身高;性别;年龄……
行为抽象:吃饭;睡觉;穿衣……
抽象方法->封装->类
定义与声明
类的声明
class ClassName
{
数据成员
函数成员
};
举例:时钟类
1.进行抽象:
数据抽象:时、分、秒
行为抽象:设置时间 、显示时间
2.声明类
class Clock
{
int Hour,Minute,Second;//数据成员
//函数成员
void SetTime(int H,int M,int S);
void ShowTime();
};
访问控制
class ClassName
{
public:
公有成员
protected:
保护成员
private:
私有成员
};
一个成员只能有一种访问属性。
完善时钟类:
class Clock
{
public:
void SetTime(int H,int M,int S);
void ShowTime();
private:
int Hour,Minute,Second;
};
访问控制是类与struct的最大区别
3.类的实现
class Clock
{
private:
int Hour,Minute,Second;
public:
void SetTime(int h,int m,int s){
Hour = h;Minute = m;Second = s;
}
void ShowTime(){
cout<<"Current time is "<<Hour<<':'<<Minute<<':'<<Second<<endl;
}
};
像这样,在类内直接定义函数,程序按内联函数来处理。
在类外定义函数:
class Clock
{
public:
void SetTime(int h,int m,int s);
void ShowTime();
private:
int Hour,Minute,Second;
};
void Clock::SetTime(int h,int m,int s){
Hour = h;Minute = m;Second = s;
}
void Clock::ShowTime(){
cout<<"Current time is "<<Hour<<':'<<Minute<<':'<<Second<<endl;
}
类是一种构造性的数据类型,类的变量成为类的实例,或对象。
4.使用类
简单类的实现
以实现int数组为例:
//step1:抽象
成员抽象:
-数组大小
-数组所占的内存区
行为抽象:
-获得数组的大小
-将数据保存在数组中
-获得数组的最大值
-获得数组的最小值
//step2:声明类
class myIntArray {
private:
int* data;
int size;
public:
void setArray(int len, int* in);
int getSize();
int setVal(int pos,int val);
int getMaxVal();
int getMinVal();
};
void myIntArray::setArray(int len, int* in) {
size = len;
data = new int[len];
for (int i = 0; i < len; i++) {
data[i] = in[i];
}
return;
}
int myIntArray::getSize() {
return size;
}
int myIntArray::setVal(int pos, int val) {
if (pos < 0 || (pos > size))
return -1;
data[pos] = val;
return 0;
}
int myIntArray::getMaxVal() {
int max=data[0];
for (int i = 0; i < size; i++) {
if (max < data[i])
max = data[i];
}
return max;
}
int myIntArray::getMinVal() {
int min = data[0];
for (int i = 0; i < size; i++) {
if (min > data[i])
min = data[i];
}
return min;
}
注意到,getMaxVal和getMinVal在逻辑上类似,只是在if判断上相反。
改进:为myIntArray类添加公用的私有函数。
class myIntArray {
private:
int* data;
int size;
int getVal(int condition);
public:
void setArray(int len, int* in);
int getSize();
int setVal(int pos,int val);
int getMaxVal();
int getMinVal();
};
void myIntArray::setArray(int len, int* in) {
size = len;
data = new int[len];
for (int i = 0; i < len; i++) {
data[i] = in[i];
}
return;
}
int myIntArray::getMaxVal() {
return getVal(1);
}
int myIntArray::getMinVal() {
return getVal(-1);
}
int myIntArray::getVal(int condition) {
int Val = data[0];
for (int i = 0; i < size; i++) {
if (condition == 1)
if (Val < data[i])
Val = data[i];
if (condition == -1)
if (Val > data[i])
Val = data[i];
}
return Val;
}