作者:jicanmeng
时间:2014年08月12日
封装(encapsulation)是面向对象程序设计语言的第一个特性,是通过类(class)来实现的。为了说明什么是封装,先看一个程序。
#include <iostream>
using namespace std;
class C2DPoint
{
private:
int m_xPos;
int m_yPos;
public:
void setAxis(int x, int y) {
m_xPos = x;
m_yPos = y;
}
int getXAxis() {
return m_xPos;
}
int getYAxis() {
return m_yPos;
}
};
int main()
{
C2DPoint ptA;
ptA.setAxis(5, 6);
cout << "point axis is (" << ptA.getXAxis() <<
", " << ptA.getYAxis() << ")" << endl;
return 0;
}
编译此文件并运行,看一看运行结果:
[jicanmeng@andy tmp]$ g++ test.cpp
[jicanmeng@andy tmp]$ ./a.out
point axis is (5, 6)
[jicanmeng@andy tmp]$
封装是通过类(class)来实现的。一个类中包含了数据和操作这些数据的函数。所谓的封装,就是将数据和操作数据的函数封装在一起。我们先看一个使用类的c++程序。
在c++中,声明一个类的一般格式如下:
class <类名> //声明部分
{
private:
[<私有型数据和函数>]
public:
[<公有型数据和函数>]
protected:
[<保护型数据和函数>]
};
<各个成员函数的实现> //实现部分
其中,class是类声明的关键字,class后面是要声明的类名。类中的数据和函数都是类的成员,分别称为类的数据成员(variable member)和函数成员(function member)。对于函数成员,有的书或教程也称其为成员函数(member function)。但是我觉得,无论是变量还是函数,都是类的成员。为了保持一致,后面统一称为变量成员和函数成员。其中数据成员又称为类的属性,函数成员又称为类的方法。在定义一个类时,要注意类体中最后一个花括号后面的分号";"不能省略。
在c++语言中,常常将类定义的变量称为一个对象,对象的数据成员称为这个对象的属性,对象的函数成员称为这个对象的方法。
类体中的关键字public,private和protected声明了类中的成员和类外代码的关系,称为访问权限(access specifiers)。对于public类型的成员来说,可以在类外访问,当然也可以在类内访问。对于private成员来说,不能在类外访问,数据成员只能由类中的函数使用,函数成员只允许在类中调用。对于protected成员来说,不能在类外访问,只能在类中或子类中访问。
从类的声明格式可以看出,类的声明分为声明部分和定义部分。通常情况下,我们会将类的声明部分放到一个头文件中,实现部分放到一个cpp文件中。一般情况下,各个函数成员的实现都是放在cpp文件中的。不过,我们也可以将函数成员的实现直接放到类体中,比如上面的示例程序。
如果函数成员的实现是在类体外部完成,那么必须使用作用域运算符"::"来告知编译系统该函数所属的类。此时,函数成员的定义格式如下:
<函数类型> <类名>::<函数名>(<形参表>)
{
……
}
我们再修改一下上面的程序:
#include <iostream>
using namespace std;
class C2DPoint
{
private:
int m_xPos;
int m_yPos;
public:
void setAxis(int x, int y) {
m_xPos = x;
m_yPos = y;
}
int getXAxis();
int getYAxis();
};
void C2DPoint::getXAxis()
{
return m_xPos;
}
void C2DPoint::getYAxis()
{
return m_yPos;
}
int main()
{
C2DPoint ptA;
ptA.setAxis(5, 6);
cout << "point axis is (" << ptA.getXAxis() <<
", " << ptA.getYAxis() << ")" << endl;
return 0;
}
几点说明: