📜  无法在C++中重载的函数

📅  最后修改于: 2021-05-26 01:37:32             🧑  作者: Mango

在C++中,以下函数声明不能重载。

1)仅在返回类型上不同的函数声明。例如,以下程序编译失败。

#include
int foo() { 
  return 10; 
}
  
char foo() { 
  return 'a'; 
}
  
int main()
{
   char x = foo();
   getchar();
   return 0;
}

2)如果它们中的任何一个是静态成员函数声明具有相同的名称和名称参数类型列表成员函数声明不能被重载。例如,以下程序编译失败。

#include
class Test {
   static void fun(int i) {}
   void fun(int i) {}   
};
  
int main()
{
   Test t;
   getchar();
   return 0;
}

3)仅在指针*与数组[]中不同的参数声明是等效的。即,将数组声明调整为指针声明。在参数类型中,只有第二维和后续数组维才有意义。例如,以下两个函数声明是等效的。

int fun(int *ptr);
int fun(int ptr[]); // redeclaration of fun(int *ptr)

4)仅在一个是函数类型而另一个是指向相同函数类型的指针方面不同的参数声明是等效的。

void h(int ());
void h(int (*)()); // redeclaration of h(int())

5)仅在存在和不存在const和/或volatile方面不同的参数声明是等效的。也就是说,在确定要声明,定义或调用哪个函数时,将忽略每种参数类型的const和volatile类型说明符。例如,以下程序在编译时失败,并显示错误“重新定义’int f(int)’”

例子:

#include
#include
   
using namespace std;
   
int f ( int x) {
    return x+10;
}
  
int f ( const int x) {
    return x+10;
}
  
int main() {     
  getchar();
  return 0;
}

以这种方式,仅忽略参数类型说明中最外层的const和volatile类型说明符。包含在参数类型规范中的const和volatile类型说明符很重要,可用于区分重载的函数声明。特别是对于任何类型T
“ T的指针”,“ const T的指针”和“ volatile T的指针”被认为是不同的参数类型,“ T的引用”,“ const T的引用”和“ volatile T的引用”也被认为是不同的参数类型。例如,请参阅由Venki发布的此注释中的示例。

6)两个仅在默认参数方面不同的参数声明是等效的。例如,以下程序在编译时失败,并显示错误“重新定义`int f(int,int)’”

#include
#include
   
using namespace std;
   
int f ( int x, int y) {
    return x+10;
}
  
int f ( int x, int y = 10) {
    return x+y;
}
  
int main() {     
  getchar();
  return 0;
}

参考:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”