Tag: 运算符重载

是什么让Scala的运算符重载“好”,但C ++的“坏”?

C ++中的运算符重载被许多人认为是一件坏事(tm),并且在新语言中不会重复。 当然,这是deviseJava时特别放弃的一个特性。 现在我已经开始阅读Scala,我发现它看起来非常像运算符重载(尽pipe在技术上它没有运算符重载,因为它没有运算符,只有函数)。 然而,在C ++中,运算符重载似乎没有什么本质的区别,我记得运算符被定义为特殊函数。 所以我的问题是什么使得在Scala中定义“+”的想法比在C ++中更好?

== ==和`!=`是否相互依赖?

我正在学习C ++中的运算符重载,我发现==和!=只是一些特殊的函数,可以为用户定义的types定制。 但是,我担心为什么需要两个单独的定义? 我认为如果a == b是真的,那么a != b自动为false,反之亦然,并且没有其他可能性,因为根据定义, a != b是!(a == b) 。 而且我无法想象任何情况都不是这样的。 但也许我的想象力是有限的,或者我对某些事情一无所知? 我知道我可以用另一个来定义一个,但这不是我所问的。 我也没有问及通过价值或身份来比较对象的区别。 或者两个对象是否可以同时相等和不相等(这绝对不是一种select!这些东西是相互排斥的)。 我问的是这样的: 有没有什么情况可以提出关于两个对象相同的问题是有道理的,但是询问他们是不是平等的没有意义? (无论是从用户的angular度,还是从实施者的angular度来看) 如果没有这种可能性,那么为什么C ++将这两个运算符定义为两个不同的函数呢?

如何覆盖运算符?

在Python中为类重写[]运算符(下标符号)的方法的名称是什么?

重载运算符==与Equals()

我正在开发一个C#项目,到目前为止,我已经使用了不可变的对象和工厂来确保types为Foo对象始终可以与==进行比较。 Foo对象一旦创build就无法更改,工厂总是为给​​定的参数集返回相同的对象。 这很好,而且在整个代码库中,我们假设==总是用于检查相等性。 现在我需要添加一些function,引入一个边缘情况,这不会总是工作。 最简单的做法是重载operator ==这个types,这样项目中的其他代码都不需要改变。 但是,这使我感到代码味道:重载operator ==而不是Equals看起来很奇怪,我习惯于==检查引用相等的约定,而Equals检查对象相等(或任何术语)。 这是一个合理的关注,或者我应该继续并重载运operator == ?

何时超载逗号运算符?

我常常在C ++上看到关于重载逗号操作符的问题(主要与重载本身无关,但是像序列点的概念),这让我怀疑: 你应该什么时候超过逗号? 什么是它的实际用途的一些例子? 我只是想不出任何我曾经见过或需要的东西 foo, bar; 在真实世界的代码中,所以我很好奇什么时候(如果有的话)这是实际使用的。

为什么赋值运算符要返回对象的引用?

我正在修改我的C ++,而且我正在处理操作符重载,特别是“=”(赋值)操作符。 我在网上查找,并且遇到了多个讨论它的主题。 在我自己的笔记中,我把所有的例子都取下来了 class Foo { public: int x; int y; void operator=(const Foo&); }; void Foo::operator=(const Foo &rhs) { x = rhs.x; y = rhs.y; } 在我在网上find的所有参考资料中,我注意到操作符返回了一个对源对象的引用。 为什么正确的方式返回对象的引用而不是什么都没有?

强制一些运营商成为会员的理由

C ++中有4个运算符可以重载,但不能作为独立(又称非成员,独立)函数重载。 这些运营商是: operator = operator () operator -> operator [] 这个线程很好地解释了禁止operator =作为非成员函数的原理。 关于其他三个任何想法?

__lt__而不是__cmp__

Python 2.x有两种方法来重载比较运算符__cmp__或“丰富的比较运算符”,如__lt__ 。 据说比较超负荷的比较优先,但为什么这样呢? 丰富的比较运算符更容易实现,但是您必须以几乎相同的逻辑来实现其中的几个运算符。 但是,如果你可以使用内build的cmp和tuple命令,那么__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__ ? 我知道< , <= , ==等操作符可以被重载用于其他目的,并且可以返回任何他们喜欢的对象。 我并不是在质疑这种方法的优点,而仅仅是关于使用这些运算符进行比较的意义上的差异,这些差异意味着数字。 更新:正如克里斯托弗指出的 , cmp正在3.x中消失。 是否有任何替代品,使得执行比较像上面的__cmp__一样简单?

当操作符&重载时,如何可靠地获取对象的地址?

考虑下面的程序: struct ghost { // ghosts like to pretend that they don't exist ghost* operator&() const volatile { return 0; } }; int main() { ghost clyde; ghost* clydes_address = &clyde; // darn; that's not clyde's address :'( } 我如何得到clyde的地址? 我正在寻找一种解决scheme,将同样适用于所有types的对象。 一个C ++ 03解决scheme会很好,但我也对C ++ 11解决scheme感兴趣。 如果可能的话,让我们避免任何特定于实现的行为。 我知道C ++ 11的std::addressof函数模板,但我不想在这里使用它:我想了解一个标准库实现者可能如何实现这个函数模板。

重载新/删除

我在我的程序中做了一个内存泄漏查找程序,但我的方式超载新的和删除(也是新的[]和删除[])似乎没有任何事情。 void* operator new (unsigned int size, const char* filename, int line) { void* ptr = new void[size]; memleakfinder.AddTrack(ptr,size,filename,line); return ptr; } 上面的代码片段显示了我重载new的方式。 我想这是运营商返回void *的东西,但我不知道该怎么办。