类与封装的概念(上)
类的组合
电脑一般而言是由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... "); 36 } 37 38 void work() 39 { 40 printf("I'm working... "); 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. ", age); 56 printf("My weight is %d kg. ", 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. ", height); 75 printf("My salary is %d RMB. ", 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 }
从上面的程序可以看出:
女生的私有变量为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 ", i); // i = 2; 30 printf("::i = %d ", ::i); // ::i = 1; 31 // printf("test.i = %d ", test.i); // 私有变量 Error 32 printf("test.j = %d ", test.j); // test.j = 4 33 printf("test.getI() = %d ", test.getI()); // test.getI() = 3 34 35 return 0; 36 }
:: 表是要访问默认命名空间中变量i的值,默认的命名空间是什么?其实就是全局作用域,因此::i = 1。
这个程序告诉我们,对于类而言,它是有作用域的,类的作用域仅仅指的是类的成员变量以及成员函数的作用域。
如果要访问一个类的成员变量或成员函数,必须要通过一个类对象,有了类对象就可以去访问了,但是访问是否成功还需要看
成员变量和成员函数的访问级别了。
小结:
类通常可以分为使用方式和内部细节两部分
类的封装机制使得使用方式和内部细节相分离
C++中通过定义类成员的访问级别实现封装机制
public成员可以在类的内部和外界访问和调用
private成员只能在类的内部被访问和调用