C/C++:头文件与cpp文件的声明/定义

一、头文件

1、 一般来说,头文件仅仅用于声明,相应的定义要放在对应的cpp文件中。
  声明的内容一般可以是:1. 类定义体;2.类中的成员方法; 3. 类外的函数; 4. 类外的变量;5. 类型。
  一个文件(比如main.cpp)包含(#include)了一个头文件(比如item.h),就相当于声明了Item.h中声明的所有内容。
2、但是const常量,inline函数,static函数都可以在头文件中定义

二、cpp文件

        用于定义;
        定义的内容一般可以是:1、类的成员方法;2、类的静态变量;3、类外的函数;4、类外的变量;

三、各种内容的定义总结

  1. 类:类一般只在头文件中定义,在cpp中实现其成员方法的定义。

  2. 类中的成员包括:普通成员方法, static成员方法,普通成员变量,static成员变量,const成员变量,static const成员变量等。
  普通成员方法——类内部声明;可以在“类内部/头文件中的类外部”定义(均看作inline);也可以放在cpp中定义(非inline);
  static成员方法——类内部声明;可以在“类内部/cpp中”定义,不能再“头文件中的类外部”定义。在类外部定义的时候要去掉static关键字,因为类里面的static表示该成员属于类,而文件中的static表示文件作用域,这是完全两回事。
  普通成员变量——类内部声明和定义;只能在构造函数的初始化列表中初始化,用户可以不进行初始化(编译器将默认构造)。
  const成员常量——类内部声明;只能在构造函数的初始化列表中初始化,而且用户必须自行初始化;
  static成员变量——类内部声明;只能在cpp中的各方法外部定义(且不能加static关键词,原因同static成员方法),定义时可以不进行初始化,这时默认为0(也可以不定义,但若使用到了该成员变量,则必须定义,否则连接出错);
  static const整型成员变量——基本同static;特别之处在于,static const整型成员变量是唯一可以在定义的时候(即类内部)直接初始化的类成员变量;注:static 和static const不能在构造函数初始化列表中初始化,因为static关键字表明,它属于类,而不是属于对象。

      3、类外的函数
  普通函数——只能在cpp中定义;头文件中可以声明,不可以定义;其他文件中用到的时候要先声明一下(可以用extern关键字,也可以不用);若写在命名空间外面,则为全局作用域。但函数的参数的default值只具有文件作用域,且在一个文件中同一个参数只能声明一次default值。
      static函数——可以在任何文件定义,但在cpp中定义的静态函数对于其他文件不可见,而在头文件中定义的静态函数在包含该头文件的文件中可见;可以看出,static函数具有文件作用域。
      内联函数——最好只在头文件中定义。因为同一原形(实现可能不同)的内联函数可以在不同的cpp中重复定义,但是编译器会把这些原形看作一个内联函数,因此运行时会出现不确定现象。放在头文件中可以避免这种情况。而且放在cpp中的内联方法对于其他文件是不可见的。

  4、类外的变量
  const常量——可以在头文件/cpp中定义,且定义时必须初始化;对于编译时期可以直接用文字来替换使用到的该常量的情况(例如:const int/float等),最好在头文件中定义;但有些情况(如const int *ptr = new int[5]),最好在cpp中定义,因为动态空间只有运行时才能确定,编译器并不能用常量值直接代替ptr;且头文件在多处被引用后可能带来内存泄露、异常行为等。const在C++中具有文件作用域。在C中不是。
  全局变量——只能在cpp中定义;头文件和其他文件中可以声明(需要extern关键字),不可以定义;其他文件中用到的时候必须先声明一下。具有全局作用域。
  静态全局变量——可以在任何文件中定义,但是该变量只有文件作用域,即只在定义它的源文件中可见,其他源文件既不能声明也不能使用该变量(因为它对于其他文件不可见)。当然,如果是在头文件中定义的,则任何包含该头文件的文件都可以使用该静态全局变量。

四、存储类型说明

  static, const, 和inline——————
  相同点:
  static, const, inline都可以在任何文件中定义,并可以在不同的文件域范围内多次定义默认为静态存储类型(生命期为整个程序期间),且都具有文件作用域(仅在定义出现的文件中可见);但在同一个文件域中,只能定义一次(可以声明多次,静态变量声明时要去掉static,const常量声明时必须有const,inline);
  区别:
  但const 只能修饰变量,inline只能修饰函数;static既可以修饰变量又可以修饰函数(因此可以推知static const只能修饰变量,static inline只能修饰函数)。
  static只能在一个文件中声明和定义,其作用域也局限于该文件;const和inline都可以在头文件中声明(必须有显示的extern关键字),而在包含该头文件的cpp中定义(若有多个cpp包含该头文件,则这个const常量或inline方法只能在一个cpp中定义,否则连接时将难以确定使用哪个定义。注:实际上inline是可以在几个包含同一个头文件的cpp中定义的,但其定义最好相同,否则实际调用该内联函数时的运行结果将难以预料,有些编译器会根据编译文件的先后顺序决定选用那个定义来连接)。

 

posted @ 2016-05-14 19:08  PhiliAI  阅读(4602)  评论(0编辑  收藏  举报