用程序设计术语,多产意味着用较少的人在较少的时间内完成更复杂和更重要的程序。然而,选择语言时确实还有其他问题,例如运行效率(该语言的性质引起代码臃肿吗?)、安全性(该语言能有助于我们的程序做我们计划的事情并具有很强的纠错能力吗?)、可维护性(该语言能帮助我们创建易理解、易修改和易扩展的代码吗?)。
库,简单地说就是一些人已经写的代码,按某种方式包装在一起。通常,最小的包是带有扩展名如L I B的文件和向编译器声明库中有什么的一个或多个头文件。连接器知道如何在 L I B文件中搜索和提取相应的已编译的代码。
1.1声明与定义
首先,必须知道“声明”和“定义”之间的区别,因为这两个术语在全书中会被确切地使用。“声明”向计算机介绍名字,它说, “这个名字是什么意思”。而“定义”为这个名字分配存储空间。无论涉及到变量时还是函数时含义都一样。无论在哪种情况下,编译器都在“定义”处分配存储空间。对于变量,编译器确定这个变量占多少存储单元,并在内存中产生存放它们的空间。对于函数,编译器产生代码,并为之分配存储空间。函数的存储空间中有一个由使用不带参数表或带地址操作符的函数名产生的指针。
1.2抽象数据类型
将数据连同函数捆绑在一起,这一点就允许创建新的类型。这常常被称为封装 [ 1 ]。一个已存在的数据类型,例如 float,有几个数据块,一个指数,一个尾数和一个符号位。我们能够告诉它:与另一个 float 或 int 相加,等等。它有属性和行为。
1.3头文件形式
头文件是存放接口规范的地方。C++中造大项目最好的方法是采用库,收集相关的函数到同一对象模块或库中,并且使用同一个头文件存放所有这些函数的声明。这样可以避免随手在文件中声明一个函数,然后,而在头文件中也声明了一个和这个函数同名同返回值的函数,而编译器只看到这个文件中的函数声明,这样如果程序员忘了,这样可能造成适应错误(本来程序员想着是调用头文件中所调用的函数,结果缺调用了,本函数中生命的函数)。所以,C++中将将所有函数的声明都放在对应的在头文件中。而在定义该函数以及使用该函数的文件中包含此头文件(用于检查该函数的使用以及定义是否与声明一致)。但在头文件中不应该包含通过生成代码或者创建变量而分配存储的任何信息。这是因为头文件一般会包含在项目的几个翻译单元中,如果一个标识符在多于一处被分配存储,那么连接器就会报多次定义的错误。
但是可能会出现多次声明的问题。C++中允许对函数的重声明,只要两个声明匹配即可,但是两者都不允许重声明结构体。所以,一般不将结构体的声明放到头文件中,但是如果一定要放到头文件中,则需要使用预处理器指示的语句来做一定的判断。
1.4全局作用域解析
编译器解释标识符以及函数名时如果有一个局域标识符和全局标示符同名,默认选择局域标识符,所以,为了让编译器选择全局标识符,需要加作用域解析运算符“::“。
1.5总结
在这一章中,我们已经学会了使用 C++ 的基本方法,也就是在结构的内部放入函数。这种新类型被称为抽象数据类型,用这种结构创建的变量被称为这个类型的对象或实例。向对象调用成员函数被称为向这个对象发消息。面向对象的程序设计中的主要活动就是向对象发消息。虽然将数据和函数捆绑在一起很有好处,并使得库更容易使用,因为这可以通过隐藏名字防止名字冲突,但是,还有大量的工作可以使 C + +程序设计更安全。