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

来源:互联网 发布:强力手机数据恢复软件 编辑:程序博客网 时间:2024/06/10 06:35
函数重载:在相同作用域,函数名相同,参数列表不同。 以便实现不同数据类型的操作
函数重载:函数名相同,返回值可以不同,参数一定不同 (参数个数不同或参数类型不同)


函数重载解析的步骤如下:
1.确定函数条用考虑的重载函数的集合,确定函数调用中参数表的属性。
2.从重载函数集合中选择函数,该函数可以再(给出参数个数和类型)的情况下用调用中指定的参数进行调用。
3.选择与调用最匹配的函数。

精确匹配:是参与函数参数精确匹配
第一种:从左值到右值的转换,引用表示左值
#include<list>
void print(list <int> &)
{
          cout << "print" << endl;
}
//左值到右值的转换
list<int > li(20);
int main()
{
          print(li); // 精确匹配: 没有从左值到右值的转换
          system( "pause");
           return 0;
}
第二种:从数组到指针的转换
int ai[3];
void putValues(int *)
{
          cout << "putValues(int *)" << endl;
}
int main() {
           // ...
          putValues(ai); // 精确匹配: 从数组到指针的转换
          system( "pause");
           return 0;
}
第三种:从函数导致真的转换
int lexicoCompare(const string &,const string &);
typedefint (*PFI)(const string &, const string &);
void sort(string *, string *, PFI);
string as[10];
int main()
{
           // ...
          sort(as,
                   as + sizeof(as) / sizeof (as[0] - 1),
                   lexicoCompare // 精确匹配: 从函数到指针的转换
                   );
           return 0;
}
第四种:限定符的转换
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 ); // 错误: 二义
}


1 0
原创粉丝点击