重载函数

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

 
任何程序都仅有一个main 函数的实例。main 函数不能重载
 
函数重载和重复声明的区别
如果两个函数声明的返回类型和形参表完全匹配,则将第二个函数声明视为第一个的重复定义。
如果两个函数的形参表完全相同,但返回类型不同,则第二个声明是错误的。(然而  使用const  是可以被重载 的
 
函数不能仅仅基于不同的返回类型而实现重载,但是可以基于const  (常量性) 被重载
 
------------------------------------------------------------
Record lookup(Phone) ;
Record lookup(const Phone); // redclaration  重复声明
这个区别仅仅在于是否将形参 定义为const  . 这种差异并不影响传递至函数的对象;第二个函数声明被视为第一个的重复声明。其原因在与实参传递的方式。
复制形参时并不考虑形参是否未const ---- 函数操纵的只是副本。函数无法修改实参。 结果,即可将const 对象传递给 const 形参,也可传递给 非const 形参。两种形参并无本质区别。
 
然而,值得注意的是,形参与const 形参 的等价性 仅仅适用于 非引用形参。
有 const 引用形参的函数与有非const 引用形参的函数式不同的。类似的,如果函数带有指向 const 类型的指针形参, 则与带有指向相同类型的非const对象的指针形参的函数不相同。
 
 
 
可以基于函数的引用形参时指向const 对象还是 非const 对象,实现函数重载。
 
Record lookup(Account &);
Record lookup(const Account &);  //  ok  , new function 
const  Account a(0);
Account b;
lookup(a); // calls lookup(const Account&)
lookup(b);// calls lookup( Account &)
 
 
                              
 const  在 * 左边,说明指向的物 为const  不能变   。  *p =0 // error   ////
 const  在 * 右边。 说明指针本身为 const  指针不能变,但是指向的物可以变    ++p// error;
 
然而注意 不能基于 指针本身是否未const 来实现函数的重载: 
 
 
 f(int *)    
f(int * const)  //重复声明                                                                                
 
此时const  用于修饰指针本身,而不是修饰指针所指向的类型。两种情况都复制了指针,
指针本身是否为const 并没有带来区别, 当形参以副本传递时候,不能基于形参是否未const 来实现重载。
 
 
int cal(int, int);
int cal(const int&, const int &); //ok
 
int calc(char *  ,char *)
int calc(const char* , const char *);// ok
 
int calc(char* char*);
int calc(char* const , char  *const);// error   
 
 
 
 
posted @ 2015-08-10 23:00  deanlan  阅读(954)  评论(0编辑  收藏  举报