C++中一些关于何时何处定义类或函数的问题
模板类、模板函数 ➔ 必须头文件或者当前代码文件中定义,不能在其他的代码文件中定义
内联函数➔须头文件或者当前代码文件中定义,不能在其他的代码文件中定义
非模板、非内联函数➔不能在头文件中定义
大函数、复杂逻辑、非模板普通函数 ➔ 分开声明和定义(.h里声明,.cpp里定义)
1、为什么模板类或模板函数必须在头文件中定义?而不能在其他的代码文件中定义
首先,这里的定义是指写好通用模板的行为,用T作为类型参数;
因为只有在编译器编译过程中遇到模板的实例化(也就是指定了模板使用的具体类型)的时候,编译器才会按照模板定义来生成对应的实现代码,当模板在头文件中定义的时候,在预处理阶段,编译器会把代码文件中包含的头文件内容引入进来,这样在遇到模板实例化的时候,编译器就知道如何根据通用模板类的定义来生成对应的实现,而加入模板的定义放在其他代码文件中,那么本代码文件在遇到模板实例化的语句的时候就找不到模板的定义,就无法生成对应具体类的实现代码;
2、内联函数➔必须头文件或者当前代码文件中定义,不能在其他的代码文件中定义
内联函数为了提高效率,编译器在遇到调用内联函数的时候,会直接用内联函数的函数体的代码直接替换调用内联函数的地方,所以在编译器编译时遇到内联函数时,必须知道内联函数的具体实现代码,否则无法完成替换;
3、非模板、非内联函数➔不能在头文件中定义
非模板、非内联函数如果在头文件中定义的话,在一个程序中,如果有两个及以上的代码文件引入了该头文件,那么在链接阶段的时候会报重复定义的错误;
4、大函数、复杂逻辑、非模板普通函数 ➔ 分开声明和定义(.h里声明,.cpp里定义)
声明的话需要在头文件中声明,这样在代码文件中使用该函数的时候编译器才知道有这么一个函数,定义的话,需要在指定的代码文件中定义,而不能在头文件中定义,具体原因见第三点;
个人简单理解,有误请大佬不吝赐教!