zoukankan      html  css  js  c++  java
  • C++@重载函数

    关于重载详细分析参考:

    http://www.cnblogs.com/skynet/archive/2010/09/05/1818636.html

    内部机制涉及重载函数如何解决命名冲突,调用匹配的问题。

    分辨重载的准则:

    • 精确匹配:参数匹配而不做转换,或者只是做微不足道的转换,如数组名到指针、函数名到指向函数的指针、T到const T;
    • 提升匹配:即整数提升(如bool 到 int、char到int、short 到int),float到double
    • 使用标准转换匹配:如int 到double、double到int、double到long double、Derived*到Base*、T*到void*、int到unsigned int;
    • 使用用户自定义匹配
    • 使用省略号匹配:类似printf中省略号参数

    如果在最高层有多个匹配函数找到,调用将被拒绝(因为有歧义、模凌两可)。看下面的例子:

    void print(int);
    void print(const char*);
    void print(double);
    void print(long);
    void print(char);
    
    void h(char c,int i,short s, float f)
    {
         print(c);//精确匹配,调用print(char)
         print(i);//精确匹配,调用print(int)
         print(s);//整数提升,调用print(int)
         print(f);//float到double的提升,调用print(double)
    
         print('a');//精确匹配,调用print(char)
         print(49);//精确匹配,调用print(int)
         print(0);//精确匹配,调用print(int)
         print("a");//精确匹配,调用print(const char*)
    }

    定义太少或太多的重载函数,都有可能导致模凌两可,看下面的一个例子:

    void f1(char);
    void f1(long);
    
    void f2(char*);
    void f2(int*);
    
    void k(int i)
    {
           f1(i);//调用f1(char)? f1(long)?
           f2(0);//调用f2(char*)?f2(int*)?
    }

    这时侯编译器就会报错,将错误抛给用户自己来处理:通过显示类型转换来调用等等(如f2(static_cast<int *>(0),当然这样做很丑,而且你想调用别的方法时有用做转换)。上面的例子只是一个参数的情况,下面我们再来看一个两个参数的情况:

    int pow(int ,int);
    double pow(double,double);
    
    void g()
    {
           double d=pow(2.0,2)//调用pow(int(2.0),2)? pow(2.0,double(2))?
    }
    /*
     *重载:两个或者多个函数有同一个函数名,不同数量的参数。
     *当参数个数相同,参数类型不同,重载时会首先调用类型参数的函数,
     *如果没有,则进行类型强制转换。
     */
    #include <iostream>
    using namespace std;
    
    int ave(int n1, int n2);
    double ave(double n1, double n2);
    double ave(double n1, double n2, double n3);
    
    int main()
    {
    	cout << "The average of 2.0 2.5 3.0 is: "
    		 << ave(2.0, 2.5, 3.0) <<endl;
    	cout << "The average of 4.5 5.5 is:"
    		 << ave(4.5, 5.5) << endl;
    	cout << "The average of 5 8 is:"
    		 << ave(8, 5) << endl;
    	return 0;
    }
    
    int ave(int n1, int n2)
    {
    	return (n1-n2);
    }
    
    double ave(double n1, double n2)
    {
    	return ((n1+n2)/2.0);
    }
    
    double ave(double n1, double n2, double n3){
    	return ((n1+n2+n3)/3.0);
    }
    
    运行结果:
    The average of 2.0 2.5 3.0 is: 2.5 The average of 4.5 5.5 is:5 The average of 5 8 is:3

      

  • 相关阅读:
    TextView-setCompondDrawables用法
    android 相对布局RelativeLayout中的一些属性的使用和实例
    登录时旋转等待效果
    使用slidingmeu_actionbarsherlock_lib的问题和The hierarchy of the type MainActivity is inconsistent
    ActionBarSherlock SlidingMenu整合,解决SlidingMenu example的getSupportActionBar()方法不能用问题
    String,StringBuffer和StringBuilder的区别
    File.separator使用
    Android常用异步任务执行方法
    adb server is out of date. killing...
    adb shell root
  • 原文地址:https://www.cnblogs.com/kwseeker-bolgs/p/4540863.html
Copyright © 2011-2022 走看看