首页技术它的函数原型在头文件?考虑下面的函数原型声明:void test

它的函数原型在头文件?考虑下面的函数原型声明:void test

编程之家2026-06-181046次浏览

大家好,今天小编来为大家解答以下的问题,关于它的函数原型在头文件,考虑下面的函数原型声明:void test这个很多人还不知道,现在让我们一起来看看吧!

它的函数原型在头文件?考虑下面的函数原型声明:void test

C++的头文件和实现文件分别写什么

在C++编程过程中,随着项目的越来越大,代码也会越来越多,并且难以管理和分析。于是,在C++中就要分出了头(.h)文件和实现(.cpp)文件,并且也有了Package的概念。对于以C起步,C#作为“母语”的我刚开始跟着导师学习C++对这方面还是感到很模糊。虽然我可以以C的知识面对C++的语法规范,用C#的思想领悟C++中类的使用。但是C#中定义和实现是都在一个文件中(其实都是在类里面),而使用C的时候也只是编程的刚刚起步,所写的程序也只要一个文件就够了。因此对于C++的Package理解以及.h文件和.cpp文件的总是心存纠结。幸好导师有详细的PPT让我了解,一次对于Package的认识就明白多了。简单讲,一个Pack age就是由同名的.h和.cpp文件组成。当然可以少其中任意一个文件:只有.h文件的Packag e可以是接口或模板(template)的定义;只有.cpp文件的Package可以是一个程序的入口。当然更具体详细的讲解,欢迎下载导师的教学PPT-Package来了解更多。不过我在这里想讲的还是关于.h文件和.cpp文件知道Package只是相对比较宏观的理解:我们在项目中以Package为编辑对象来扩展和修正我们的程序。编写代码时具体到应该把什么放到.h文件,又该什么放在.cpp文件中,我又迷惑了。虽然Google给了我很多的链接,但是大部分的解释都太笼统了:申明写在.h文件,定义实现写在.cpp文件。这个解释没有差错,但是真正下手起来,又会发现不知道该把代码往哪里打。于是我又把这个问题抛给了导师,他很耐心地给我详详细细地表述了如何在C++中进行代码分离。很可惜,第一次我听下了,但是没有听太懂,而且本来对C++就了解不深,所以也没有深刻的印象。经过几个项目的试炼和体验之后,我又拿出这个问题问导师,他又一次耐心地给我讲解了一遍(我发誓他绝对不是忘记了我曾经问过同样的问题),这次我把它记录了下来。为了不再忘记,我将它们总结在这里。概览非模板类型(none-template)模板类型(template)头文件(.h)全局变量申明(带extern限定符)全局函数的申明带inline限定符的全局函数的带inline限定符的全局模板函数的申明和定义非模板类型(none-template)模板类型(template)定义类的定义类函数成员和数据成员的申明(在类内部)类定义内的函数定义(相当于i nline)带static const限定符的数据成员在类内部的初始化带inline限定符的类定义外的函数定义模板类的定义模板类成员的申明和定义(定义可以放在类内或者类外,类外不需要写inline)实现文件(.cpp)全局变量的定义(及初始化)全局函数的定义(无)类函数成员的定义类带static限定符的数据成员的初始化*申明:declaration*定义:definitio头文件头文件的所有内容,都必须包含在#ifndef{Filename}#define{Filename}//{Content of head file}#endif这样才能保证头文件被多个其他文件引用(include)时,内部的数据不会被多次定义而造成错误 inline限定符在头文件中,可以对函数用inline限定符来告知编译器,这段函数非常的简单,可以直接嵌入到调用定义之处。当然inline的函数并不一定会被编译器作为inline来实现,如果函数过于复杂,编译器也会拒绝inline。因此简单说来,代码最好短到只有3-5行的才作为inline。有循环,分支,递归的函数都不要用做inline。对于在类定义内定义实现的函数,编译器自动当做有inline请求(也是不一定inline的)。因此在下边,我把带有inline限定符的函数成员和写在类定义体内的函数成员统称为“要inline的函数成员”非模板类型全局类型就像前面笼统的话讲的:申明写在.h文件。对于函数来讲,没有实现体的函数,就相当于是申明;而对于数据类型(包括基本类型和自定义类型)来说,其申明就需要用extern来修饰。然后在.cpp文件里定义、实现或初始化这些全局函数和全局变量。不过导师一直反复强调:不许使用全局函数和全局变量。用了之后造成的后果,目前就是交上去的作业项目会扣分。当然不能用自有不能用的理由以及解决方案,不过不在目前的讨论范围内。自定义类型对于自定义类型,包括类(class)和结构体(struct),它们的定义都是放在.h文件中。其成员的申明和定义就比较复杂了,不过看上边的表格,还是比较清晰的。函数成员函数成员无论是否带有static限定符,其申明都放在.h文件的类定义内部。对于要inline的函数成员其定义放在.h文件;其他函数的实现都放在.cpp文件中。数据成员数据成员的申明与定义都是放在.h文件的类定义内部。对于数据类型,关键问题是其初始化要放在什么地方进行。对于只含有static限定符的数据成员,它的初始化要放在.cpp文件中。因为它是所有类对象共有的,因此必须对它做合适的初始化。对于只含有const限定符的数据成员,它的初始化只能在构造函数的初始化列表中完成。因为它是一经初始化就不能重新赋值,因此它也必须进行合适的初始化。对于既含有static限定符,又含有const限定符的数据成员,它的初始化和定义同时进行。它也是必须进行合适的初始化对于既没有static限定符,又没有const限定符的数据成员,它的值只针对本对象可以随意修改,因此我们并不在意它的初始化什么时候进行。模板类型 C++中,模板是一把开发利器,它与C#,Java的泛型很相似,却又不尽相同。以前,我一直只觉得像泛型,模板这种东西我可能一辈子也不可能需要使用到。但是在导师的强制逼迫使用下,我才真正体会到模板的强大,也真正知道要如何去使用模板,更进一步是如何去设计模板。不过这不是三言两语可以讲完的,就不多说了。对于模板,最重要的一点,就是在定义它的时候,编译器并不会对它进行编译,因为它没有一个实体可用。只有模板被具体化(specialization)之后(用在特定的类型上),编译器才会根据具体的类型对模板进行编译。所以才定义模板的时候,会发现编译器基本不会报错(我当时还很开心的:我写代码尽然会没有错误,一气呵成),也做不出智能提示。但是当它被具体用在一个类上之后,错误就会大片大片的出现,却往往无法准确定位。因此设计模板就有设计模板的一套思路和方式,但是这跟本文的主题也有偏。因为模板的这种特殊性,它并没有自己的准确定义,因此我们不能把它放在.cpp文件中,而要把他们全部放在.h文件中进行书写。这也是为了在模板具体化的时候,能够让编译器可以找到模板的所有定义在哪里,以便真正的定义方法。至于模板类函数成员的定义放在哪里,导师的意见是放在类定义之外,因为这样当你看类的时候,一目了然地知道有那些方法和数据;我在用Visual Studio的时候查看到其标准库的实现,都是放在类内部的。可能是我习惯了C#的风格,我比较喜欢把它们都写在类内部,也因为在开发过程中,所使用的编辑器都有一个强大的功能:代码折叠。当然还有其他原因就是写在类外部,对于每一个函数成员的实现都需要把模板类型作为限定符写一遍,把类名限定符也要写一遍。

函数原型究竟怎样理解

前面这个“原型”的意思是:原本的数据类型。

这里,先要给你解释一些基本概念:

变量和数据类型。

变量就是储物柜。数据类型,就是你将要放进这个储物柜的物品种类。

存放不同物品的储物柜,大小相差很大。如果你开一个车库来存放一只苹果,那就大大浪费了空间。反之就放不进去,造成数据丢失。所以在c++中,每开一个储物柜,就要预先说明它是用来存什么的。如果是存单个水果的,那就只开一点点空间。如果是要存飞机的,那就要弄个大机库。

它的函数原型在头文件?考虑下面的函数原型声明:void test

例子:double x;开一个用来存放double类物品的储物柜,并且命名为x。

而计算机编程语言中,基本的数据类型无非就那么几个:整数int/ integer/ long;实数double/ float;布尔型/逻辑型 bool/ boolean;字符型char;字符串string/ cstring;

其中,每一个类型都有其固定的最大长度,就是c++为这种储物柜所设计的空间大小。

同一类的数据,如果超出了允许的长度,那要么就拆成几个,要么就用长度更大的类型。

比如说,int表示一个整数,而long也是。区别在于long用更大的储存空间,可以表示更大的整数。

double在英语中是双倍的意思。double就比float用了双倍的储存空间来储存实数(整数+小数)。

它的函数原型在头文件?考虑下面的函数原型声明:void test

2.函数

关于函数,以后有进一步认识之后会有不同的定义。这里对于现在简单的函数给你一个直观的认识。

一个函数,就像是一部机器、一条生产流水线。加入一种或几种原料,产出一个产品。从原料到产品的加工步骤和方式定义在函数内部,调用的时候无须理会。就比如榨汁机,输入单个水果类型的物品作为原料,产出汁水类型的果汁。输入苹果,产出苹果汁。输入芒果,产出芒果汁。

sqrt()也一样。其实sqrt()只是一个给人看的简称,c++里面、cmath里面根本不存在sqrt()这个函数。真正完整的函数就是double sqrt(double)。第一个double,表示这部机器的产物是一个double种类的物品。括号中的double,表示这部机器一次只需要一个double类型的物品作为原料。

后面的那个“原型”是什么意思呢?就是指sqrt()这部机器内部的运作方式、加工工序。后面那句话的意思是,你想要在你的程序中,使用sqrt()这部机器。那么你要么就要先在你的程序中造出来:(在源代码文件中输入函数原型)。如果你不会造,那也没关系,把人家造好的机器拿过来用也行,但你要先告诉我有这部机器的人叫什么名字(包含头文件cmach,其中定义了原型。cmach就是拥有sqrt()这部机器的人)

C语言函数的调用问题

1.#include<stdio.h>

2.int maxmum(int x,int y,int z);

3.int main()

4.main()

5.{ int i,j,k;

6. printf("i,j,k=?\n");

7. scanf("%4d%4d%4d",&i,&j,&k);

8. maxmum(i,j,k);

9. getch();

10. return 0;

11.}

12.maxmum(int x,int y,int z)

13.{

14.int max;

15.max=x>y?x:y;(;是分号,前面一个是冒号)

16.max=max<z?max: z;

17.printf("The maxmum value of the 3 data is%d\n",max);

18.}

按每行说明:

1。这里是包含的头文件,头文件里头有你使用到的一些函数。比如你使用的printf()函数,这个函数你在本程序里头没有定义它的功能,那么本程序上哪知道呢。就是这个头文件。头文件里头有这个函数功能的具体定义。

2。这里是函数原型的声明,可以写成这样 int maxmum(int,int,int)因为声明的是原型,就不需要在声明里头把形式参数也给定义上了。当然你定义上也是对的。

3。这是主函数,int main()是符合c标准的,规定了main()函数的的返回值类型。有些人就写个main(),其实这样不符合c标准。一般的我喜欢这样 int main(void)表示main()函数没接受参数,返回值是int类型。

4。这一行我觉得是不是你重复了,这一行应该用第3行来代替。把这一样去掉

5。这里是定义三个整形变量。

6。printf输出函数用来格式化输出。

7。scanf()用来格式花输入。这个函数要弄的很清除是需要你花一些精力的。

8。这里调用maxmun()函数。还记得第2行对此函数的声明吗?正因为你对它声明了,所以main()函数在这里调用它的时候就知道,这个家伙我认识。可以用它。否则,它就不认识它,编译的过程就会出错。

9。这里是一个从键盘获得输入的一个函数。其实它在这里的功能是暂停一下,你随便输入一个字符,就马上执行return 0。程序就执行完毕。要不然,程序的执行过程会一闪而过。(学到后来你就会知道,这样的用法是存在安全隐患的。具体怎么样需要你进一步学习才能懂)

10。这里返回一个0说明main()函数执行完毕,而且是成功返回。

11。这个花括弧表明mian()函数的主体结束。

12。这里是maxmum()函数的功能的定义。下面的一对花括弧,就是maxmum()具体能实现什么功能的代码区。

13.一对花括弧的开始

14。定义一个整形变量,用来存放最大的数。

15.这里是一个if条件表达式。也就是问:x是不是大于y?判断这个条件是不是真。如果是真,那么就把后面的x赋值给max如果不是真,那么把x冒号后面的y赋值给max

16。类似于15的分析。

17。格式化输出max

18。maxmum()函数功能代码段结束。

如果你需要调用一个你自己编写的函数,那么你一定要在调用的位置之前就声明该和函数的原型。也就是告诉编译器,这个函数你认识,只是它具体是干什么的。我在后面有定义,你不要担心。于是编译器就会顺利通过编译。

说了这么多,手都累了,希望你能满意!

关于它的函数原型在头文件和考虑下面的函数原型声明:void test的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

ai图片绘画生成器网站 5个免费在线AI绘画网站,一键生成图片!荒芜之地矿点(荒地巨大矿脉位置)