CC++:头⽂件与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修饰的变量
  静态全局变量——可以在任何⽂件中定义,但是该变量只有⽂件作⽤域,即只在定义它的源⽂件中可见,其他源⽂件既不能声明也不能使⽤该变量(因为它对于其他⽂件不可见)。当然,如果是在头⽂件中定义的,则任何包含该头⽂件的⽂件都可以使⽤该静态全局变量。
四、存储类型说明
  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中定义的,但其定义最好相同,否则实际调⽤该内联函数时的运⾏结果将难以预料,有些编译器会根据编译⽂件的先后顺序决定选⽤那个定义来连接)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。