问题标签 [operator-overloading]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
14 回答
2058 浏览

c++ - C++ 中的运算符重载是否比它们的价值更麻烦?

在我教授 C++ 的经验中,运算符重载是最让学生感到悲伤的话题之一。甚至在 stackoverflow 上查看问题:例如,将 + 运算符设为外部还是成员?怎么处理对称性等等,好像挺麻烦的。

当我从 C++ 迁移到 Java 时,我担心我会错过这种能力,但是除了 [] 或 () 之类的运算符之外,我真的从来没有觉得需要重载运算符。事实上,我觉得没有它们的程序更具可读性。

注意:我把它作为一个社区维基。让我们讨论一下。我想听听意见。

0 投票
4 回答
565 浏览

c++ - 重载 = 在 C++ 中

我正在尝试重载赋值运算符,如果可以的话,我想清除一些事情。

我有一个非成员函数,bool operator==( const MyClass& obj1, const myClass& obj2 )定义在我的班级之外。

由于显而易见的原因,我无法接触到我的任何私人成员。

所以我认为我需要做的是重载赋值运算符。并在非成员函数中进行赋值。

话虽如此,我认为我需要执行以下操作:

  1. 使用我的功能并使用strcpyor复制信息strdup。我用过strcpy
  2. 转到赋值运算符, bool MyClass::operator=( const MyClass& obj1 );
  3. 现在我们转到函数重载 (==) 并将 obj2 分配给 obj1。

我没有复制构造函数,所以我坚持这些:

因此,您可能会说,我完全迷失在这种超载中。有小费吗?我确实有一个完整的版本重载了相同的运算符,只有::,所以我的私人成员不会失去作用域。我将我的作业返回为 true,它适用于main. 这是我书中的例子。

重载赋值运算符然后在operator==非成员函数中进行转换是否有效?完成该步骤后,我能否在 main 中相互分配对象?

0 投票
1 回答
17890 浏览

python - 有没有办法在python中重载+=?

我知道__add__覆盖 plus 的方法,但是当我使用它来覆盖 += 时,我最终遇到了两个问题之一:

(1) 如果__add__自我变异,则

当我真的不希望 x 在那里发生变异时,会变异 x 。

(2) 如果__add__返回一个新对象,则

将返回没有 w 的东西,因为 z 和 tmp 在执行后指向不同的对象z += x

我可以制作某种方法,但如果可能的话.append(),我更愿意重载。+=

0 投票
3 回答
17748 浏览

c# - C# 中基于接口编程的运算符重载

背景

我在当前项目中使用基于接口的编程,并且在重载运算符(特别是 Equality 和 Inequality 运算符)时遇到了问题。


假设

  • 我正在使用 C# 3.0、.NET 3.5 和 Visual Studio 2008

更新 - 以下假设是错误的!

  • 要求所有比较都使用 Equals 而不是 operator== 不是一个可行的解决方案,尤其是在将类型传递给库(例如 Collections)时。

我担心要求使用 Equals 而不是 operator== 的原因是,我在 .NET 指南中找不到任何地方表明它将使用 Equals 而不是 operator== 甚至建议使用它。但是,在重新阅读了覆盖等于和运算符 == 的指南后,我发现了这一点:

默认情况下,运算符 == 通过确定两个引用是否指示同一个对象来测试引用是否相等。因此,引用类型不必实现 operator == 即可获得此功能。当类型是不可变的,即实例中包含的数据不能更改时,重载运算符 == 来比较值相等而不是引用相等可能很有用,因为作为不可变对象,它们可以被视为与 long 相同因为它们具有相同的价值。在非不可变类型中覆盖 operator == 不是一个好主意。

和这个Equatable Interface

IEquatable 接口由通用集合对象(例如 Dictionary、List 和 LinkedList)在 Contains、IndexOf、LastIndexOf 和 Remove 等方法中测试相等性时使用。应该为可能存储在通用集合中的任何对象实现它。


约束

  • 任何解决方案都不得要求将对象从它们的接口转换为它们的具体类型。

问题

  • 当 operator== 的两边都是接口时,没有来自底层具体类型的 operator== 重载方法签名将匹配,因此将调用默认的 Object operator== 方法。
  • 在类上重载运算符时,二元运算符的至少一个参数必须是包含类型,否则会产生编译器错误(错误 BC33021 http://msdn.microsoft.com/en-us/library/watt39ff .aspx )
  • 无法在接口上指定实现

请参阅下面演示该问题的代码和输出。


问题

在使用基于接口的编程时,如何为类提供适当的运算符重载?


参考

== 运算符(C# 参考)

对于预定义的值类型,相等运算符 (==) 如果其操作数的值相等则返回 true,否则返回 false。对于字符串以外的引用类型,== 如果它的两个操作数引用同一个对象,则返回 true。对于字符串类型,== 比较字符串的值。


也可以看看


代码


输出

0 投票
4 回答
10231 浏览

c++ - 赋值运算符是否适用于不同类型的对象?

对不起。发生了错误。赋值运算符有效吗?或者有什么办法可以做到这一点?[A类和B类之间没有关系。]

非常感谢。

0 投票
6 回答
13708 浏览

c++ - 运算符 = 用 C++ 中的常量变量重载

我想知道你们是否可以帮助我。

这是我的.h:

和我的主要:

我想做 operator= 功能。谁能帮我?注意 Doctor 上的 const 成员。

************编辑:********* 我的主要问题是我希望另一个类有一个属性,它是一个医生,就像一个病人有一个医生。但我希望能够改变我的医生。就像我正在看医生 A 但我想看医生 B。这将在我的其他班级 (Pacient) 中使用 setDoctor 函数来完成。如果是我编写代码,我会这样说:

然后更改指针。但是,我使用的是一位老师制作的基本代码,它的类定义如下:

但我认为这是不可能的,因为在 Patient 类中使用 setDoctor() 时,我要么制作副本,要么更改变量本身。第一个没有任何区别,第二个由于 const 是不可能的。我对吗?

0 投票
12 回答
26927 浏览

c# - C#中泛型类的算术运算符重载

给定一个通用类定义,例如

如何为它定义算术运算符?

以下无法编译,因为“+”运算符不能应用于类型“T”和“T”:

如您所见,泛型“T”受“where”关键字的约束,但我需要对具有算术运算符(IArithmetic?)的数字类型进行约束。

'T' 将是一个原始数字类型,例如 int、float 等。这些类型是否存在 'where' 约束?

0 投票
2 回答
7421 浏览

c# - 为什么我不能同时定义隐式和显式运算符?

为什么我不能像这样定义隐式和显式运算符?

不过你可以做这个黑客:)

这打印:

0 投票
2 回答
4731 浏览

c++ - C/C++ 替换/重定义规则?

我对 C/C++ 并不是特别陌生,但今天我发现了一些我没想到的东西。这在 gcc 中编译:

这不会:

这也不是:

同样在 g++ 中编译:

这不会:

这样做:

(替换标准的 new 操作符在上述所有情况下都有效。替换替换的 new 操作符是非法的,我知道。)

很容易看到一种模式,但是有人可以给我一个“标准”的解释吗?为什么我可以在 .c 或 .cc 文件中做我在 .h 文件中不能做的事情(重新定义旧的 typedef,替换非法替换的函数)?


谢谢回复。我省略了一些代码,包括标题保护。在最后一个 .cc 示例中,我将 HTML 编码为 << 为 & gt ;> 错误地忘记包含 cstdlib。我已经修复了代码,所以它可以编译。然而,我忽略的另一件事是#define _NEW,它被证明是至关重要的。显然在 GNU 中,<new> 的标头保护定义了 _NEW,所以我在这里定义它阻止了标准新标头的包含,所以我替换工作了

所以,是的,唯一无法解释的是我为什么可以在 .c/.cc 文件中多次重新键入定义内容,但不能像这样在 .h 中重新键入:

反正我也不想那样做,只是想知道。

编辑:谢谢,这真的回答了所有问题。将其更改为 xyz 不允许在给定范围内进行多个定义,这感觉不错。:) 我做这些小测试的原因是我正在为一个小型操作系统编写 C 和 C++ 的一个子集,但是由于我使用现有的库而没有删除任何东西来帮助我进行测试,所以我正在尝试弄清楚如何确保(1)我的代码在测试中被调用(例如我的新位置)和(2)我的代码不会与 GNU 库发生冲突。(1)的答案现在看起来很明显。我只是将标准 Xh 中的标头保护宏#define 到我的 Xh 中:)。

0 投票
5 回答
3661 浏览

python - 是否可以在 Python 中重载 ++ 运算符?

是否可以在 Python 中重载 ++ 运算符?