所有的 C++ 程序都有以下两个基本要素:
- 程序语句(代码):这是程序中执行动作的部分,它们被称为函数。
- 程序数据:数据是程序的信息,会受到程序函数的影响。
封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全。数据封装引申出了另一个重要的 OOP 概念,即数据隐藏。
数据封装是一种把数据和操作数据的函数捆绑在一起的机制,数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制。
C++ 通过创建类来支持封装和数据隐藏(public、protected、private)。我们已经知道,类包含私有成员(private)、保护成员(protected)和公有成员(public)成员。默认情况下,在类中定义的所有项目都是私有的。例如:
class Box { public: double getVolume(void) { return length * breadth * height; } private: double length; // 长度 double breadth; // 宽度 double height; // 高度 };
变量 length、breadth 和 height 都是私有的(private)。这意味着它们只能被 Box 类中的其他成员访问,而不能被程序中其他部分访问。这是实现封装的一种方式。
为了使类中的成员变成公有的(即,程序中的其他部分也能访问),必须在这些成员前使用 public 关键字进行声明。所有定义在 public 标识符后边的变量或函数可以被程序中所有其他的函数访问。
把一个类定义为另一个类的友元类,会暴露实现细节,从而降低了封装性。理想的做法是尽可能地对外隐藏每个类的实现细节。
代码示例#include <iostream> #include <stdlib.h> #include <string> using namespace std; /****************************************************** 数据的封装 定义一个Student类,含有如下信息: 1.姓名:name 2.性别:gender 3.学分:score(只读) 4.学习:study(通过可以不断增加学分) ******************************************************/ class Student { public: // 姓名:name void setName(string _name) // 函数功能:设置名字 { m_strName = _name; } string getName()// 函数功能:获取名字,因为有返回值,且返回值类型是string { return m_strName; } // 性别:gender void setGender(string _gender) { m_strGender = _gender; } string getGender() { return m_strGender; } // 学分:score(只读) int getScore() // 函数功能:只读函数,所以只获取,没有set函数 { return m_iScore; } // 初始化学分 void initScore() { m_iScore = 0; } // 学习增加学分 void Study(int _score) { m_iScore += _score; } private: string m_strName; string m_strGender; int m_iScore; }; int main() { Student stu; // 实例化对象 stu stu.initScore(); // 初始化学分为0,如果不初始化的话编译器会随便给它一个值,导致出错 stu.setName("cjj"); // 给姓名赋值 stu.setGender("男"); // 给性别赋值 stu.Study(5); // 学了一门5分的课程 stu.Study(3); // 学了一门分的课程 cout<<stu.getName()<<" "<<stu.getGender()<<" 学分:"<<stu.getScore(); system("pause"); return 0; }