当前位置: 首页 > web >正文

C++中一些关于何时何处定义类或函数的问题

模板类、模板函数 ➔ 必须头文件或者当前代码文件中定义,不能在其他的代码文件中定义

内联函数➔须头文件或者当前代码文件中定义,不能在其他的代码文件中定义

非模板、非内联函数➔不能在头文件中定义

大函数、复杂逻辑、非模板普通函数 ➔ 分开声明和定义(.h里声明,.cpp里定义)

1、为什么模板类或模板函数必须在头文件中定义?而不能在其他的代码文件中定义
首先,这里的定义是指写好通用模板的行为,用T作为类型参数;
因为只有在编译器编译过程中遇到模板的实例化(也就是指定了模板使用的具体类型)的时候,编译器才会按照模板定义来生成对应的实现代码,当模板在头文件中定义的时候,在预处理阶段,编译器会把代码文件中包含的头文件内容引入进来,这样在遇到模板实例化的时候,编译器就知道如何根据通用模板类的定义来生成对应的实现,而加入模板的定义放在其他代码文件中,那么本代码文件在遇到模板实例化的语句的时候就找不到模板的定义,就无法生成对应具体类的实现代码;

2、内联函数➔必须头文件或者当前代码文件中定义,不能在其他的代码文件中定义
内联函数为了提高效率,编译器在遇到调用内联函数的时候,会直接用内联函数的函数体的代码直接替换调用内联函数的地方,所以在编译器编译时遇到内联函数时,必须知道内联函数的具体实现代码,否则无法完成替换;

3、非模板、非内联函数➔不能在头文件中定义
非模板、非内联函数如果在头文件中定义的话,在一个程序中,如果有两个及以上的代码文件引入了该头文件,那么在链接阶段的时候会报重复定义的错误;

4、大函数、复杂逻辑、非模板普通函数 ➔ 分开声明和定义(.h里声明,.cpp里定义)
声明的话需要在头文件中声明,这样在代码文件中使用该函数的时候编译器才知道有这么一个函数,定义的话,需要在指定的代码文件中定义,而不能在头文件中定义,具体原因见第三点;

个人简单理解,有误请大佬不吝赐教!

http://www.xdnf.cn/news/3086.html

相关文章:

  • MyBatis、MyBatis-Plus、Hibernate、Spring Data JPA 等 Java 持久层技术的理解和对比
  • C++每日训练 Day 18:构建响应式表单与数据验证(初学者友好)
  • 局域网视频会议软件BeeWorks Meet
  • PocketFlow一个最小的Agent框架
  • ant design pro 项目发布遇到登录页访问404
  • SVMSPro平台获取HTTP-FLV规则
  • 折叠机处理流程
  • 策略梯度(policy gradient)直观理解
  • 文献分享:2023年美国FDA批准的治疗性抗体结构和功能
  • (01)Redis 的订阅发布Pub/Sub
  • 探索语音增强中的多尺度时间频率卷积网络(TFCM):代码解析与概念介绍
  • 【运维心得】银行运维交接的坑
  • 制作一款打飞机游戏33:碰撞体编辑
  • ollama运行qwen3
  • 【Leetcode 每日一题】2962. 统计最大元素出现至少 K 次的子数组
  • 如何对多维样本进行KS检验
  • UNIAPP项目记录
  • 【大厂实战】API网关进化史:从统一入口到智能AB分流,如何构建灰度无感知系统?
  • 【工具变量】上市公司30w+过度负债数据集(2004-2023年)
  • 【嘉立创EDA】如何无限制挖槽,快捷设计挖槽
  • Linux系统配置JDK
  • 哈工大《工程伦理》复习文档
  • 存储过程补充——定义条件、处理程序及游标使用
  • PID速度、电流、位置闭环
  • swagger2升级至openapi3的利器--swagger2openapi
  • Linux 用户管理
  • 数据处理方式 之 对数变换 和Box-Cox变换以及对应逆变换【深度学习】
  • JavaScript基础
  • 使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(1)
  • Qwen3术语解密