现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

C++中函数重载,覆盖(重写)和隐藏详解

2012-07-07 07:49 工业·编程 ⁄ 共 1686字 ⁄ 字号 评论 1 条

一:函数重载基本知识:

   1.函数重载的定义:
            在相同的作用域内的同名函数.
                不同作用域内的同名函数通过作用域来区分不形成重载.
 
   2.函数重载的处理方式:编译器是以静态绑定的方式处理的.
  
   3.函数重载的分类;
            类的成员函数的重载和全局函数的重载.

   4.在同一个类中的成员函数的重载的特点:
     1).作用域相同.(不同作用域不构成重载).
     2).函数名相同.
     3).参数不相同(个数,顺序或者类型不一致).
     4).关键字virtual可有可无.

   注意:
     1).不能仅以函数返回值类型的不同作为函数重载的依据.
        如  int  Max(int a,int b) {}
              void  Max(int a,int b) {}
     2).同种类型的参数,其参数名称和使用形式的不同的不能成为重载的依据.
         如  int Func(int a) {}
               intFunc(int &a) {}
               intFunc(const int &a) {}
     3).参数的顺序不同也可以形成重载().
         如  voidFunc(int a,char c) {}
              void Func(char c,int a) {}
     4).注意防止参数类型间隐式地转化而导致函数不能重载.
        如   void Func(int x,int b) {}
              void Func(int a,float b) {} 
        在调用Func(1,0.5)的时候系统就会出现二义性,因为0.5这种常量在系统中默认是double型的,
然后无法确定转换为int型还是float型.

    5.全局函数重载:
       在整个作用域范围内的函数重载.

二:函数默认参数和重载二义性:

函数默认参数:

    1.函数默认参数的概念:
           就是函数声明时给出了具体的默认值参数.
   2.函数默认参数存在的必要性:
          带来了函数调用上的灵活性,减少了程序设计时重复输入相同参数的繁琐工作.尤其是用于构造函数.

   3.函数默认参数的语法格式:
          如   void Func(int a,int b = 2, int c = 3) { }
   
       注意:
       1.默认参数的声明是从右到左依次默认的,也就是说b有默认值的话,c一定也要有的.
       2.对于成员函数的默认参数,只能在声明成员函数时给出,不能在类外实现时给出,否则编译出错.

     4.函数默认参数的使用方式:
        Func(1);    //a=1,默认b=2,c=3
       Func(1,2);    //a=1,b=2,默认c=3
       Func(1,2,3);    //a=1,b=2,c=3

重载二义性:

     重载函数的二义性问题:
            编译器不能确定该调用哪个函数,可以做出多个解释.
   
     重载二义性示例:
        void Func() {}
        void Func(int a = 1) {}
        void Func(int a = 1,int b = 2) {}
        void Func(int a = 1,int b = 2, int c = 3) {}
 
       调用时:
       //Func();
        //Func(1);
        //Func(1,2);    //有歧义
        Func(1,2,3);

      如果重载函数中含有隐式类型转换,即使没有默认参数,也可能出现二义性问题,比如:
         void  Func(int  iNum) {}
         void Func(float  fNum = 0.1) {}
      在调用Func(0.5)的时候系统就会出现二义性,因为0.5这种常量在系统中默认是double型的,然后无法确定转换为int型还是float型.

目前有 1 条留言    访客:0 条, 博主:0 条 ,引用: 1 条

    外部的引用: 1 条

    • C++:成员函数的重载、覆盖与隐藏 « 求索阁

    给我留言

    留言无头像?