您好我正在尝试理解c ++中函数重载和方法重载之间的区别。谷歌搜索后我遇到了这个。不确定这是否正确。如果错误请帮助纠正。
方法重载和函数重载是相关的概念。术语方法重载被定义为在各种编程语言(例如C ++和Java)中找到的特征。它允许创建具有相同名称的各种功能。但是,所有这些功能在输入类型和功能输出类型方面都各不相同。
另一方面,术语函数重载用于面向对象的编程。它被定义为一种技术,其中使用不同数量和/或类型的参数将具有相同名称的两个或多个函数彼此区分开。
答案 0 :(得分:4)
在C ++中方法通常用于引用类或结构的成员函数,而 功能是一个独立的非会员功能。
标准如何声明函数和方法?
根据C ++标准,函数声明定义如下: 8.3.5函数[dcl.fct]
在声明
T D
中D
的格式为D1 ( parameter-declaration-clause ) cv-qualifier-seqopt exception-specificationopt
并且声明
contained declarator-id
中T D1
的类型是“derived-declarator-type-listT”, {{1}中声明者id的类型是{em>“(D
)parameter-declaration-clause
返回cv-qualifier-seqopt
”的“derived-declarator-type-list function ;这种形式的类型是函数类型86)。
请注意,标准在#4中进一步陈述:
T
只能是非静态成员函数的函数类型的一部分
仅汇总方法(成员函数)可以是cv-qualifier-seq
或const
。
重载功能和标准的标准方法重载:
因此,重载函数和重载方法(成员函数)具有不同的标准
当且仅当:
时,才能进行函数重载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限定符。即如果方法是类的一部分,你也可以像这样重载:
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一起使用的详细信息,并会相应地更改输出。
有很多函数重载的例子,这个简单地演示了不同的参数如何影响所用函数的逻辑和输出。