C++笔记---函数声明(prototype)

来源:互联网 发布:java观察者模式实例 编辑:程序博客网 时间:2024/06/11 22:20

*最近在看《C++ Primer Plus》,奈何买了英文版的,只能慢慢看.
在这里做一些学习笔记,来提醒自己注意一些细节.
(这里只是记录我个人平时没有注意到的细节,很多其它的知识不包括在内)*

C++函数

要使用C++函数,必须要有以下的三步:
1.提供函数的定义
2.提供函数的声明
3.调用函数

1.函数的定义
函数根据有无返回值可以分成两类.
对于有返回值的类型来说,C++中的函数可以返回除数组外的其余类型,比如:整数,浮点数,指针,结构体和对象.


2.函数的声明和调用
函数的声明给出了函数名,函数的返回值以及函数的参数,是告诉了编译器这个函数的接口.
**函数的声明是用来告诉编译器这个函数需要多少个参数,每个参数类型需要多少个字节,以及函数的返回类型需要多少个字节.
如果在函数调用的时候,给出的参数或者函数的返回值与函数的声明不符,那么编译器会捕捉这个错误.**
因此我们在进行函数声明时,虽然很多时候都用了以下形式:

int add(int a,int b);

并且我们也知道形参名可以与实参名不一样,甚至可以说形参名和实参名毫无关系,
其原因是函数声明是为了给编译器提供字节计算,所以只需要提供必要的类型就行,
因此,上面的函数声明也可以写成如下形式:

int add(int,int);//但是在函数定义的时候,不能这么写

如果没有函数的声明在先,那么编译器就会去代码文件中寻找函数的定义,会极大的降低效率,以及因为调用函数的顺序不同产生很多错误.
函数的声明在大型项目中尤为重要,比如我们经常使用的头文件其作用就包括但不限于的函数声明,完成编译后,就链接到相应的库,产生可执行文件.

这里要注意的是C++的函数声明和ANSI C有些不同的地方,比如:C++中,

void say_hi();与void say_hi(void);//作用相同,表示括号中不需要参数

但是ANSI C中,void say_hi();表示放弃声明参数的类型,也就是说你想放什么类型的参数都行,类似于printf()函数.
而C++中需要达到这种类似于prinf()函数的效果,则需要在括号里面加上省略号,比如:

void say_hi(...);

函数声明还会帮助编译器,极大地减少出错的概率—–编译器会根据函数声明来检查你是否正确地给出了函数参数以及返回了正确的类型,
如果你没有正确地给出参数类型,但是你给出的参数类型和函数声明的类型能够进行转换的话,编译器会帮助你正确转换.

比如在C中,我们假设一个函数的参数需要两个字节的int类型的变量(16 bits),但是你给了一个double类型(假设8个字节,64 bits),那么C的编译器就会截取64 bits中的前16 bits,
可能会产生一些不可思议的错误.
但是这种情况如果在C++中,那么它的编译器就会根据你传入的类型是否能转换为需要的类型来进行转换,在上述情况中,编译器会自动把double转换为int类型.
但是如果你传入的数字特别大,比如8.33E27,那么它就会报错.

总之,函数的声明(prototype)是在编译时期帮助进行静态类型检查的.

原创粉丝点击