C++语法学习_(2)

C7_function_parameter

函数的参数传递:形参和实参

#include <iostream>
using namespace std;
/* 
函数的形参a,b,c ..., func (int a, int b, int c...),
实参--赋值给行参  ,函数调用时,值传递 ,func (2, 3, 4...)
形参的默认值。 如果定义了默认值,这函数后面所有的参数(形参)都需要有默认值。
func (int a, int b=5, int c=55...),
错误的 func (int a, int b=5, int c...), c 也必须要有默认值

还有函数的形参赋予默认值 只可以出现一次,且在 函数的默认值 作用域 只在函数的调用处。
在给定的作用域中一个形参只能被赋予一次默认参数。换句话说,
函数的后续声明只能为之前那些没有默认值的形参添加默认值,
而且该形参右侧的所有形参必须都有默认值。

*/
void func(int a, float b, char c)
{
    cout<<a<<','<<b<<','<<c<<endl;

}
// void func1(int a, float b=3, char c) //错误
// {
//     cout<<a<<','<<b<<','<<c<<endl;

// }
void func1(int a, float b=3, char c='@') 
{
    cout<<a<<','<<b<<','<<c<<endl;

}
int d=3;
void func2(int a, int b=d+3)
{
    cout<<a<<','<<b<<endl;

}

int main(){

    func(1,2.1,'c');
    func1(2);//传递部分参数,使用默认参数值,
    func1(3,4.1,'$');    //赋值所有的参数
    func1(3,4.1);
    func2(4);
    return 0;
} 

C8_fucntion_overload 函数的重载

C++ 标准规定,在进行重载决议时编译器应该按照下面的优先级顺序来处理实参的类型:

优先级包含的内容举例说明
精确匹配不做类型转换,直接匹配(暂无说明)
只是做微不足道的转换从数组名到数组指针、从函数名到指向函数的指针、从非 const 类型到 const 类型。
类型提升后匹配整型提升从 bool、char、short 提升为 int,或者从 char16_t、char32_t、wchar_t 提升为 int、long、long long。
小数提升从 float 提升为 double。
使用自动类型转换后匹配整型转换从 char 到 long、short 到 long、int 到 short、long 到 char。
小数转换从 double 到 float。
整数和小数转换从 int 到 double、short 到 float、float 到 int、double 到 long。
指针转换从 int * 到 void *。


C++ 标准还规定,编译器应该按照从高到低的顺序来搜索重载函数,首先是精确匹配,然后是类型提升,最后才是类型转换;一旦在某个优先级中找到唯一的一个重载函数就匹配成功,不再继续往下搜索。

#include <iostream>
using namespace std;
/* 
overloading 重载。
1.同一个函数名,实现不同 (在C语音中,就需要定义多个函数名!C++不需要--重载实现)
2. 参数列表不同(参数个数,参数的数据类型,参数的顺序),只有有一个不同,参数列表就不同
这样的话传递不同的参数,编译阶段会自动区分,选择合适的函数实现调用。
重点:编译如何区分/仲裁?
按照一定的优先级。 完全匹配的数据类型参数> 类型提升>类型转换
如果有>=2 个可用的函数。就是二义错误。需要避免
这个过程就是重载

函数的重载的规则:
函数名称必须相同。
参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
函数的返回类型可以相同也可以不相同。
仅仅返回类型不同不足以成为函数的重载。
 */

//定义多个SWAP 函数,参数列表不同,观察调用情况
void SWAP(int a, int b){

    cout<<"int"<<endl;
}

void SWAP(char a, char b){

    cout<<"char"<<endl;
}

void SWAP(double a, double b){

    cout<<"double"<<endl;
}

//

int main(){
//精确匹配
    SWAP('A','B');
    SWAP(5,5);
    SWAP(5.5,5.5);
//仲裁
    SWAP(5,'c'); //提升char --int 大于 转换 int --char
    float b=5.0;  //提升float -->double 
    
    SWAP(b,b);
    short c=3.0;//提升short -->int
    SWAP(b,c);
    return 0;
}


如果在一个优先级中找到多个(两个以及以上)合适的重载函数,编译器就会陷入两难境地,不知道如何抉择,编译器会将这种模棱两可的函数调用视为一种错误,因为这些合适的重载函数同等“优秀”,没有一个脱颖而出,调用谁都一样。这就是函数重载过程中的二义性错误

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值