Tag: 运算符重载

如何防止通过“新”运营商分配课程? (我想确保我的RAII类总是分配在堆栈上。)

我想确保我的RAII类始终分配在堆栈上。 如何防止通过“新”运营商分配课程?

可以重写null-coalescing运算符?

是否有可能重写C#中的类的空合并运算符? 说例如我想返回一个默认值,如果一个实例是空的,如果不是,则返回实例。 代码看起来像这样: return instance ?? new MyClass("Default"); 但是,如果我想使用空合并运算符来检查MyClass.MyValue是否被设置? 当然,这并不是真正的需要(至less我是这么认为的) – 所以在你回答“你为什么要这么做”之前 – 我只是好奇,如果有可能的话 。

朋友声明声明一个非模板函数

我有一个基类类似于下面的代码。 我试图超载<<用于cout。 但是,g ++说: base.h:24: warning: friend declaration 'std::ostream& operator<<(std::ostream&, Base<T>*)' declares a non-template function base.h:24: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning 我已经尝试在类声明/原型之后添加<>。 但是,然后我得到它does not match any template declaration 。 我一直在试图让运营商的定义完全模板化(我想),但我只能得到它与以下代码,手动实例化运营商。 base.h […]

为什么Python有一个__ne__操作符方法而不是__eq__?

这里的答案提供了一个handwving的参考案例,你希望__ne__返回除__eq__的逻辑逆之外的东西,但我无法想象任何这样的情况。 任何例子?

为什么一些操作符只能作为成员函数被重载,其他的作为朋友函数,其余的都作为成员函数?

为什么一些运算符只能作为成员函数被重载,其他的则作为非成员的“自由”函数,其余的都作为成员函数? 这些背后的理由是什么? 如何记住哪些运算符可以被重载为(成员,自由,或两者)?

我可以在Objective-C中重载一个操作符吗?

是否可以重写在Objective-C中的运算符使用? 例如 myClassInstance + myClassInstance 调用一个自定义函数来添加这两个。

运算符<<必须采用恰好一个参数

啊 #include "logic.h" … class A { friend ostream& operator<<(ostream&, A&); … }; logic.cpp #include "ah" … ostream& logic::operator<<(ostream& os, A& a) { … } … 当我编译时,它说: std :: ostream&logic :: operator <<(std :: ostream&,A&)'必须只有一个参数。 问题是什么?

运算符在C#中使用基于接口的编程重载

背景 我在当前项目上使用基于接口的编程,并且在重载操作符(特别是Equality和Inequality操作符)时遇到了问题。 假设 我正在使用C#3.0,.NET 3.5和Visual Studio 2008 更新 – 以下假设是错误的! 要求所有的比较使用Equals而不是运算符==不是一个可行的解决scheme,尤其是当您的types传递到库(如集合)。 我担心需要使用Equals而不是运算符==的原因是,我无法在.NET指南中的任何地方find它会使用Equals而不是运算符==甚至提示它。 但是,在重新读取等式和运算符==的指导原则后,我发现: 默认情况下,运算符==通过确定两个引用是否指示相同的对象来testing引用相等性。 因此,引用types不必为了获得这个function而实现operator ==。 当一个types是不可变的,也就是说,实例中包含的数据是不能改变的,重载operator ==来比较值相等而不是引用相等可以是有用的,因为作为不可变对象,它们可以被认为是长因为它们具有相同的价值。 在非不可变types中重写operator ==不是一个好主意。 和这个Equatable接口 当在Contains,IndexOf,LastIndexOf和Remove等方法中testing相等性时,IEquatable接口被generics集合对象(如Dictionary,List和LinkedList)使用。 应该为可能存储在通用集合中的任何对象执行。 约束上 任何解决scheme都不一定需要将对象从接口转换为具体的types。 问题 当运算符==两端都是一个接口时,底层具体types中的operator ==重载方法签名将不匹配,因此将调用默认的Object operator ==方法。 在类上重载运算符时,二元运算符的至less一个参数必须是包含types,否则会生成编译器错误(错误BC33021 http://msdn.microsoft.com/en-us/library/watt39ff .aspx ) 无法在接口上指定实现 请参阅下面的代码和输出以显示问题。 题 在使用基于接口的编程时,如何为您的类提供正确的操作符重载? 参考 ==运算符(C#参考) 对于预定义的值types,如果操作数的值相等,则相等运算符(==)返回true,否则返回false。 对于string以外的引用types,如果其两个操作数引用同一个对象,则==返回true。 对于stringtypes,==比较string的值。 也可以看看 码 using System; namespace OperatorOverloadsWithInterfaces { public interface IAddress : IEquatable<IAddress> […]

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。

实际上是为什么重载&&和||的原因 不要短路?

运算符&&和||短路行为 是程序员的一个惊人的工具。 但为什么他们在重载时会失去这种行为? 我明白操作符只是函数的语法糖,但是bool的操作符有这种行为,为什么只能限制在这种单一的types呢? 这背后有没有技术推理?