c++ primer(version 4)笔记之2.9编写自己的头文件
前面的内容比较简单就不做记录了,就从第二章的末尾2.9节开始记录。
2.9: 编写自己的头文件
1, 头文件只用于声明而不用于定义。
除了三个例外:a,类的定义;b,值在编译时就已经知道的const对象(这也就是为啥const变量默认为是定义该变量的文件的局部变量);c,inline函数。这些实体可以定义在多个源文件中,只要每个源文件中的定义是相同的。
原因解释:编译器需要他们的定义(不只是声明)来产生代码。a,为了产生能定义或者使用类的对象的代码,编译器需要知道组成该类型的数据成员以及在这些对象上可以执行的操作。以我的理解就是说,编译器需要检查你的代码中使用的类的成员函数和数据成员是否合法;b,(摘自CSDN博文)一些const对象定义在头文件中。而const变量要成为常量表达式,初始化式必须为编译器可见。为了能够让多个文件使用相同的值,const变量和它的初始化式必须是每个文件可见的。而要使初始化式可见,一般把这样的const变量定义在头文件中。那样的话,无论该const变量何时使用,编译器都能够看见其初始化式。但是,C++中的任何变量都只能定义一次,定义会分配存储空间,而所有对该变量的使用都关联到同一存储空间。因为const对象默认为定义它的文件的局部变量,所以把它们的定义放在头文件中是合法的。当我们在头文件中定义了const变量后,每个包含该头文件的源文件都有了自己的const变量,其名称和值都一样。当该const变量是用常量表达式初始化时,可以保证所有的变量都有相同的值。但是在实践中,大部分的编译器在编译时都会用相应的常量表达式来替换对这些const变量的使用。所以,在实践中不会有任何存储空间用于存储用常量表达式初始化的const变量。如果const变量不是用常量表达式初始化,那么它就不应该在头文件中定义。相反,和其他的变量一样,该const变量应该在一个源文件中定义并初始化。应在头文件中为它添加extern声明,以使其能被多个文件共享。c,等我看到inline函数这一章,我再添加。
2,预处理器的简单介绍。
#include就是C++的预处理器,预处理器处理程序的源代码,在编译器之前运行。预处理器直接受一个参数:头文件名,其作用是以指定的头文件的内容替换每个#include,其中含有支持分别编译所需要的类定义以及变量和函数的声明。
2.1,头文件经常需要包含其他头文件,比如string头文件,而且,同一头文件可能既被包含在某类的头文件中,又被包含在其cpp文件中,这就要求我们写的头文件被多次包含也不会引起其定义的类和对象的多次定义。使得头文件安全的通用做法是使用预处理器定义头文件保护符(header guard,http://kingphp.blog.163.com/blog/static/20042324420128395434647/)。其用于避免已经见到头文件的情况下重新处理该头文件的内容。
2.2 避免多重包含,即头文件保护符,头文件应该含有保护符,即使这些头文件不会被其他头文件包含。
2.3 使用自定义头文件,头文件的预处理有两种形式:#include <stander_header>和#include "my_file.h"。前者是标注头文件编译器会在预定义的位置(路径环境变量或者命令行选项)查找。后者是非系统文件,其查找开始于源文件所在的路径。
tips:
1,c++是静态类型语言,要在编译时验证表达式使用的类型可以执行该表达式所需要的操作。
2, struct与class都是c++中定义类的关键字,两者的区别在于:1,struct是由C语言继承过来的。2,使用class关键字来定义类时,定义在第一个访问标号(public,private)前的任何成员都隐式指定为private,而使用struct关键字的话,这些成员都是public的。仅仅是这点差别而已,struct定义的类中也是可以定义成员函数的。
本节记录完毕,欢迎讨论~
浙公网安备 33010602011771号