news 2026/3/19 21:27:16

C++,声明和定义,二

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++,声明和定义,二

一个声明就是一个定义,除非 :
·它声明了一个没有具体说明函数体的函数;
·它包含一个extern说明符,并且没有初始化程序或函数体;
·它是一个类定义内的静态类数据成员的声明;
·它是一个类名的声明;
·它是一个typedef声明。

一个定义就是一个声明,除非:
·它定义了一个静态类数据成员;
·它定义了一个non-inline成员函数。

  • 声明:告诉编译器「这个名字存在,它的类型是什么」,仅引入名称到作用域,不分配存储空间、不提供具体实现。
  • 定义:不仅声明名称,还为其分配存储空间(变量)提供具体实现(函数/类),是编译器生成代码、分配内存的依据。

这段话的核心是:声明和定义高度重叠,但有特定例外—— 先默认「声明=定义」,再列例外;再默认「定义=声明」,再列例外。下面逐句拆解,结合例子理解。

一、「一个声明就是一个定义,除非以下5种情况」

这句话的意思是:绝大多数声明会同时完成定义,只有这5种情况,声明仅仅是「声明」,不会成为「定义」。

例外1:声明了没有具体说明函数体的函数
  • 解释:函数声明只告诉编译器「有这个函数」,但没给出函数的具体实现(函数体),因此只是声明,不是定义。
  • 例子:
    voidf();// 仅声明:告诉编译器有个返回void、无参数的函数f,但没说f做什么voidf(){// 声明+定义:既告诉编译器有f,又给出函数体(实现)std::cout<<"hello";}
例外2:包含extern说明符,且无初始化程序(变量)/无函数体(函数)
  • 解释:extern关键字的核心含义是「这个名字的定义在别处」,因此带extern且无初始化/函数体的声明,仅起「告知存在」的作用,不分配内存/不提供实现。
  • 注意:如果extern变量带初始化,或extern函数带函数体,就变成了定义!
  • 例子:
    externinta;// 仅声明:a的定义在其他文件/本文件后续位置externinta=10;// 声明+定义:虽然有extern,但初始化了,分配内存并赋值externvoidf();// 仅声明:f的定义在别处externvoidf(){}// 声明+定义:有函数体,是定义
例外3:类定义内的静态类数据成员的声明
  • 解释:静态类数据成员属于「类级别的资源」,而非对象级,类内仅能声明,不能分配内存(定义),必须在类外单独定义(C++17前)。
  • 例子:
    classA{staticintx;// 仅声明:告诉编译器A有个静态成员x,但不分配内存};intA::x=0;// 定义:为x分配内存并初始化,这才是真正的定义
    (C++17后可加inline让类内定义生效:static inline int x = 0;,此时类内既是声明也是定义)
例外4:类名的声明(前向声明)
  • 解释:仅告知编译器「有这个类/结构体存在」,但未定义其成员(大小、方法、数据),因此只是声明,不是定义。
  • 例子:
    classB;// 仅声明(前向声明):编译器知道B是类,但不知道B有什么structC;// 同理,结构体前向声明也是仅声明classB{// 声明+定义:定义了B的成员,编译器能确定B的大小和布局inty;voidg();};
例外5:typedef声明
  • 解释:typedef只是给已有类型起「别名」,没有定义新类型,也不分配内存,因此仅为声明。
  • 例子:
    typedefintInt;// 仅声明:Int是int的别名,无内存分配,无新类型定义usingInt=int;// C++11的类型别名,和typedef等价,也是仅声明

二、「一个定义就是一个声明,除非以下2种情况」

这句话的核心是:绝大多数定义本身也是声明(因为定义必然先告知编译器「这个名字存在、类型是什么」),但这2种情况中,「定义」是「对已有声明的补充」,而非「新的声明」—— 即定义本身不承担「首次声明」的角色。

例外1:定义了静态类数据成员
  • 解释:静态类数据成员的「首次声明」已经在类内完成,类外的定义只是「为已有声明分配内存/初始化」,因此这个「定义」不再是「新的声明」。
  • 例子:
    classA{staticintx;// 首次声明:这是声明,不是定义};intA::x=0;// 定义:补充实现(分配内存),但不是新的声明(声明已在类内完成)
    这里的int A::x = 0是定义,但它不是「声明」(因为声明已经在类内做了),因此违反「定义就是声明」的默认规则。
例外2:定义了non-inline成员函数
  • 解释:类内的成员函数声明是「首次声明」,类外的non-inline成员函数定义只是「为已有声明提供实现」,因此这个定义不再是「新的声明」。
  • 注意:inline成员函数若在类内定义,既是声明也是定义(符合「定义就是声明」);类外inline定义同理。
  • 例子:
    classA{voidf();// 首次声明:声明了成员函数finlinevoidg(){}// 类内inline定义:既是声明也是定义(符合默认规则)};voidA::f(){}// non-inline定义:仅提供实现,不是新的声明(声明已在类内完成)inlinevoidA::g(){}// 类外inline定义:仍是声明+定义(符合默认规则)
    这里的void A::f() { }是定义,但不是「新的声明」,因此属于例外。

三、总结:核心逻辑与易错点

  1. 默认规则
    • 声明 → 大概率是定义(除非5种例外);
    • 定义 → 大概率是声明(除非2种例外)。
  2. 关键区分
    • 「声明」解决「名字存在吗?类型是什么?」;
    • 「定义」解决「内存在哪里?实现是什么?」。
  3. 易错点
    • extern变量带初始化 = 定义(而非仅声明);
    • 类内静态成员 = 仅声明,类外才是定义(C++17前);
    • 前向声明(class B;)= 仅声明,无法用于创建对象/调用成员(因为编译器不知道布局);
    • non-inline成员函数的类外定义,只是实现,不是新声明。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 21:53:52

显卡驱动深度清理:DDU工具核心技术解析与应用指南

显卡驱动深度清理&#xff1a;DDU工具核心技术解析与应用指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller …

作者头像 李华
网站建设 2026/3/14 7:17:00

Poppler-Windows:Windows系统必备的轻量级PDF处理神器

Poppler-Windows&#xff1a;Windows系统必备的轻量级PDF处理神器 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 在数字文档处理领域&#xff0c;…

作者头像 李华
网站建设 2026/3/13 3:50:50

BBDown:解决B站视频下载难题的终极方案

还在为无法保存B站精彩内容而烦恼吗&#xff1f;当学习资料即将过期&#xff0c;当创作素材难以获取&#xff0c;当喜爱的番剧面临下架&#xff0c;这些痛点正是BBDown要为你解决的核心问题。 【免费下载链接】BBDown Bilibili Downloader. 一款命令行式哔哩哔哩下载器. 项目…

作者头像 李华
网站建设 2026/3/17 21:58:39

Relight:让照片秒变专业光影!AI重新照明工具来了

导语&#xff1a;AI图像编辑领域再添新工具&#xff0c;Relight通过LoRa技术赋能Qwen-Edit模型&#xff0c;实现对照片光影的精准重塑&#xff0c;普通用户也能轻松打造专业级光影效果。 【免费下载链接】Relight 项目地址: https://ai.gitcode.com/hf_mirrors/dx8152/Relig…

作者头像 李华
网站建设 2026/3/10 15:24:15

RLPR-Qwen2.5:无需验证器的AI推理神器

RLPR-Qwen2.5&#xff1a;无需验证器的AI推理神器 【免费下载链接】RLPR-Qwen2.5-7B-Base 项目地址: https://ai.gitcode.com/OpenBMB/RLPR-Qwen2.5-7B-Base 导语&#xff1a;OpenBMB团队推出基于Qwen2.5-7B-Base优化的RLPR-Qwen2.5-7B-Base模型&#xff0c;通过创新的…

作者头像 李华
网站建设 2026/3/14 21:55:27

Kasawaki川崎焊接机器人弧焊气体节约设备

Kasawaki川崎焊接机器人弧焊气体节约设备&#xff1a;WGFACS是焊接技术领域的一项显著创新。该设备专注于提升弧焊过程中的气体使用效率&#xff0c;通过智能化控制和精准调节&#xff0c;大幅减少了气体消耗&#xff0c;从而降低了生产成本&#xff0c;并增强了环保性能。WGFA…

作者头像 李华