C ++中重载的函数

时间:2011-03-16 16:28:24

标签: c++

这个函数是否重载了函数?

void f(int a, int b) {}
void f(int& a, int& b) {}
void f(int* a, int* b) {}
void f(const int a, const int b) {}

或者只有当参数的数量或类型不同时才会发生重载功能?

2 个答案:

答案 0 :(得分:7)

第1,2,3号是。 4号重新宣布1号。

您会发现,顶级const限定符不会影响函数声明。它们改变了在函数定义中使用它们的方式,但它仍然是相同的函数

void f(int);
void f(const int); //redeclares
void f(const int x) //same as above
{
   x = 4; //error, x is const
}

另一方面,这很好

void f(const int); 
void f(int x) //same as above
{
   x = 4; //OK Now
}

请注意,非顶级consts确实参与了重载解析。 E.g。

void f(int & x)
void f(const int & x) //another function, overloading the previous one 

最后,你问的是

  

或仅发生重载功能   当参数的数量或类型   不同?

是的,没错,但intint*int&是不同的类型。当然,在1或3的情况下,在大多数情况下,它将是不明确的调用,但在某些情况下,编译器可以告诉您的意思。例如

void f(int);
void f(int&);
f(3)//calls f(int)
int x = 3;
f(x); //ambiguous call;

答案 1 :(得分:3)

虽然第1和第2会引起左值的模糊,但它们会超载。第四是重新定义第一名:

http://ideone.com/lRFQi