c++ double 转 int_认识CC++中的函数

一、函数原型

  1. 函数原型
    函数原型又称为函数签名,顾名思义,通过函数原型就能够找到你要的函数。函数原型是一种区分函数身份的声明,声明指定了函数的名称、形参类型及函数的返回类型。形参名称在函数原型声明中并不是必须的,即形参名称事实上是可以忽略的。如果两个函数的原型声明仅返回类型不同其它都相同的原型声明是不允许的。

通过提供函数原型声明,然后再进行函数定义或调用,C++成为强类型的程序设计语言。强类型的程序设计语言要求:调用的函数的实参类型必须和函数原型的形参类型一致。在匹配调用函数的实参和函数原型的形参时,编译程序检查函数名和形参类型,至于形参名称则无关紧要。由于扩展名为.h的头文件包含函数原型声明,因此,在调用其中的任何函数之前必须include,如果不使用include就必须直接进行原型声明。如下例子展示了函数的原型声明和调用方法。

例.函数原型的声明和函数的调用。

double sin(double x);//直接进行有参数名的原型声明double cos(double);//直接进行无参数名的原型声明int main(void){double x=3;double y=4;return sin(3.0)+sin(x)+sin(y)+cos(3.0)+ cos(x)+cos(x+y);}

对于例1,你可能有几个疑问:

(1)双斜线“//”的作用是什么?它表示程序注解,从双斜线开始到当前行结束都是注解,编译程序会自动将注解忽略。此外,C++还支持C语言原有的形式为“/注解内容/”的注解,这种注解通常可以跨多行存在。

(2)主函数main的返回类型是int,可是return的表达式的值却是double类型的?这没有关系,因为编译程序会自动将double类型的值转化为int类型。

(3)变量x、y都是double类型的,可是却用int类型的值初始化?这也没有关系,因为编译程序会自动将int类型的值转化为double类型。

(4)变量x和sin函数原型中的x相同,这不会引起混淆吗?这不用担心,在调用sin(x)时,实参是主函数main定义的变量x,实参的值传给sin(x)的形参,之后实参和形参就没有任何关系。调用sin(x)时,编译程序会检查实参和形参的类型是否一致。

(5)在调用sin(3.0)中,实参3.0没有名称能行吗?能行,因为编译程序检查的只是实参和形参类型,两者的类型相同就可以了,然后将实参的值3.0传给sin(double x)的形参x。

(6)在调用cos(x+y)中,使用x+y不会出错吗?当然不会,只要x+y的值的类型和形参类型一致即可,x+y的值将传给cos(double)的形参,尽管在原型声明double cos(double) 中形参没有名字,但在定义该函数的函数体时一定会给出形参名称。

从例1来看,函数原型的声明出现在函数调用之前,这显然符合C++强类型程序设计语言的要求。为了简单起见,这些数学运算函数的函数原型声明被一起打包,存放在一个名字为math.h的头文件中。在调用这些函数之前,使用#include 进行原型声明。如果使用#include "math.h",则表示math.h可能是你自己建立的一个头文件,这个文件应该和你的扩展名为“.cpp”的程序文件放在同一目录。

例.声明和函数的调用。

include  //math.h中的所有原型声明将出现于此、替换本行int main(void){double x=3;double y=4;return sin(3.0)+sin(x)+sin(y)+cos(3.0)+ cos(x)+cos(x+y);}

宏命令#include 在编译时起的作用是宏替换,它将math.h中的所有函数原型声明替换#include 所在的行。即使有些数学函数你不使用,比如对数函数log(double),它也会作为原型声明出现在主函数main的前面。不过这并不会增加你编译后的可执行程序的长度,因为一个函数如果没有被使用,就不会被连接到可执行程序中。

对于sin等被C++预定义的函数来说,只需要进行函数原型声明就行了,不必进行函数定义,即程序员不必定义其函数体,编译程序会自动连接扩展名为.lib的库文件;如果编译程序没有连接相应.lib的库文件,也可要求操作系统动态连接.dll库文件。但是,对于程序员自己定义的函数原型,就必须在某个程序文件内定义相应的函数体。

例.函数的原型声明和调用。int square(int);//函数原型说明int main(void){//必须先进行函数原型声明或定义函数(体),才能调用函数int y= square(5);//函数原型已经在前面声明,故可调用return 0;}int square(int x)//程序员自己定义的函数,必须自定义函数体{ return x*x; }//自定义的函数体

2.函数重载函数重载即是对同一名称函数或者运算符加载不同的功能。假如要定义一组减法函数sub,用来完成:

(1)整数减整数;(2)浮点数减浮点数;(3)整数减浮点数;(4)浮点数减整数;(5)单目减,求整数的负整数;(6)单目减,求浮点数的负浮点数。

如果重载时形参再考虑其它类型,那么定义出来的重载函数就会更加多样了。

例. 减法函数的原型声明和调用。

int sub(int x, int y){ return x – y; }//整数减整数int sub(int x) { return -x; }//单目减:求整数的负整数double sub(double x, double y){ return x – y; }//浮点数减浮点数double sub(int x, double y){ return x – y; }//整数减浮点数double sub(double x, int y){ return x – y; }//浮点数减整数double sub(double x) { return -x; }//单目减:求浮点数的负浮点数int main(void){double x, y=4, z&
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值