Linux QT编程


前言

封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全。数据封装引申出了另一个重要的 OOP 概念,即数据隐藏。数据封装是一种把数据和操作数据的函数捆绑在一起的机制,数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制,C++ 通过创建类来支持封装和数据隐藏(public、protected、private)。

在 C++程序中,任何带有公有和私有成员的类都可以作为数据封装和数据抽象的实例。通常情况下,我们都会设置类成员状态为私有(private),除非我们真的需要将其暴露,这样才能保证良好的封装性。这通常应用于数据成员,但它同样适用于所有成员,包括虚函数。

一、数据封装

是以狗类为例,增加一个食物的方法 addFood(int number)。将获得食物的方法设定在 public 下,这样 addFood(int number)方法就暴露出来了,也就是对外的接口。然后我们设置狗类的私有成员(private)食物的份数 total。

然后我们还写一个公开的方法 getFood()在 public 下,通过 getFood()来打印出小狗总共获得了几份食物。
新建一个目录 10_encapsulation_example,编辑一个 10_encapsulation_example.cpp 内容如下。

1 #include <iostream>
2 #include <string>
3 using namespace std;
4
5 class Dog
6 {
7 public:
8 string name;
9 
10 Dog(int i = 0)
11 {
12 total = i;
13 }
14 
15 void addFood(int number) {
16 total = total + number;
17 }
18 
19 int getFood() {
20 return total;
21 }
22 private:
23 int total;
24 };
25
26
27 int main()
28 {
29 Dog dog;
30 
31 dog.name = "旺财";
32 
33 dog.addFood(3);
34 dog.addFood(2);
35 
36 cout<<dog.name<<"总共获得了"<<dog.getFood()<<"份食物"<<endl;
37 
38 return 0;
39 }

第 10 至第 13 行,在构造函数里初始化 total 的数量,不初始化 total 的数量默认是随 int 类型的数。所以我们需要在构造函数里初始化,也体现了构造函数的功能,一般是在构造函数里初始化。不要在类内直接赋值初始化。
第 15 至 17 行,addFood(int number),在这个方法里,将获得的食物份数赋值给 total。
第 19 至 21,getFood(),在这个方法里,将返回食物的总份数。通过调用这个方法,即可访问私有成员的 total 总数。
第 33 和 34 行,添加食物的份数。
第 36 行,打印食物的总份数。

然后我们编译运行
Linux系统下imx6ull QT编程—— C++数据封装与数据抽象(八)-LMLPHP

二、数据抽象

数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。数据抽象是一种依赖于接口和实现分离的编程(设计)技术。
数据抽象的好处:

  1. 类的内部受到保护,不会因无意的用户级错误导致对象状态受损。
  2. 类实现可能随着时间的推移而发生变化,以便应对不断变化的需求,或者应对那些要求不改变用户级代码的错误报告。
    举个简单的例子,比如我们生活中的手机。手机可以拍照、听音乐、收音等等。这些都是手机上的功能,用户可以直接使用。但是拍照的功能是如何实现的,是怎么通过摄像头取像然后怎么在屏幕上显示的过程,作为用户是不需要知道的。也就是暴露的不用太彻底,用户也不必须知道这种功能是如何实现的,只需要知道如何拍照即可。就 C++ 编程而言,C++ 类为数据抽象提供了可能。它们向外界提供了大量用于操作对象
    数据的公共方法,也就是说,外界实际上并不清楚类的内部实现。其实像 cout 这个对象就是一个公共的接口,我们不必要知道 cout 是如何在屏幕上显示内容的。cout 已经在底层实现好了。
06-01 03:24