7:宏和类与析(构)函数问题!看书真是很难理解入宏怎么就不能操作类的私有数据 茫茫多的问题 第7真是一点都不懂。求高手 详细解答
首先,什么是“类”?“类”在C++中是一段封闭的代码块,小型程序。类(class)是从结构(struct)中发展来的,在C中,结构这种数据模型本来就是希望用于处理类似后来类的思维,只是经典C的语法和构造都无法提供这种实现途径(但很多优秀的程序员已经开发出大量足以仿真的面向对象编程代码,是在传统C面向过程的基础上实现的,虽然本质上似是而非,但其外在表现确实是中规中矩的,早期3.0版本以前的Windows系统就是用这种模式写出来的)。struct是把相关的数据组装在一起作为共同体处理的,正如我前面特意说的学生成绩表例子,就是用struct结构来处理是最合理的,因为此时就是面向一个学生的记录(这其实是数据库中记录的概念,结构体中每个元素就是字段,构造一个此结构体的数组,就是一个数据库表格,行对应记录,列对应字段。事实上,在C++中就明确宣称这些元素为字段),这是从问题本身出发来构造编程模型的例子,亦即所谓的面向对象,对象就是学生成绩表,所有的操作都围绕这个对象进行,包括统计、排序、检索、增加、删除、插入等等。
然而,在C的struct中,只能包括数据,无法包括运算和动作,但正如我们从逻辑上看到的,面向这个学生成绩表的处理功能,就是围绕这个对象的,对这个对象特定的操作,没有理由是全局函数的形式,人家对另外的表,比如课程表,处理办法与此完全不同,那么,按照归类的原则,是谁的功能就归到谁身上,捆绑到一起,数据、函数,全都封装起来,宣告“这是你的”。这就是类,在struct的基础上加入函数,因为我们的大脑和理性思维需要。有人如果宣称死守C拒绝C++的类,那么就意味着他拒绝这种理性处理思维,他要把所有东西零散地堆在桌面上到时再找,并且谁都可以用那些工具以及窥探隐私。那当然,因为C的函数是全局性的,在一个大程序系统中,处理学生档案的模块程序很容易就可以从处理老师的工资模块中提取出老师的工资单,只要他知道那个函数名就可以了。
C程序员用模块文件来分隔逻辑功能,即每个相对独立的模块写在一个.C文件上,一个优秀C程序员的指标之一,是看他写程序时有没有这种划分功能模块的意识。虽然实际上这种形式上分隔并非实际上的,但起码在逻辑上他表现出了条理性,而不是把数万行代码全部放在同一个.C文件中(千万不要觉得这样很厉害)。C++在语言上彻底实现了分隔的目的,不过是把原先C形式上的东西实质化了而已。
C中的struct,数据是公开的,从外部可以很轻易地得到其中元素的值,但C++的class把这个公开性反了过来,默认就是隐藏的,外部无法得到里面东西的值,除非请求它告诉你某个元素的值。这种制度是任何一个组织化的公司、企业、事业单位都遵循的原则——老板没有权力直接指挥员工,他只能通过指挥链一层一层地把指令传达下去,信息也必须同样反馈回来。这就是类的私有性,它来源于C中一对花括号的变量作用域原则。
宏是什么东西呢?宏是编译器在对程序源代码编译时作的文本处理,它就是作文本查找和替换工作的,只要经过第一遍预处理之后的文本,才正式提交作编译处理(编译之后还有连接阶段,最终形成EXE可执行文件,这就是编译三部曲)。在预处理阶段,程序代码的什么功能都是不起作用的,只要是源代码文本文件中的字眼,就无一例外地被处理了。这根本就不是访问数据的问题,而是预处理给你填写数据的问题。#define PI 3.1415926,不过是方便你在程序中写PI比写3.1415926快的多、容易认识得多而已,在预处理后提交给编译程序的文本,在你写PI的地方已经换回3.1415926了。不信你可以在编译时只做预处理看看,它最终把你的源程序弄成什么样子了,那个才是最终的程序代码,嘿嘿嘿嘿~
析构函数是类实体销毁时(类似自动变量在作用时间后消失一样)自动执行的代码,让你有机会把屁股擦干净。这是C架构无法提供的功能,但C程序员要自己写一段代码做同样的事,不过它不会自动执行,要你主动写清楚它在什么时候执行,即显式调用函数。
收到的鲜花