函数重载:首先是保证形参数量和形参类型不同!
区别const确定是否是同一函数还是重载的函数
1.
int f(int );
int f(const int );//尽管是一个顶层const,但两个可以接受的实参类型一样
//,并没有区别。所以是同一函数,并没有重载
2.
int f(int *);//不能接受声明为常量的对象地址
int f(int * const);//这里是常量指针,不能接受声明为常量的对象地址,也是一个顶层const,指向类型是int ,
//但两个可以接受的实参类型一样
//,并没有区别。所以是同一函数,并没有重载
/
3.
int f(int& );//普通引用,不能接受声明为常量的实参
int f(const int &);//常量引用都是底层const 可以接受常量以及非常量的实参,
//所以与上是不同的类型,所以是函数的重载
4.
int f(int* );//普通指针,不能接受声明为常量的对象地址
int f(const int *);//指向常量的指针,可以接受非常量也可以是常量,类似于常量引用
//所以与上是不同的类型,所以是函数的重载
指针形参
解释上面2可能存在的疑问:
void ret (int *ip)
{
*ip = 0; // 改变指针 ip 指的对象的值
ip = 0; // 只改变了 ip 的局部拷贝,实参未改变(并不会改变的实参的地址),这县相当于无效的操作;
}
默认实参
typedef string::size_type sz
string screen(sz ht = 24 , sz wid =80 ,char bac =' ');//一旦中某个形参赋值默认值,其后的都必须含有默认值,前面不用管
screen();//等于screen(24,80,' ');
screen(66);//等于screen(66,80,' ');
screen(, , ' ?');//错误,含有默认实参的只能省略尾巴的实参赋值
screen(' ?');//等于screen(' ?',80,' '); //能够调用成功 因为char可以转换到size_type ,但没有达到我们的目的
//默认实参的声明
//以下同一个作用域
string screen(sz , sz ,char =' ');
string screen(sz , sz ,char = '* '); //错误:在同一个作用域可以多次声明 但后续的声明只能为之前声明没有默认值的形参赋值;
string screen(sz = 24 , sz = 80 ,char); //正确:添加之前声明没有添加的默认实参
//局部变量不能作为默认实参
sz wd = 80;
char def = '*';
string screen(sz = 40 , sz = wd,char =def )
{
def = '?';//改变了默认实参
sz wd = 100; // 隐藏外成定义的wd,但是是局部变量,没有改变默认值
screen () ; // screen(40 , 80, '?');
}