关闭

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

353人阅读 评论(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
查看评论

Thinking in Java 第四章、第五章

Thinking in Java 第四章 第五章
  • xiajw06
  • xiajw06
  • 2015-06-09 09:39
  • 212

Thinking In C++中文版

<br />----------------------- Page 1-----------------------<br /> 下载 <br />        ...
  • liu_hang_yu
  • liu_hang_yu
  • 2011-05-17 07:11
  • 4070

C++(19)类与数据抽象

类 --类的定义和声明【上】 引言:    在C++中,用类来定义自己的抽象数据类型。通过定义类型来对应所要解决的问题中的各种概念,可以使我们更容易编写、调试和修改程序。可以使得自己定义的数据类型用起来与内置类型一样容易和直观。 一个前面曾经定义过的类: ...
  • u011225629
  • u011225629
  • 2015-08-08 19:41
  • 1211

从《thinking in C++》被迫转到《C++ Primer》第一天

今天啃《thinking in C++》有种不能继续下去的感觉,一方面我一看书就停不下来,难懂+没有休息容易困,所以看的速度并不快。另外感觉里边有很多内容在建立在你了解其使用的基础上的理论提升,所以我认识需要补一下基础。在网上查了一下,确定串插着看《C++ Primer》。 《C++ Pr...
  • lihb018
  • lihb018
  • 2014-09-21 22:36
  • 3841

Thinking in C++读书笔记(四)---数据抽象

第四章 数据抽象 1 new--delete: 数组的销毁一定要使用delete [];明确的告知编译器这是一个内存块。 2 C中名字问题:  在C中最大的障碍就是名字冲突。对于函数,C使用单个名字空间,当连接器查找一个函数时,他在一个主表中查找,而且,当编译器白泥臆一个单元时,他只能对带...
  • zhangyang1990828
  • zhangyang1990828
  • 2014-03-08 10:38
  • 985

C++ 数据抽象、数据封装与接口(抽象类)

C++ 数据抽象 数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。 数据抽象是一种依赖于接口和实现分离的编程(设计)技术。 让我们举一个现实生活中的真实例子,比如一台电视机,您可以打开和关闭、切换频道、调整音量、添加外部组件(如喇叭、录像机...
  • oJiMoDeYe12345
  • oJiMoDeYe12345
  • 2015-09-23 15:25
  • 1087

C++编程思想 第四章数据抽象习题

4-2  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include  ...
  • damon1118
  • damon1118
  • 2013-07-21 20:34
  • 415

C++的数据抽象及类的由来

与c相比,c++为什么会有一堆类的概念呢 ? 第2章 数据抽象
  • luojj26
  • luojj26
  • 2016-02-27 22:00
  • 396

c++ 面向对象高效编程 【笔记】什么是数据抽象?

数据抽象
  • sinat_26908721
  • sinat_26908721
  • 2016-11-07 18:57
  • 475

Thinking in C++ (1-5)

 创建和删除对象从技术上讲,OOP的主要领域是抽象数据类型,继承,以及多态,但是其他领域一样很重要,在这一节中我们简单的介绍一下这些内容。尤其重要的是对象创建和删除的方法。对象的数据是保存在哪里的,又是什么在控制着它们的生命周期呢?在这里,不同的编程语言的基本原理各不相同,C++更看重的是...
  • tiandejian
  • tiandejian
  • 2006-07-17 10:48
  • 1311
    个人资料
    • 访问:40298次
    • 积分:867
    • 等级:
    • 排名:千里之外
    • 原创:47篇
    • 转载:0篇
    • 译文:1篇
    • 评论:7条
    最新评论