封装性:封装是面向对象方法的一个重要原则,是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体。封装有两个含义:结合性,即将属性和方法结合(也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员);信息隐蔽性,利用接口机制隐蔽内部细节。因此封装的目的在于将对象的使用者和设计者分开,以提高软件的可维护性和可修改性。
例如,在抽象的基础上,我们可以将学生的数据和功能封装起来,构成一个学生类.如下:
class Student
{
private: //私有成员,外部无法访问
int Num;
string Name;
float Score;
public: //公有成员,外部借口
void Create();
int Search(int n);
void Display();
}
可以看到通过封装使一部分成员充当类与外部的接口,而将其他的成员隐蔽起来,这样就达到了对成员访问权限的合理控制,使不同类之间的相互影响减少到最低限度,进而增强数据的安全性和简化程序的编写工作。
各种角度看封装
用户:我只需要个能用的,能升级的产品.
客户程序员:我需要的是可扩展的,封装的,插件式的库,这个库的东西不能影响到程序框架中的其他部分.
库程序员:给客户程序员一个接口和一个二进制级别的代码。以实现可扩充行和可重用性.
内存:对我而言没有封装,计算机的一个基本概念,越往底层限制的东西越少.
编译器:我编译出来的代码要具有封装性,必须处理我和同行之间的差异.
C++语言:无辜的我是用来限制程序员的。但是也可以使用我的巧妙规则来提高你的水平,来实现你所需要的重用和扩充性.
下面是一个学生类的完整代码,希望借此理解C++的封装性其实就是通过类和对象以及其访问权限的设定实现的。
/*main.cpp*/
#include <iostream>
#include "action.h"
using namespace std;
int main(int argc,char *argv[])
{
Student stu[5];
cout <<"请输入学生学号, 成绩: "<< endl;
for(int i=0;i<5;i++)
{
cout <<"第"<< i+1 <<"位同学: ";
stu[i].Create();
}
for(int i=0;i<5;i++)
stu[i].Display();
int n, flag=0;
cout <<"请输入要查找同学学号:";
cin >> n;
for(int i=0;i<5;i++)
{
if(stu[i].Search(n)==1)
{
stu[i].Display();
flag=1;
break;
}
else if(i==4)
cout<<"没有找到该学生!"<< endl;
}
return 0;
}
/*action.cpp*/
#include <iostream>
#include "action.h"
using namespace std;
void Student::Create()
{
cin >> Name >> Num >> Score;
}
int Student::Search(int n)
{
if(Num==n)
return 1;
else
return 0;
}
void Student::Display()
{
cout <<"姓名: "<< Name <<"学号: "<< Num <<"成绩: "<< Score << endl;
}
/*action.h*/
#ifndef ACTION_H
#define ACTION_H
#include <iostream>
using namespace std;
class Student
{
private:
string Name;
int Num;
float Score;
public:
void Create();
int Search(int n);
void Display();
};
#endif