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

2023-05-16

一、头文件

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中定义的,但其定义最好相同,否则实际调用该内联函数时的运行结果将难以预料,有些编译器会根据编译文件的先后顺序决定选用那个定义来连接)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • JVM 垃圾回收机制

    JVM体系结构概览 xff1a 垃圾回收 xff08 GC xff09 发生在哪个区 xff1a heap xff08 堆 xff09 区 GC是什么 xff1f 分几种 xff1a GC 分代收集算法 次数上频繁收集young区 xff0
  • JAVA 自定义注解

    多说无益 xff0c 直接上代码 import java lang annotation Documented import java lang annotation ElementType import java lang annotat
  • Vuex 学习

    什么是vuex xff1a 专门在Vue中实现集中式状态 xff08 数据 xff09 管理的一个Vue插件 xff0c 对vue应用中多个组件的共享状态进行集中式的管理 xff08 读 写 xff09 xff0c 也是一种组件间通信的方式
  • zookeeper本地安装启动

    下载zookeeper xff1a 链接 xff1a https pan baidu com s 151ZdXYg6QDB A8TRK0wrpw 提取码 xff1a yyds 复制到linux上并解压修改配置文件的名字 xff0c 将 zo
  • zookeeper集群安装

    准备3台服务器 xff0c 安装三个zookeeper xff0c 修改zoo cfg配置 xff0c dataDir 61 opt module zookeeper 3 5 7 zkData 分别在zkData目录下创建一个文件myid
  • zookeeper 启动停止脚本

    bin bash case 1 in 34 start 34 for i in 192 168 66 133 192 168 66 134 192 168 66 129 do echo zookeeper i 启动 ssh i 34 opt
  • ElasticSearch-全文检索

    docker 下载安装 es镜像 docker pull elasticsearch 7 4 2 es的可视化工具 docker pull kibana 7 4 2 mkdir p mydata elasticsearch config m
  • atoi()和stoi()的区别----数字字符串的处理

    相同点 xff1a 都是C 43 43 的字符处理函数 xff0c 把数字字符串转换成int输出 头文件都是 include lt cstring gt 不同点 xff1a atoi 的参数是 const char 因此对于一个字符串str
  • ROS基础教程--CostMap_2D包的一些理解

    本文是在综合了多篇文章的基础之上进行的综合 1 基本概念 Voxel xff1a 体素 xff0c 即顾名思义是体积的像素 用来在三维空间中表示一个显示基本点的单位 类似于二维平面下的pixel xff08 像素 xff09 voxel是三
  • [move_base-24] process has died [exit code -6, cmd lib/move_base/move_base odom:=mobile_base_control

    尝试使用TIAGo机器人进行SLAM时 xff0c 运行 roslaunch tiago 2dnav gazebo tiago mapping launch public sim 61 true 指令时加载TIAGo机器人失败 xff0c
  • geoserver集群搭建及数据共享设置

    Geoserver版本及所需依赖 geoserver 2 16 0geoserver 2 16 SNAPSHOT jms cluster plugingeoserver 2 16 SNAPSHOT activeMQ broker plugi
  • postgresql 9.5 now()函数少8小时

    select now 时获取的时间比系统时间少8小时 xff0c 时区问题 xff0c 可能是postgresql conf中的log timezone timezone没有配置成 PRC SELECT now AT TIME ZONE 3
  • sld样式文件demo

    标注样式为 xff1a 代码为 xff1a lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt StyledLayerDescriptor xmlns 61 34 http w
  • 清理Linux buffer/cache内存的方法

    解决Linux buffer cache内存占用过高的办法 xff08 转载 xff09 Linux中Cache内存占用过高解决办法 xff08 转载 xff09
  • windows10下修改Docker镜像目录

    1 背景需求 Windows 版本 xff08 Windows 10 wsl 2 xff09 docker 默认程序安装到c盘 xff0c 数据存储于C Users 当前用户名 AppData Local Docker wsl data e
  • conda 创建的 python 虚拟环境中安装 gdal

    在 conda 创建的Python虚拟环境中安装 gdal 可以按照以下步骤 xff1a 1 打开Anaconda Prompt或者终端 xff0c 激活创建的虚拟环境 xff0c 比如 xff1a conda activate your
  • Ubuntu远程部署及访问jupyter

    一 Ubuntu下安装jupyter notebook 创建虚拟环境 conda create n myjupyter python 61 3 9 激活虚拟环境 conda activate myjupyter 安装jupyter pip
  • postgresql 日志配置

    配置文件日志部分参数说明 REPORTING AND LOGGING Where to Log log destination 61 39 stderr 39 Valid values are combinations o
  • Postgresql 14配置文件解释说明

    Postgresql 14配置文件postgresql conf的解释说明 Postgresql 14配置文件 xff0c 配置项翻译及解释说明 suntoon 64 postgres14 data sudo nano postgresql
  • C++标准库之迭代器

    迭代器是对指针进行进一步抽象的产物 迭代器是遍历所有容器 xff08 序列 xff09 流的统一界面 xff0c 是标准库泛形算法的基础 迭代器根据其能力分为五种 xff1a categorypropertiesvalid expressi

随机推荐