作者: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; }
几点说明: