C和C++区别——函数的重载

来源:互联网 发布:网络剧 植入广告 价格 编辑:程序博客网 时间:2024/06/10 09:55

函数的重载:

C语言:函数产生符号,由函数名称决定的 

C++:函数产生符号,由函数名称+形参的类型+形参的个数决定的


下面这样一份代码,在C++中是可以通过编译的

但是在C语言中是不能通过编译的,因为在C语言中这三个函数生成的符号全是compare,重定义了,在C++里面,这三个函数可以看作函数名+形参,即compare_int_int,

compare_double_double,  compare_char*_char*,

函数名相同,参数列表不同的一组函数称作一组重载的函数,不能仅通过返回值不同来进行判断,跟返回值没关系。


静多态和动多态区别:

静多态:函数的重载,模板

动多态:继承里面的多态(虚函数)

  在编译的时候,编译器会自动根据实参参数的类型来定位相应的函数重载的版本, 如图:

在main函数里面加入一个声明,会报错,如图:

显示从double转为int可能会丢失数据

在C和C++里面,可以定义全局和局部的同名的变量,但是在局部使用的时候,优先使用局部的,(就近原则),先搜索局部的,局部没有再搜索全局的,调用点在局部进行调用,所以,重载必须处于同一作用域之内,!!!


再下面,把double改为float,

显示,对重载函数的调用不明确,

调用重载函数的时候,编译器首先会判断你给的参数,如果你给的实参和调用重载函数的形参类型绝对匹配,则调用相应的重载的版本,

如果不匹配,则会进行相应的默认转换,如果转换成功,则调用相应的函数重载的版本,但是像上面的情况,没有找到和它给的类型绝对匹配的,doule进行类型转换出错了,它既可以转成int,也可以转成float, 但是我们会想,浮点数不是应该优先转成float吗?为什么会同时匹配为int和float?难道是因为 Int和float都占四个字节?那我们一种,


将Int改为short后,结果更加严重,出现了更多匹配失败,如图,

所以呢,这也是我们笔试面试考的最多的部分,即类型转换问题,

我们来看一个运行结果,

打印出来是b,为什么呢?因为a和b在作比较的时候,会把 b 转换成无符号的整型,然后 b 就是一个特别大的数字,所以a > b不成立,则打印b,


改为unsigned short之后,打印 a ,如图:

为什么呢?运算符在进行运算的时候,必须保证运算符左右两端的类型相同,

我们来看看编译器默认类型转换:


向左:无条件转换

向上:强制类型转换,必须要明确要转的类型


提高运算精度,

我们来看这段代码

unsigned int a = 1;
 char b = -1;
 char c = a > b?'a':'b';
 cout<<c<<endl;

char b横向无条件转化成Int,a 现在是无符号的int,所以把b转为a,即把-1转为unsigned int,就是整型的最大值,


unsigned char a = 1;
 char b = -1;
 char c = a > b?'a':'b';
 cout<<c<<endl;

char和unsigned char都要无条件转成int,两个都为Int就可以比较了, 所以1 > -1,即a > b,有符号整数存-1没问题,


所以,在调用的时候,参数改为浮点数就Ok了,如图:



原创粉丝点击