函数重载

维基百科,自由的百科全书
跳转至: 导航搜索

函数重载(Function overloading),是AdaC++C#、D和Java编程语言中具有的一项特性,这项特性允许创建数项名称相同但功能的输入输出类型不同的子程序,它可以简单地称为一个单独功能可以执行多项任务的能力。


函数重载规律(C++)[编辑]

只要同名的函数多于一个、且其间有下列的一条不同即可能是重载:(参见:http://en.cppreference.com/w/cpp/language/overload_resolution)

  • 参数个数(默认参数有影响,见下文例子)
  • 相同位置的参数类型(包括数据类型、const/volatile 修饰符等)
  • 如果是非静态成员函数,那么 this 的类型需要纳入考虑

而真正成立与否则要具体分析。 事实上,可以假设用一参数表调用某个函数,如果同名的函数多于一个,那么能唯一判定调用的是哪个函数时则重载成立——只有在所有可能情况下都能区分两者时重载才成立。例如普通函数:

  • ... Fn(int)
  • ... Fn(int*)

构成重载。但

  • ... Fn(void)
  • ... Fn(int i=5)

不构成重载,因为写 Fn() 的话无法区分两者。

对于成员函数:

  • ... C::Fn(void)
  • ... C::Fn(void)const
  • static ... C::Fn(int)

构成重载(前两者因为 this 指针不同,一个 C* 一个 const C*;静态者是因为参数表不同)。而

  • ... C::Fn(void)
  • static ... C::Fn(void)

不构成重载,因为当用某 C 类的对象 c 调用 Fn(即 c.Fn())时无法区分两者——C++ 的静态函数不仅可在类上,也可在对象上调用。

常见的复制 / 移动构造 / 赋值函数重载举例:

  • C::C(const C &)
  • C::C(volatile C &)
  • C::C(C&&)//C++11
  • C &C::operator=(const C&)
  • C &C::operator=(C&&)//C++11

C++11 中的右值引用,在修饰成员函数时也纳入重载考虑:

  • ... C::Fn(void)
  • ... C::Fn(void)&&

前者会在(非常量)左值引用的语境下调用,而后者会在右值引用的语境下调用,因此构成重载——视乎用来发起调用的那个对象是左值(有个名字,具名的右值引用会被当成左值)还是右值(没有名字),例如 c.Fn() 和 std::move(c).Fn()。

以上讨论假设隐式转换不存在。当隐式转换存在时,问题会变得更加复杂,此处不细表。

构造器重载[编辑]

注意事项[编辑]

对于名字屏蔽英语name masking,C++规定不存在跨作用域(scope)的名字重载。即内层作用域的函数名字将屏蔽掉外层作用域的同名函数名字。

C++子类型的成员函数名将屏蔽其基类型的同名成员函数名,即被继承类与派生类的同名成员函数名不构成函数名重载。除非在子类型中用using关键字显式引入基类型的成员函数名。

class B {
public:
    void f(int i);
};
 
class D : public B {
public:
    using B::f;
    void f(double d);
};

class B {
public:
    void f(int i);
};
 
class D : public B {
public:
    using B::f;
    void f(double d);
};

另见[编辑]

参考[编辑]


外部链接[编辑]

  • Bertrand Meyer: Overloading vs Object Technology, in Journal of Object-Oriented Programming (JOOP), vol. 14, no. 4, October-November 2001, available online