关闭

Thinking in C++ 第四章 数据抽象

325人阅读 评论(0) 收藏 举报
分类:

此为第四章内容 :数据抽象

4.1一个袖珍的C库

4.1.1动态存储分配

在标准C中,动态内存分配函数包括malloc(),calloc(),realloc()和free(),c++使用关键字new、delete。new表达式返回指向所请求的准确类型对象的指针,如果声称new int,返回指向一个int的指针。delete关键字是new对应的关键字,任何由new分配的内存块必须用delete释放(如果忘记使用delete,这个内存块即不能用,这叫内存泄露 memory leak),释放数组的格式为 delete [ ] myArray; 如果程序反复分配和释放堆存储,最终产生大量的空闲内存碎片,但却没有足够大的块能分配所需要的内存。可以使用特殊的内存句柄(handle)。

c++有严格的类型检查,它不允许直接向其他类型赋void*(c允许)

4.1.2有害的猜测

调用没有声明的函数在C中是可以的,但是在C++中不行。

4.2哪儿出问题

在C中,使用库的最大障碍之一就是名字冲突(name clashes)

4.3基本对象

c++中有一个新的运算符(::),即作用域解析运算符。

在C和C++之间有以下不同:首先,头文件中的声明是由编译器要求的,在C++中,不能调用未事先声明的函数,否则编译器将报告一个出错信息。必须在定义和使用之前声明结构,最习惯放置结构定义的位置在头文件中。

C++允许将任何类型的指针赋给void*,但不允许将void指针赋给任何其他类型的指针。

require.h文件里面包含检查文件的一个函数assure(),它检查这个文件是否已经成功的打开了,如果没有,它就报告一个标准错误,告诉这个文件并不能打开并且退出程序。

4.4什么是对象

struct是数据的凝聚,它将数据捆绑在一起,使得我们可以将它们看出一个包。函数也放在这个包内,结构变成新的创造物了,既能描写属性,又能描写行为,这就是对象的概念。

对象是一个独立的捆绑的实体,有自己的记忆和活动。

4.5抽象数据类型

将数据连同函数捆绑在一起的能力可以用于创建新的数据类型,这常称为封装(encapsulation).

object.member function(arglist)是对一个对象“调用一个成员函数”,在面向对象的语法中,称之为“向一个对象发送消息”。

4.6对象细节

4.7头文件形式

希望将接口(声明)和实现(成员函数的定义)隔离开来。头文件告诉编译器在我们的库中哪些是可用的。头文件是存放接口规范的地方。任何成员函数必须在struct声明中声明,不能把它放在其他地方。

4.7.1头文件的重要性

如果将所有的函数声明放在一个头文件中,并且将这个头文件包含在使用这些函数和定义这些函数的任何文件中,就能确保在整个系统中声明的一致性。通过将这个头文件包含在定义文件中,还可以确保声明和定义匹配。在C++中,如果在一个头文件中声明了一个struct,我们在使用struct的任何地方和定义这个struct成员函数的任何地方必须包含这个头文件。如果不经声明就调用常规函数,调用或定义成员函数,C++编译器会给出错误信息。通过强制正确地使用头文件,语言保证库中的一致性,并通过在各处强制使用相同的接口,可以减少程序错误。 

头文件是我们和我们的库的用户之间的合约。这份合约描述了我们的数据结构,为函数调用规定类参数和返回值。

正确的组织代码和编写有效的头文件,需要考虑几个问题。第一个问题涉及应当放什么到头文件中,基本原则是只限于声明,即只限于对编译器的信息,不涉及通过生成代码或创建变量而分配存储的任何信息。C++的一次定义规则:可以对事物声明任意多次,但是对于每个事物只能实际定义一次。

4.7.2 多次声明问题

头文件的第二个问题是:如果把一个struct声放在一个头文件中,就有可能在一个编译程序中多次包含该头文件。编译器认为重声明结构是一个错误。C/C++都允许重声明函数只要2个声明匹配即可,但是二者都不允许重声明结构。

4.7.3预处理指示#define、#ifdef、#endif

4.7.4头文件的标准

防止多次包含的这些预处理器语句常称为包含守卫(include guard)。

4.7.5 头文件中的名字空间

不要在头文件中放置使用命令

4.7.6在项目中使用头文件

一般将每个类型或一组相关类型的声明放在一个单独的头文件中,然后再一个处理单元中定义这个类型的函数。当使用这个类型时必须包含头文件,执行正确的声明。

4.8嵌套结构

这个结构用简单链表方式实现了一个下推栈(push-down stack)

4.8.1全局作用域解析

4.9小结

结构的这种新类型称为抽象数据类型(abstract data type),用这种结构创建的变量称为这个类型的对象(object)或实例(instance)。调用对象的成员函数称为向这个对象发消息(sending a message)。在面向对象的程序设计中的主要动作就是向对象发送消息。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31460次
    • 积分:767
    • 等级:
    • 排名:千里之外
    • 原创:46篇
    • 转载:0篇
    • 译文:1篇
    • 评论:4条
    最新评论