首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重载+/-一元运算符

重载+/-一元运算符
EN

Stack Overflow用户
提问于 2009-04-22 20:00:16
回答 6查看 6.3K关注 0票数 3

对于不可变类型,当你重载-一元运算符时,你可以这样写它:

代码语言:javascript
复制
public static Point3 operator - (Point3 p)
{
    return new Point3 (-p.X, -p.Y, -p.Z);
}

但是对于+一元运算符,应该如何实现它呢?如下所示:

代码语言:javascript
复制
public static Point3 operator + (Point3 p)
{
    return p;
}

或者像这样:

代码语言:javascript
复制
public static Point3 operator + (Point3 p)
{
    return new Point3 (p);
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-04-22 20:03:53

无论哪种方式都可以。您不会在这两种方法中的任何一种中改变原始对象。

如果调用string.substring(0, string.length()),没有理由不能返回原始字符串。

您与不变性签署的唯一合同是,一旦创建了对象,它就不会改变。

票数 7
EN

Stack Overflow用户

发布于 2009-04-22 20:40:29

在我看来,这取决于Point3.Equals()的实现。

考虑以下代码:

代码语言:javascript
复制
Dictionary<Point3, string> cache;
Point3 pointA = new Point3(1, 2, 3);
Point3 pointB = new Point3(1, 2, 3);
cached[pointA] = "Value Aaa";
cached[pointB] = "Value Bbb";
Console.WriteLine(cached[pointA]);
Console.WriteLine(cached[pointB]);

如果Point3具有引用语义(当它们是同一对象时,则为pointA.Equals(PointB)),这将输出:

代码语言:javascript
复制
Value Aaa
Value Bbb

如果Point3具有值语义(当它们的x、y和z值相等时,pointA.Equals(PointB)),这将输出:

代码语言:javascript
复制
Value Bbb
Value Bbb

对于值语义,是否创建新对象实际上并不重要。您可能只需返回相同的内容,以避免创建垃圾。

如果您的类型具有引用语义,您可能希望一元加号创建一个新对象,以便它的行为与其他运算符相同。

票数 3
EN

Stack Overflow用户

发布于 2009-04-22 20:07:49

如果结构是不可变的,你可以选择,我会返回原始值。

如果是可变的,则返回一个新的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/778939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档