第15课 类与封装的概念——狄泰软件学院

类与封装的概念(上)

类的组合

电脑一般而言是由CPU、内存、主板、键盘和硬盘等部件组合而成。

 

 

 类通常分为以下两个部分

—类的实现细节

—类的使用方式

 

 

 

使用类时不需要关心其实现细节
创建类时才需要考虑其内部实现细节

例:
. 普通用户使用手机
  只需要学习如何发短信,打电话,拍照等等
. 手机开发工程师
  需要考虑手机内部的实现细节

封装的基本概念

封装:字面意思就是将不想被人知道的东西隐藏起来,不对外公开。
—根据经验:并不是类的每个属性都是对外公开的
  如:女孩子不希望外人知道自己的体重和年龄
  如:男孩子不希望别人知道自己的身高和收入

而一些类的属性是对外公开的
  如:人的姓名,学历,国籍等

必须在类的表示法中定义属性和行为的公开级别
  类似于文件系统中文件的权限

C++中类的封装
—成员变量:C++中用于表示类属性的变量
—成员函数:C++中用于表示类行为的函数
—C++中可以给成员变量和成员函数定义访问级别

在程序中如何表示封装这个概念呢?
private和public来表示

.public
  成员变量和成员函数可以在类的内部和外界访问和调用
.private
  成员变量和成员函数只能在类的内部被访问和调用

类与封装的概念(中)

编程实验:

 1 #include <stdio.h>
 2 
 3 #include <stdio.h>
 4 
 5 struct Biology 
 6 {
 7     bool living;
 8 };
 9 
10 struct Animal : Biology 
11 {
12     bool movable;
13     
14     void findFood()
15     { 
16     }
17 };
18 
19 struct Plant : Biology 
20 {
21     bool growable;
22 };
23 
24 struct Beast : Animal 
25 {
26     void sleep() 
27     { 
28     }
29 };
30 
31 struct Human : Animal 
32 {
33     void sleep() 
34     { 
35         printf("I'm sleeping...\n");
36     }
37     
38     void work() 
39     { 
40         printf("I'm working...\n");
41     }
42 };
43 
44 struct Girl : Human
45 {
46 private:   //女生不希望外界知道其的年龄和体重
47     int age;
48     int weight;
49 public:
50     void print()
51     {
52         age = 22;
53         weight = 48;
54         
55         printf("I'm a girl, I'm %d years old.\n", age);
56         printf("My weight is %d kg.\n", weight);
57     }
58 };
59 
60 struct Boy : Human
61 {
62 private:
63     int height;
64     int salary;
65 public:
66     int age;
67     int weight;
68 
69     void print()
70     {
71         height = 175;
72         salary = 9000;
73         
74         printf("I'm a boy, my height is %d cm.\n", height);
75         printf("My salary is %d RMB.\n", salary);
76     }    
77 };
78 
79 int main()
80 {
81     Girl g;
82     Boy b;
83     
84     g.print();
85     
86     b.age = 19;
87     b.weight = 120;
88     //b.height = 180;
89     
90     b.print();
91     
92     return 0;
93 }
View Code

从上面的程序可以看出:

女生的私有变量为age和weight,这两个变量只能在类的内部使用,如果在类的外部使用,就会出错。为什么,因为这是我的隐私,不想让外界来看到我以及使用我。

男生的私有变量为height和salary,这两个变量只能在类的内部使用,如果在类的外部使用,就会出错。为什么,因为这是我的隐私,不想让外界来看到我以及使用我。在这里如果类的外部访问age和weight,是完全ok的,因为它是public的。

这就是封装的体现,这就是访问级别的体现。

类与封装的概念(下)

类成员作用域
类成员的作用域都只在类的内部外部无法直接访问
成员函数可以直接访问成员变量和调用成员函数
类的外部可以通过类变量访问public成员
类成员的作用域与访问级别没有关系
注意:类的作用域仅仅是说明在定义的类里面是可以访问的,不管有没有访问级别它都是这样的,访问级别
仅仅是去防止外面的函数访问内部的成员变量。

C++中用struct定义的类中所有成员默认为public

 1 #include <stdio.h>
 2 
 3 int i = 1;
 4 
 5 struct Test
 6 {
 7 private:
 8     int i;
 9 
10 public:
11     int j;
12         
13     int getI()
14     {
15         i = 3;
16         
17         return i;
18     }
19 };
20 
21 int main()
22 {
23     int i = 2;
24     
25     Test test;
26     
27     test.j = 4;
28     
29     printf("i = %d\n", i);              // i = 2;
30     printf("::i = %d\n", ::i);          // ::i = 1;
31     // printf("test.i = %d\n", test.i);    // 私有变量 Error
32     printf("test.j = %d\n", test.j);    // test.j = 4
33     printf("test.getI() = %d\n", test.getI());  // test.getI() = 3
34     
35     return 0;
36 }
View Code

:: 表是要访问默认命名空间中变量i的值,默认的命名空间是什么?其实就是全局作用域,因此::i = 1。

这个程序告诉我们,对于类而言,它是有作用域的,类的作用域仅仅指的是类的成员变量以及成员函数的作用域。
如果要访问一个类的成员变量或成员函数,必须要通过一个类对象,有了类对象就可以去访问了,但是访问是否成功还需要看
成员变量和成员函数的访问级别了。

小结:
类通常可以分为使用方式内部细节两部分
类的封装机制使得使用方式内部细节相分离
C++中通过定义类成员的访问级别实现封装机制
public成员可以在类的内部和外界访问和调用
private成员只能在类的内部被访问和调用

 

 

posted @ 2019-09-28 21:04  一代枭雄  阅读(304)  评论(0编辑  收藏  举报