2010/11/10

2010/11/10

关键字:函数重载、函数指针

函数重载

出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重载函数(overloaded function)。

main函数不能重载。

如果两个函数声明的返回类型和形参完全相同,则将第二个函数声明为第一个的重复声明。如果形参表完全相同,但是返回类型不同,则第二个声明是错误的。

编译器会忽略函数的形参名字,下面的声明是等价的:

void func(int i);

void func(int );

重载函数查找的顺序是先名字后参数类型。

函数匹配

函数重载确定即函数匹配是将函数调用与重载函数集合中的一个函数相关联的过程。通过自动提取函数调用中实际使用的实参与重载集合中各个函数提供的形参做比较,编译器实现该调用与函数的匹配。匹配的结果有三种:

1.      编译器找到与实参最佳匹配(best match)的函数,并生成调用该函数的代码。

2.      找不到形参与函数调用实参匹配的函数,编译器会给出编译错误。

3.      存在多个与实参匹配的函数,但没有一个是明显的最佳选择。这种情况也是错误的,编译器会给出二义性(ambiguous)编译错误。

 

重载确定有三个步骤:

1.      候选函数

找出名字相同的函数形成重载集合

2.      选择可行函数

首先检查形参个数是否匹配,然后检查类型是否匹配(或者实参可被隐式转换成形参类型)

3.      选择最佳匹配

考虑每个实参,选择对应形参与之最匹配的一个或多个可行函数。精确匹配优于类型转换。

转换等级降序排列:

a.      精确匹配

b.      通过类型提升实现的匹配

c.       通过标准转换实现的匹配

d.      通过类类型转换实现的匹配

 

含有多个形参的重载确定

编译器依次检查每一个实参来决定哪个或哪些函数匹配最佳。如果有且仅有一个函数满足下列条件,则匹配成功:

a.      其每个实参的匹配都不劣于其他函数

b.      至少有一个实参的匹配优于其他可行函数。

 

void f(int);

void f(short);

void f1(long);

void f1(float);

 

int _tmain(int argc, _TCHAR* argv[])

{

    f('a');     //匹配到void f(int),因为char类型转换成int是类型提升,而转换成short是标准转换

    f1(2.12);   //没有匹配到函数,因为2.12double类型,转换成floatlong都是标准转换,具有二义性

    return 0;

}

 

枚举类型和参数匹配

无法将整型值传递给枚举类型的形参,但可以将枚举值传递给整型形参。此时枚举值会被提升到int或更大的整型。具体的提升类型取决于枚举成员的值和具体的机器。

void f2(unsigned char){};

void f2(int){};

enum CODE {OK = 128, ERROR = 129};

int _tmain(int argc, _TCHAR* argv[])

{

f2(OK);     //枚举成员被提升为int,虽然unsigned char可以保存的下128

 

重载和const形参

仅当形参为引用或指针时,形参是否为const才有影响。形参是实参的副本时,形参是否为const和非const没有区别。

不能基于指针本身是否为const实现函数重载,f(int *)f(int *const)重复定义。

f(int *)f(const int *)不同。

指向函数的指针

函数指针的类型由函数返回值类型和形参表确定,与函数名无关。

typedef bool(*cmpFcn)(const string &, const string &);

可以声明cmpFcn为函数指针类型。

假设bool SomeFunc((const string &, const string &);

cmpFcn fuc1 = SomeFunc;

cmpFcn fuc1 = &SomeFunc;

两者等效。

 

函数指针只能通过同类型的函数或函数指针或0值常量表达式初始化和赋值。

 

指向不同函数类型的指针不存在转换。

 

函数指针做形参有两种写法:

void f(bool(const string &, const string &));

void f(bool (*)(const string &, const string &));

 

函数返回指向函数的指针

int (*f(int)) (int *);

看这类声明语句需要从内向外看。

内层是f(int)是一个函数,外层int (*) (int *)函数指针。表示的是返回函数指针的函数。

typedef更容易理解,

typedef int (*F) (int *);

F f(int);

 

允许将形参定义为函数类型,实际调用时实参是对应的函数指针。但不允许将函数返回值定义为函数类型,只能是函数指针类型。

typedef int F(int); //F为函数类型

void f1(F);         //ok

void f1(F*)         //ok

F f2();             //error

F* f2();            //ok

 

指向重载函数的指针

C++允许使用指针指向重载函数:

void f(double);

void f(short);

 

typedef void (*F)(int);

F = f;      //error,必须和所指向的函数类型完全匹配

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(1)根据所提供的日期,提取月份 (2)请对2010年各地区各产品的销售情况进行分析(图表展现) (3)请对各个业务员的业绩进行分析(图表展现) (4)请对各季度的业绩进行分析(图表展现),同时给出商家一些可以提高销售业绩的建议 日期 地区 业务员 品名 销量(个) 单价(元) 销售额(元) 月份 2010/1/6 A 张三 订书机 95 25 2375 2010/1/23 B 王五 钢笔 50 35 1750 2010/2/9 B 周六 钢笔 36 35 1260 2010/2/26 B 周六 笔记本 360 15 5400 2010/3/15 C 田七 订书机 600 25 15000 2010/4/1 A 李四 铅笔 930 0.5 465 2010/4/18 B 周六 订书机 740 25 18500 2010/5/5 B 周六 钢笔 960 35 33600 2010/5/22 C 田七 钢笔 530 35 18550 2010/6/8 A 李四 笔记本 410 15 6150 2010/6/25 B 王五 订书机 940 25 23500 2010/7/12 A 张三 铅笔 280 0.5 140 2010/7/29 A 张三 订书机 81 25 2025 2010/8/15 A 张三 钢笔 35 35 1225 2010/9/1 B 周六 钢笔 65 35 2275 2010/9/18 A 李四 笔记本 93 15 1395 2010/10/5 B 周六 订书机 28 25 700 2010/10/22 A 李四 铅笔 640 0.5 320 2010/11/8 A 李四 订书机 870 25 21750 2010/11/25 B 周六 钢笔 620 35 21700 2010/12/12 B 周六 钢笔 550 35 19250 2010/12/29 A 李四 笔记本 74 15 1110 2010/1/15 B 王五 订书机 46 25 1150 2010/2/1 B 王五 铅笔 870 0.5 435 2010/2/18 A 张三 订书机 32 25 800 2010/3/7 C 赵大 钢笔 70 35 2450 2010/3/24 B 王五 钢笔 50 35 1750 2010/4/10 B 王五 钢笔 66 35 2310 2010/4/27 A 李四 笔记本 96 15 1440 2010/5/14 B 周六 笔记本 53 15 795 2010/5/31 B 周六 订书机 80 25 2000 2010/6/17 B 周六 订书机 27 25 675 2010/7/4 A 李四 铅笔 620 0.5 310 2010/7/21 B 周六 铅笔 550 0.5 275 2010/8/7 B 周六 订书机 42 25 1050 2010/8/24 C 田七 订书机 76 25 1900 2010/9/10 B 王五 钢笔 69 35 2415 2010/9/27 C 赵大 钢笔 76 35 2660 2010/10/14 C 赵大 钢笔 57 35 1995 2010/10/31 B 王五 钢笔 47 35 1645 2010/11/17 B 王五 笔记本 110 15 1650 2010/12/4 B 王五 笔记本 94 15 1410 2010/12/21 B 周六 笔记本 28 15 420 excel
最新发布
07-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值