深度探究C++中的函数重载的用法

2020-01-06 14:34:16王冬梅

处理 –>* 和 .*(指向成员的指针)运算符的左操作数的方式与处理与参数匹配相关的 . 和 –>(成员选择)运算符的方式相同。
限制
多个限制管理可接受的重载函数集:

  • 重载函数集内的任意两个函数必须具有不同的参数列表。
  • 仅基于返回类型重载具有相同类型的参数列表的函数是错误的。

    不能只根据一个静态类型和一个非静态类型来重载成员函数。
    typedef 声明不定义新类型;它们引入现有类型的同义词。它们不影响重载机制。考虑下列代码:

    
    typedef char * PSTR;
    
    void Print( char *szToPrint );
    void Print( PSTR szToPrint );
    
    

    前面的两个函数具有相同的参数列表。 PSTR 是类型 char * 的同义词。在成员范围内,此代码生成错误。
    枚举类型是不同的类型,并且可用于区分重载函数。
    就区分重载函数而言,类型“array of”和“pointer to”是等效的。此情况仅适用于单维度数组。因此,以下重载函数会发生冲突并生成错误消息:

    
    void Print( char *szToPrint );
    void Print( char szToPrint[] );
    

    对于多维数组,第二个和后续维度被视为类型的一部分。因此,它们可用来区分重载函数:

    
    void Print( char szToPrint[] );
    void Print( char szToPrint[][7] );
    void Print( char szToPrint[][9][42] );
    

    声明匹配
    同一范围内具有同一名称的任何两个函数声明都可以引用同一函数或重载的两个不同的函数。如果声明的参数列表包含等效类型的参数(如上一节所述),函数声明将引用同一函数。否则,它们将引用使用重载选择的两个不同的函数。
    需要严格遵守类范围;因此,在基类中声明的函数与在派生类中声明的函数不在同一范围内。如果使用与基类中的函数相同的名称声明派生类中的函数,则该派生类函数会隐藏基类函数,而不是导致重载。
    需要严格遵守块范围;因此,在文件范围中声明的函数与在本地声明的函数不在同一范围内。如果在本地声明的函数与在文件范围中声明的函数具有相同名称,则在本地声明的函数将隐藏文件范围内的函数而不是导致重载。例如: