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

Difference between function overloading and method overloading

本文关键字:重载 区别 之间 方法 函数      更新时间:2023-10-16

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

方法重载

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

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

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

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


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

根据C++标准,函数声明的定义如下:8.3.5 函数

在声明T D中,D具有以下形式

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

声明T D1中的contained declarator-id类型是"派生声明器类型列表T">D中声明符 id 的类型是"( parameter-declaration-clause ( cv-qualifier-seqopt返回T的派生声明器类型列表函数";此窗体的类型是函数类型86(。

请注意,该标准在 #4 中进一步声明:

cv-qualifier-seq只能是非静态成员函数的函数类型的一部分

总结 只能constvolatile方法(成员函数(。


函数和方法重载的重载标准:

因此,重载函数和重载方法(成员函数(具有不同的条件

函数重载在以下情况下且仅当

  • 不同数量的参数。
  • 不同的参数顺序或
  • 不同的论点

而方法(成员函数(重载是可能的,当且仅当:

  • 不同数量的参数。
  • 不同的参数顺序或
  • 不同的参数或
  • 不同的cv-qualifer-seq

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


代码示例:

函数重载:

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;
};

上面是一个示例,说明如何将doSomething()作为独立函数和方法/成员函数重载。

它们是一回事。

但是,有些人更喜欢调用作为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 限定符。 即,如果该方法是类的一部分,您也可以像这样重载:

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

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

在一般意义上,函数返回值。方法只是执行操作。

你会看到很多教科书的例子是door.open()hood.open()(是的,我们都讨厌糟糕的汽车 -> OO 类比,但在这种情况下很明显(。这些是方法。你打开门,没有副产品。但是,它确实归结为必须如何打开门,而不是如何打开引擎盖;它们足够相似,可以共享操作,但在详细实现上有所不同(这是您理所当然地希望对用户隐藏的......门打开,而引擎盖打开(。

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

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