0
点赞
收藏
分享

微信扫一扫

《C++ primer 第九章-函数重载》读书笔记


函数重载:在相同作用域,函数名相同,参数列表不同。 以便实现不同数据类型的操作


函数重载:函数名相同,返回值可以不同,参数一定不同 (参数个数不同或参数类型不同)

函数重载解析的步骤如下:


1.确定函数条用考虑的重载函数的集合,确定函数调用中参数表的属性。


2.从重载函数集合中选择函数,该函数可以再(给出参数个数和类型)的情况下用调用中指定的参数进行调用。


3.选择与调用最匹配的函数。




精确匹配:是参与函数参数精确匹配


第一种:从左值到右值的转换,引用表示左值


#include <list>

void print(list <int> &)

{

"print"

}

//左值到右值的转换

list<int

int

{

// 精确匹配: 没有从左值到右值的转换

"pause");

return

}


第二种:从数组到指针的转换


int

void putValues(int

{

"putValues(int *)"

}

int

// ...

// 精确匹配: 从数组到指针的转换

"pause");

return

}


第三种:从函数导致真的转换


int lexicoCompare(const string &, const

typedef int (*PFI)( const string &, const

void

string as[10];

int

{

// ...

sort(as,

sizeof(as) / sizeof

// 精确匹配: 从函数到指针的转换

);

return

}


第四种:限定符的转换


int a[5] = { 4454, 7864, 92, 421, 938 };

int *pi = a;

bool is_equal( const int * , const int * );

int func( int *parm ) {

// pi 和 parm 的精确匹配: 限定修饰转换

if ( is_equal( pi, parm ) )

// ...

return 0;

}

//pi和parm从int类型指针转换到const int 类型指针 (注意是指针,限定符转换只能应用到指针上)


前三种转换被称作左值转换

提升的细节:


1.unsigned char, char或short型被提升为int型


2.float被转换为double类型


3.枚举类型被转换为下列能表示所有枚举类型常量的类型之一:int ,unsigned int, long ,unsigned long 


4.布尔类型被转换为int型




标准转换细节:


1.整值类型转换


2.浮点类型转换


3.浮点-指针的转换


4.指针转换: 整值0到指针类型的转换,或 任意类型的指针到void* 类型的转换


5.bool类型的转换: 从任意整形类型,浮点类型,指针类型,枚举类型到bool类型的转换




类型转换出现的二义性:在调用过程中,编译器不知道要调用那个函数,所以产生二义性


extern void manip( long );

extern void manip( float );

int main() {

manip( 3.14 ); // 错误: 二义性

// manip( float ) 也不会好到那里

return 0;

}


可以用显示类型转换解决这个问题:


manip( static_cast<long>( 3.14 ) );  // manip( long )




引用:当实参是引用时,该实参是一个左值。


实参和引用参数的匹配有两种情况:


1.实参是引用参数的合适的初始值->实参是参数的精确匹配


2.实参不能初始化引用列表,没有匹配的函数,则实参不能调用该函数,发生错误。


 




候选函数:


在调用点上可见的函数,和声明的同名函数的集合(要在同一个名字空间内)。


可行函数:


最佳可行函数:


1 用在实参上的转换不比调用其他可行函数所需的转换更差


2 在某些实参上的转换要比其他可行函数对该参数的转换更好




转换序列:


左值转换------>


               提升或标准转换----------->


                            限定修饰转换






缺省参数:


extern void ff( int );


extern void ff( long, int = 0 );


int main() {


ff( 2L );  // 匹配 ff( long, 0 );


ff( 0, 0 ); // 匹配 ff( long, int );


ff( 0 );  // 匹配 ff( int );


ff( 3.14 ); // 错误: 二义


}





举报

相关推荐

0 条评论