类的封装
实验介绍
封装是类的本身属性,类就是将需要的数据以及函数放在(封装)类内部,使用该类实例化的对象可以使用类内部的数据和函数,通常来说学习一样东西只要问三个问题就可以了。
- why?
- what?
- how?
知识点
- 封装的概念
- 封装的优点
- 类成员的访问权限
为何封装 (why?)
封装是 C++
语言的特点,通过设定访问权限来限制访问和访问方式,也是继承和多态的前提。
- 保证数据不被外界干扰和误用,解决安全性。
- 让类库设计者可以方便更改类的内部,解决维护效率。
- 隐藏细节,代码模块化,使用者不必关心内部实现原理,解决代码重用性。
- 减少耦合(即与其他模块之间资讯或参数流动的程度)。
封装的概念 (what?)
官方定义:封装是将数据和处理数据的程序组合起来,仅对外公开接口,达到信息隐藏的功能。
C++
程序两个基本要素:
- 程序语句(代码):程序中执行动作的部分,也被称为函数。
- 数据:程序的信息。
C++
中使用 class
关键字来对程序进行封装。
所谓的封装就是有选择性的暴露接口给用户,将数据和操作函数绑定在一起的概念,这样能避免受到外界的干扰和误用,从而保证安全。
将程序封装起来后,用户只能通过接口输入信息,得到想要的输出即可,中间的处理过程是不让用户知道(输入数据 --> 程序处理 --> 输出)。
例子 1 :芯片就是用里面的电路封装起来,留出管脚进行操作,这是封装的典型例子。
概念介绍
名词 | 解释 |
---|---|
数据隐藏 | 将程序数据隐藏起来,不让用户直接进行访问 |
数据封装 | 将数据和操作数据的函数绑定在一起的机制 |
数据抽象 | 面向用户保留接口而把具体的实现细节隐藏起来的机制 |
类的访问权限 (how?)
C++
使用关键字 class
来进行封装,使用 public
、protected
、private
关键字表示封装的状态。
关键字
class
:对类进行封装。public
:共有成员,用户能够直接访问类中 public 属性的数据成员和成员函数。protected
:保护成员,用户不能直接访问数据成员和成员函数,继承该类后可以访问。private
:私有成员,用户不能直接访问数据成员和成员函数。
示例代码 1
使用上一章中的示例代码,这里重点来讲解类的权限问题。
cpp
#include <iostream>
#include <string>
using namespace std;
// 将学生的属性进行封装
class Student
{
public: // 公有属性
Student() {}
~Student() {}
void setName(string name) { this->name = name; }
string getName() const { return name; };
void setAge(int age) { this->age = age; }
int getAge() const { return age; }
private: // 私有属性
string name;
int age;
};
int main()
{
// 堆上实例化
Student *stu = new Student;
// 正确访问
stu->setName("Siri");
stu->setAge(5);
// 错误访问,编译报错
// stu->name = "jake";
// stu->age = 18;
// 正确访问
cout << "My name is " << stu->getName() << ", I'm " << stu->getAge() << " years old." << endl;
// 释放内存
delete stu;
stu = nullptr;
return 0;
}
示例代码 2
cpp
#include <iostream>
#include <string>
using namespace std;
class Point
{
// 私有属性
double x;
double y;
public: // 公有属性
Point() {}
~Point() {}
void setX(double x) { this->x = x; }
double getX() const { return x; };
void setY(double y) { this->y = y; }
double getY() const { return y; };
};
int main()
{
// 堆上实例化
Point *point = new Point;
// 正确访问
point->setX(1);
point->setY(5);
// 错误访问,私有成员不能直接访问,编译报错
point->x = 3;
point->y = 9;
// 释放内存
delete point;
point = nullptr;
return 0;
}
示例代码 3
cpp
#include <iostream>
#include <string>
using namespace std;
struct Cat
{
// 公有属性
string name;
Cat() {}
~Cat() {}
void setName(string name) { this->name = name; }
string getName() const { return name; };
};
int main()
{
// 堆上实例化
Cat *cat = new Cat;
// 正确访问
cat->setName("kitty");
// 正确访问,name 属于公有数据成员
cat->name = "siri";
cout << "My name is " << cat->name << " ." << endl;
// 释放内存
delete cat;
cat = nullptr;
return 0;
}
代码解释
- 示例代码 1 中,学生类
private
以下区域的数据成员name
和age
都属于私有数据成员,public
下的成员函数都是属于公有属性。 - 默认情况下,类的成员都是私有属性,例如示例代码 2 中
Point
类的数据成员x
和y
都是属于私有属性。 struct
和class
是类似的功能,但是struct
默认情况下成员都是公有属性,如示例代码 3,struct
一般用于定义数据结构。- 数据成员与成员函数绑定,不能直接对私有数据成员进行访问,如果需要访问数据成员则需要访问对应绑定的公有成员函数。
实验总结
在学习 C++
之初就开始接触 class
、public
、protected
、private
等,本次实验却又单独拿出来讲,这是因为强调 "封装",就像我们经常听一首歌却叫不出歌名一样,现在正式告诉你 "歌名"。