函数重载和方法重载之间的区别

时间:2012-03-10 18:25:04

标签: c++ c oop overloading

您好我正在尝试理解c ++中函数重载和方法重载之间的区别。谷歌搜索后我遇到了这个。不确定这是否正确。如果错误请帮助纠正。

  

方法重载和函数重载是相关的概念。术语方法重载被定义为在各种编程语言(例如C ++和Java)中找到的特征。它允许创建具有相同名称的各种功能。但是,所有这些功能在输入类型和功能输出类型方面都各不相同。

     

另一方面,术语函数重载用于面向对象的编程。它被定义为一种技术,其中使用不同数量和/或类型的参数将具有相同名称的两个或多个函数彼此区分开。

来源:http://www.blurtit.com/q662319.html

3 个答案:

答案 0 :(得分:4)

在C ++中方法通常用于引用类或结构的成员函数,而 功能是一个独立的非会员功能。


标准如何声明函数和方法?

根据C ++标准,函数声明定义如下: 8.3.5函数[dcl.fct]

  

在声明T DD的格式为

D1 ( parameter-declaration-clause ) cv-qualifier-seqopt exception-specificationopt
     

并且声明contained declarator-idT D1的类型是“derived-declarator-type-listT”, {{1}中声明者id的类型是{em>“(Dparameter-declaration-clause返回cv-qualifier-seqopt”的“derived-declarator-type-list function ;这种形式的类型是函数类型86)。

请注意,标准在#4中进一步陈述:

  

T只能是非静态成员函数的函数类型的一部分

仅汇总方法(成员函数)可以是cv-qualifier-seqconst


重载功能和标准的标准方法重载:

因此,重载函数和重载方法(成员函数)具有不同的标准

当且仅当:

时,才能进行函数重载
  • 不同数量的论点。
  • 不同的参数序列或
  • 不同的论点

while方法(成员函数)当且仅当:

时才可以重载
  • 不同数量的论点。
  • 不同的参数序列或
  • 不同的论点或
  • 不同的volatile

请注意,返回类型不是重载的标准。因为C ++允许实现忽略函数/方法的返回值。


代码示例:

功能重载:

cv-qualifer-seq

方法重载:

void doSomething(int i);
void doSomething(std::string,int x);

以上是class Myclass { public: void doSomething(int i); void doSomething(std::string,int x); void doSomething(int i) const; void doSomething(int i) volatile; }; 如何作为独立函数和方法/成员函数重载的示例。

答案 1 :(得分:2)

他们是一回事。

但是,有些人更喜欢调用属于class的函数的方法函数,以及函数,自由函数。

//function overloading
void foo(int x);
void foo(int x, int y);

//method overloading
class A
{
   void foo(int x);
   void foo(int x, int y);
};

通过修改签名但保留其名称来重载方法/函数。签名包括:

  • 名称
  • 参数类型
  • cv修饰符

因此,要重载,您只需要更改参数或cv限定符。即如果方法是类的一部分,你也可以像这样重载:

class A
{
   void foo(int x);
   void foo(int x) const;
   void foo(int x, int y);
};

在对不可变对象进行操作时,将调用原型foo(int x) const

答案 2 :(得分:-2)

从一般意义上讲,函数返回值。方法只需执行操作。

你会看到很多的教科书示例是door.open()hood.open()(是的,我们都讨厌可怕的汽车 - > OO类比,但在这种情况下很明显)。这些是方法。你打开门,没有副产品。但是,它确实归结为如何必须打开门,而不是如何打开引擎盖;它们足够相似,可以分享动作,但在详细的实施方式上有所不同(你真的希望隐藏在用户之外......门打开 out ,而引擎盖打开向上)。

但是,函数将函数的原始调用替换为函数返回的值。如果我理解正确,您可以通过测量car.exhaust(30, 0)来显示这一点,car.exhaust(30, 60)返回在30秒内以0英里/小时的速度发出的碳,氧气和其他气体的重量。但是,speed函数将包含未与{{1}}变量0一起使用的详细信息,并会相应地更改输出。

有很多函数重载的例子,这个简单地演示了不同的参数如何影响所用函数的逻辑和输出。