类通常分为以下两个部分:
类的实现细节;
类的使用方式;
当使用类时,不需要关心其实现细节;
当创建一个类时,才需要考虑其内部实现细节;
封
装的基本概念:
根据日常生活中的经验:
并不是类的每个属性都是对外公开的
如:女孩子不希望外人知道自己的年龄和身高;
如:一些男孩子不希望别人知道自己会尿床;
而一些类的属性是对外公开的
如:人类的姓名,学历,国籍等;
因此
,需
要
在类的
表示法中定义属性和行为的公开级别
类似文件系统中文件的权限;
C++中类的封装:
成
员变量
C++
中用于表示类属性的变量;
成
员函数
C++
中用于表示类行为的函数;
在
C++
中可以给成员变量和成员函数定义访问级别
public
成员变量和成员函数可以在类的内部和外界访问和调用;
private
成
员变量和成员函数只能在类的内部被访问和调用;
类成员的作用域:
类成员的作用域都只在类的内部,外部无法直接访问
成
员函数可以直接访问成员变量和调用其它成员函数;
类的外部可以通过类变量访问
public
成员
类成员的作用域与
访
问级别没有关系;
C++中用struct定义的类的所有成员默认为public
类的真正形态:
struct
在
C
语言中已经有了自己的含义,只能继续兼容;
在
C++
中提供了新的关键字
class
用于类定义;
class
和
struct
的用法是完全相同的;
在用
struct
定义类时,所有成员的默认属性为
public
在用
class
定义类时,所有成员的默认属性为
private
一
个运算类的实现:
#ifndef _OPERATOR_H_
#define _OPERATOR_H_
class Operator
{
private:
char mOp;
double mP1;
double mP2;
public:
bool setOperator(char op);
void setParameter(double p1, double p2);
bool result(double& r);
};
#endif
#define _OPERATOR_H_
class Operator
{
private:
char mOp;
double mP1;
double mP2;
public:
bool setOperator(char op);
void setParameter(double p1, double p2);
bool result(double& r);
};
#endif
#include "Operator.h"
bool Operator::setOperator(char op)
{
bool ret = false;
if( (op == '+') || (op == '-') || (op == '*') || (op == '/') )
{
ret = true;
mOp = op;
}
else
{
mOp = '\0';
}
return ret;
}
void Operator::setParameter(double p1, double p2)
{
mP1 = p1;
mP2 = p2;
}
bool Operator::result(double& r)
{
bool ret = true;
switch( mOp )
{
case '/':
if( (-0.000000001 < mP2) && (mP2 < 0.000000001) )
{
ret = false;
}
else
{
r = mP1 / mP2;
}
break;
case '+':
r = mP1 + mP2;
break;
case '*':
r = mP1 * mP2;
break;
case '-':
r = mP1 - mP2;
break;
default:
ret = false;
break;
}
return ret;
}
bool Operator::setOperator(char op)
{
bool ret = false;
if( (op == '+') || (op == '-') || (op == '*') || (op == '/') )
{
ret = true;
mOp = op;
}
else
{
mOp = '\0';
}
return ret;
}
void Operator::setParameter(double p1, double p2)
{
mP1 = p1;
mP2 = p2;
}
bool Operator::result(double& r)
{
bool ret = true;
switch( mOp )
{
case '/':
if( (-0.000000001 < mP2) && (mP2 < 0.000000001) )
{
ret = false;
}
else
{
r = mP1 / mP2;
}
break;
case '+':
r = mP1 + mP2;
break;
case '*':
r = mP1 * mP2;
break;
case '-':
r = mP1 - mP2;
break;
default:
ret = false;
break;
}
return ret;
}
#include <stdio.h>
#include "Operator.h"
int main(int argc, char *argv[])
{
Operator op;
double r = 0;
op.setOperator('/');
op.setParameter(8, 4);
if( op.result(r) )
{
printf("Result is %f\n", r);
}
printf("Press any key to continue...");
getchar();
return 0;
}
#include "Operator.h"
int main(int argc, char *argv[])
{
Operator op;
double r = 0;
op.setOperator('/');
op.setParameter(8, 4);
if( op.result(r) )
{
printf("Result is %f\n", r);
}
printf("Press any key to continue...");
getchar();
return 0;
}
类的精华在于封装
将实现细节和使用方式相分离;
C++
中通过
public
和
private
实现类的封装
public
成员可以通过变量被外界访问;
private
成员只能够在类内部使用;
类的定义和实现可以分开到不同的文件中