http://www.runoob.com/cplusplus/cpp-data-encapsulation.html
1 简单样例
class Box
{
public:
double getVolume(void)
{
return length * breadth * height;
}
private:
double length; // 长度
double breadth; // 宽度
double height; // 高度
};
数据封装的实例
C++ 程序中,任何带有公有和私有成员的类都可以作为数据封装和数据抽象的实例。请看下面的实例:
#include <iostream>
using namespace std;
class Adder{
public:
// 构造函数
Adder(int i = 0)
{
total = i;
}
// 对外的接口
void addNum(int number)
{
total += number;
}
// 对外的接口
int getTotal()
{
return total;
};
private:
// 对外隐藏的数据
int total;
};
int main( )
{
Adder a;
a.addNum(10);
a.addNum(20);
a.addNum(30);
cout << "Total " << a.getTotal() <<endl;
return 0;
}
2C++面向对象编程介绍
数据封装是一种把数据和操作数据的函数捆绑在一起的机制,数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制。
面向对象编程(Object Oriented Programming),简称OOP。
在传统的面向过程编程中,数据以及数据的相关操作函数都是分离的独立个体;
对象,如周围的一切其实都是对象;就编程角度,对象包括A)一系列属性(数据);B)一系列操作(函数)。
OOP提供了设计对象的功能,对象包括特性和行为,两者都囊括在一起,共同构成对象实体(即类实体);
对象实体,使程序更模块化,更易读易写,提升了代码重用到一个更高的层次;
对象提供了对数据操作的直接方法,定义了如何与对象进行交互,以及对象之间的交互;
更重要的是,OOP提供了更实用的概念:封装、继承、多态和抽象。
这篇主要讲述封装,即对象将数据及其操作函数封装到一个类实体中。
类和结构体的本质区别之一是类的成员可以使用标识符来控制它们的可访问性;
通常,类的成员变量,加一个前缀'm_'来区分:
3 构造函数Ⅰ
1)构造函数:是类的一种特殊的成员函数,当类被实例化时执行;通常用以初始化成员变量。
构造函数有明确的命名规则:A)函数名必须和类名一样;B)无返回类型(包括void)。
无参构造函数-不带参数的构造函数,是类的默认构造函数:
通常,类都包含一个默认的构造函数,可以初始化成员变量。
含参构造函数-含有参数的构造函数,可以对成员变量赋予指定的值;
以上的两个构造函数,类似重载函数;构造函数必须有唯一的前面(参数个数和参数类型)。
类亦可以只提供含参构造函数,没有默认构造函数:
4 析构函数
析构函数是类的另一种特殊的函数,当类的对象销毁时调用;它和构造函数是成对出现的。
普通的简单类,一般不需要析构函数;因为C++会自动回收垃圾;
如果类中执行了某些动态内存分配,则需要显式定义析构函数,并释放回收垃圾;
析构函数的明确命名规则:A)函数名和类名一样,并前缀'~';B)不能带参数(即意味着只有一个析构函数);C)没有返回类型。
注意动态分配,必须提供析构函数,来回收分配的空间。
5 静态成员函数
不用创建即可以访问
如静态成员变量一样,静态成员函数是属于类的本身,不属于任何类的对象;
如静态成员变量访问一样,可以通过:类名::静态成员来访问类的静态成员变量。
注意:静态成员函数,没有this指针;
例如:
6 类代码和头文件
头文件的使用可达到重用的效果;所以将类的定义放在头文件中,而成员函数放在.cpp中定义;而cpp的名字需和类的名字相同。
Date.h:
Date.cpp:
推荐分离类的定义中的成员函数到类外定义。