运算符重载和C ++中的运算符重写有什么区别?

时间:2010-09-27 12:55:25

标签: c++

C ++中运算符重载运算符覆盖之间的主要区别是什么?

8 个答案:

答案 0 :(得分:10)

Some use后一术语用于描述您定义自己的全局operator newoperator delete时所执行的操作。那是因为您自己的定义可以替换库中的默认版本。 C ++标准使用单词替换替换。使用“覆盖”有点令人困惑,因为该术语已用于由派生类中的函数覆盖的虚函数。

术语“重载”是用于定义自己的运算符函数的通用术语。即使操作员功能没有发生实际的重载,也会使用该术语。接近这个术语的一种方法是因为它“重载”了某些运算符的内置含义。

答案 1 :(得分:5)

我从未听过后一个词,但我认为它与第一个词相同。 运算符重载是您在运算符上下文中使用时为类提供函数的函数。例如,如果我有一个类point,并想要添加它们,例如a + b,我就必须创建一个operator+(point other)函数来处理它。

答案 2 :(得分:4)

通常,重载用于识别给定函数名称的多个签名何时。每个这样定义的函数都是函数名的重载。另一方面, override 仅存在于多态(C ++中的virtual)成员函数中,其中在派生方法中重新定义相同签名覆盖基类中提供的行为。

struct base {
   virtual void foo(); 
   void foo(int);      // overloads void foo()
};
struct derived : base {
   void foo();         // overrides void base::foo()
   void foo(int);      // overloads void derived::foo()
                       // unrelated to void::base(int)
};
int main() {
   derived d;
   base & b = d;
   b.foo( 5 );   // calls void base::foo(int)
   b.foo();      // calls the final overrider for void base::foo()
                 // in this particular case void derived::foo()
   d.foo( 5 );   // calls void derived::foo(int)
}

答案 3 :(得分:2)

好的功课问题。我会在这里帮助你...重载意味着2个方法具有相同的名称和不同的签名+返回类型。覆盖意味着具有SAME名称的2个方法,其中子方法具有不同的功能。这个练习就是你的例子。

答案 4 :(得分:2)

如果问题是关于函数重载和函数重写那么...... @ woot4moo解释了那件事。 就我的知识而言,我从未听说过“操作员压倒”。 运算符重载是为了为类的对象提供与该运算符相关的特殊功能,只要该运算符与该对象一起使用。 例如,一个类应该提供一个运算符(=)来始终防止浅层处理。(这与复制构造函数一起完成)。

答案 5 :(得分:0)

我猜“运算符覆盖”适用于在类中声明运算符并使其成为虚拟运算符。这是一件非常脆弱的事情 - 你通常会做更好的事情。

答案 6 :(得分:0)

重载覆盖之间的主要区别是 在重载时我们可以使用相同的函数名 不同任务的多次不同参数 在课堂上。 和覆盖意味着我们可以使用相同的名称功能名称 在派生类中使用相同的基类参数。 这也被称为程序中代码的可用性。

答案 7 :(得分:0)

如果派生类定义的功能与基类相同,则称为重写。 当函数名称相同但使用不同的参数来定义函数时,将导致重载。