Questions tagged «operator-overloading»

运算符重载是一种编程语言的功能,它允许根据所涉及的操作数的类型为运算符自定义实现。某些语言允许定义新的运算符,而其他语言仅允许重新定义现有运算符。

2
运算符重载:成员函数与非成员函数?
我读到一个声明为成员函数的重载运算符是不对称的,因为它只能有一个参数,而另一个自动传递的参数是this指针。因此,没有标准可以比较它们。另一方面,声明为a的重载运算符friend是对称的,因为我们传递了相同类型的两个参数,因此可以对其进行比较。 我的问题是,当我仍然可以将指针的左值与引用进行比较时,为什么首选朋友?(使用非对称版本可获得与对称相同的结果)为什么STL算法仅使用对称版本?

10
C#运算符是否为“ + =”重载?
我正在尝试为进行运算符重载+=,但我不能。我只能使操作符重载+。 怎么会? 编辑 这不起作用的原因是我有一个Vector类(带有X和Y字段)。考虑以下示例。 vector1 += vector2; 如果我的运算符重载设置为: public static Vector operator +(Vector left, Vector right) { return new Vector(right.x + left.x, right.y + left.y); } 那么结果将不会添加到vector1中,而是通过引用,vector1也将成为全新的Vector。



6
有没有办法在TypeScript中进行方法重载?
有没有办法用TypeScript语言进行方法重载? 我想实现以下目标: class TestClass { someMethod(stringParameter: string): void { alert("Variant #1: stringParameter = " + stringParameter); } someMethod(numberParameter: number, stringParameter: string): void { alert("Variant #2: numberParameter = " + numberParameter + ", stringParameter = " + stringParameter); } } var testClass = new TestClass(); testClass.someMethod("string for v#1"); testClass.someMethod(12345, "string for …

5
__lt__代替__cmp__
Python 2.x有两种方法可以重载比较运算符,__cmp__也可以是“丰富的比较运算符”,例如__lt__。 富比较重载据说是首选,但是为什么会这样呢? 丰富的比较运算符更易于实现,但是您必须使用几乎相同的逻辑来实现其中的多个运算符。但是,如果可以使用内建cmp和元组排序,则将__cmp__变得非常简单并完成所有比较: class A(object): def __init__(self, name, age, other): self.name = name self.age = age self.other = other def __cmp__(self, other): assert isinstance(other, A) # assumption for this example return cmp((self.name, self.age, self.other), (other.name, other.age, other.other)) 这种简单性似乎比重载所有6(!)丰富的比较要好得多。(但是,如果您依靠“交换参数” /反映的行为,则可以将其降低到“仅” 4,但根据我的拙见,这会导致并发症的净增加。) 如果我只是超负荷工作,是否需要注意任何不可预见的陷阱__cmp__? 我明白了<,<=,==等运营商也可以被重载用于其他目的,并且可以返回任何对象,他们喜欢。我并不是在问这种方法的优点,而只是在询问使用这些运算符进行比较时的区别,就如同它们对数字的含义一样。 更新:正如Christopher 指出的那样,cmp它在3.x中消失了。有没有其他选择可以像上面那样轻松实现比较__cmp__?

8
Javascript:运算符重载
我已经使用JavaScript了几天,现在我想为定义的对象重载运算符。 在Google搜索了一段时间后,您似乎无法正式执行此操作,但仍有一些人声称采取了一些漫长的方法来执行此操作。 基本上,我制作了Vector2类,并希望能够执行以下操作: var x = new Vector2(10,10); var y = new Vector2(10,10); x += y; //This does not result in x being a vector with 20,20 as its x & y values. 相反,我必须这样做: var x = new Vector2(10,10); var y = new Vector2(10,10); x = x.add(y); //This results in …

4
运算符<<必须正好接受一个参数
啊 #include "logic.h" ... class A { friend ostream&amp; operator&lt;&lt;(ostream&amp;, A&amp;); ... }; 逻辑文件 #include "a.h" ... ostream&amp; logic::operator&lt;&lt;(ostream&amp; os, A&amp; a) { ... } ... 当我编译时,它说: std :: ostream&逻辑:: operator &lt;&lt;(std :: ostream&,A&)'必须仅接受一个参数。 问题是什么?

18
运算符[] []重载
是否可能[]两次重载运算符?允许的是这样的:(function[3][3]例如在二维数组中)。 如果可能的话,我想看一些示例代码。




11
何时重载逗号运算符?
我经常在SO上看到有关在C ++中重载逗号运算符的问题(主要与重载本身无关,但类似序列点的概念),这让我感到奇怪: 什么时候应该使逗号超载?其实际用途有哪些例子? 我只是想不出我已经看到或需要的任何例子,例如 foo, bar; 在现实世界的代码中,所以我很好奇它何时被使用。

2
如何在C ++中重载一元负运算符?
我正在实现向量类,我需要得到一些向量的反义词。是否可以使用运算符重载来定义此方法? 这就是我的意思: Vector2f vector1 = -vector2; 这是我希望该运算符完成的操作: Vector2f&amp; oppositeVector(const Vector2f &amp;_vector) { x = -_vector.getX(); y = -_vector.getY(); return *this; } 谢谢。

2
C#中基于接口的编程的操作员重载
背景 我在当前项目上使用基于接口的编程,并且在重载运算符(特别是Equality和Inequality运算符)时遇到了问题。 假设条件 我正在使用C#3.0,.NET 3.5和Visual Studio 2008 更新-以下假设是错误的! 要求所有比较均使用Equals而不是operator ==并不是一个可行的解决方案,尤其是在将类型传递给库(例如Collections)时。 我担心要求使用Equals而不是operator ==的原因是,我在.NET指南中找不到它说它将使用Equals而不是operator ==甚至没有建议的地方。但是,在重新阅读《覆盖等于和运算符==的准则》之后,我发现了这一点: 默认情况下,运算符==通过确定两个引用是否指示同一对象来测试引用是否相等。因此,引用类型不必实现运算符==即可获得此功能。当类型是不可变的,即实例中包含的数据不能更改时,重载运算符==以比较值相等而不是引用相等是有用的,因为作为不可变对象,它们可以被认为与因为它们具有相同的价值。在非不可变类型中覆盖运算符==不是一个好主意。 这个平等的接口 当使用诸如Contains,IndexOf,LastIndexOf和Remove这样的方法测试是否相等时,IEquatable接口将由Dictionary,List和LinkedList等通用集合对象使用。应该为可能存储在通用集合中的任何对象实现它。 制约因素 任何解决方案都不必要求将对象从其接口转换为具体类型。 问题 当operator ==的两端都是接口时,没有底层具体类型的operator ==重载方法签名匹配,因此将调用默认的Object operator ==方法。 在类上重载运算符时,二进制运算符的至少一个参数必须为包含类型,否则会生成编译器错误(错误BC33021 http://msdn.microsoft.com/zh-cn/library/watt39ff .aspx) 无法在接口上指定实现 请参阅下面的代码和输出演示问题。 题 使用基于接口的编程时,如何为类提供适当的运算符重载? 参考文献 ==运算符(C#参考) 对于预定义的值类型,相等运算符(==)如果其操作数的值相等,则返回true,否则返回false。对于字符串以外的引用类型,如果==的两个操作数引用相同的对象,则返回true。对于字符串类型,==比较字符串的值。 也可以看看 码 using System; namespace OperatorOverloadsWithInterfaces { public interface IAddress : IEquatable&lt;IAddress&gt; { string StreetName { …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.