重载

重载

1.重载与重载解析

•同一作用域中,函数名相同,参数表不同的函数,构成重载关系

 void foo (void); 
 void foo (int n); 
 void foo (int* p); 
 char const* foo (int n, double d); 
 char const* foo (double d, int n);

•重载与返回类型无关,与参数名也无关,相同类型的引用与非引用不构成重载

int foo (void); // 错误 
void foo (int& r); // 错误 
char const* foo (int d, double n); // 错误

•调用函数时,根据实参与形参的类型匹配情况,选择一个确定的重载版本,这个过程称为重载解析

 void foo (void); void foo (int n); 
  void foo (int* p); int foo (double d); 
  char const* foo (int n, double d); 
  char const* foo (double d, int n);

 int n;  double d; 
 foo (); 
 foo (n); 
 foo (&n); 
 foo (d); 
 foo (n, d); 
 foo (d, n);

//C++规定常量转换优先于升级转换。
// 在转换的过程中存在优先级的问题,升级转换优于标准转换。
//void print(double d1, ...) ;C++规定省略号匹配的优先级最差
#include <iostream>  
void print(char c) 
{ 
    std::cout << "c = " << c << std::endl; 
} 
 void print(int n) 
 { 
    std::cout << "n = " << n << std::endl; 
 } 
 int main(int argc, const char * argv[]) 
 {  
    double d = 10.23; 
    print(d);  
    return 0; 
 }
 //调用print函数时需要在重载函数中进行匹配。由于print函数的实参与所有重载函数均不能完全匹配,所以需要进行转换。在转换的过程中,可以将double类型转换成int类型,这被称为标准转换。也可以将double类型转换成char类型,这也被称为标准转换。由于可以转换成两个重载函数,这被称为等差歧义,将出现编译错误。

•函数指针的类型决定其匹配的重载版本

•只有同一作用域中的同名函数才涉及重载问题,不同作用域中的同名函数遵循名字隐藏原则

void foo (void); 
 namespace ns1 
 { 
      void foo (int a); 
      namespace ns2 
      { 
            void foo (int a, int b); 
            void bar (void) 
            { 
                foo (10, 20); 
            } 
       } 
       void hum (void) 
       { 
            foo (30); 
       } 
 }
  void fun (void) 
  { 
        foo (); 
  }

2.C++换名

•重载是通过C++换名实现的
•换名机制限制了C和C++模块之间的交叉引用

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值