解决方案
它的存在,如果你觉得有必要超载;对于所有预定义类型它本质上是一个空操作。
无操作一元算术运算器的实际应用是相当有限的,并且趋向于涉及在一个算术表达式使用值,而不是操作者本身的后果。例如,它可以被用来强制从较小的整数类型加宽到int
,或确保这样的表达式的结果被视为一个右值,因此不具有非const
参考参数相兼容。我提出,然而,这些用途更适合代码高尔夫比可读性。 : - )
其他提示
实际上,一元加 做 做某事——即使是在 C 语言中。它执行 常见的算术转换 操作数上并返回一个新值,该值可以是更大宽度的整数。如果原始值是宽度小于的无符号整数 int
, ,它将被更改为 signed
值也。
通常这并不那么重要,但它 能 有效果,所以是 不是 使用一元加作为一种“注释”表示整数是正数是个好主意。考虑以下 C++ 程序:
void foo(unsigned short x)
{
std::cout << "x is an unsigned short" << std::endl;
}
void foo(int x)
{
std::cout << "x is an int" << std::endl;
}
int main()
{
unsigned short x = 5;
foo(+x);
}
这将显示“x is an int”。
所以在这个例子中一元加创建了一个不同类型的新值 和 签名性。
从K&R第二版:
一元+是新与ANSI标准。它被添加为对称与一元 -
我已经看到了用于清楚起见,强调从负值正值作为不同:
shift(+1);
shift(-1);
但是,这是一个相当薄弱的使用。答案是肯定超载。
一件事内置一元+
确实正在转向左值到右值。例如,可以这样做
int x;
&x;
但你不能做到这一点。
&+x;
:)
P.S。 “重载”绝对不是正确的答案。一元+
被选自C继承而且也没有用户级操作者用C过载。
一元+完成最主要的是类型提升到比int小的数据类型的int。这是非常有用的,如果你想打印使用std::cout
作为数字数据字符数据。
char x = 5;
std::cout << +x << "\n";
是非常不同的从
char x=5;
std::cout << x << "\n";
这也适用于重载,但在实践中的过载的应该的是近NOP。
如果您需要打印调试或任何原因原始字节(存储为字符例如,小的数字)的数值,一元+可以简化打印代码。考虑
char c = 42;
cout << c << endl; // prints "*\n", not what you want in this case
cout << (int)c << endl; // prints "42\n", ok
cout << +c << endl; // prints "42\n", much easier to type
这仅仅是一个简单的例子。我相信还有其他的时候,一元+可以帮助治疗字节更像是数字,而不是像文本。
一个历史珍闻。 C99的标准化委员会也认为一元现有用途加了相当罕见的,由他们考虑重新使用,以实现在语言的另一个特点就是证明:抑制浮点常量表达式转换时的评价。请参见下面的引用从C理由,部分F.7.4:
的早期版本的本说明书允许的平移时间常数运算,但 授权一元+运算,当施加到操作数,以抑制翻译时 常量表达式的评估。
在结束时,将语义被颠倒,在大多数情况下执行(至少直到“如同”规则)运行时的评价,以及通过使用静态初始化的执行翻译时计算的能力。注意,主要区别在于浮点异常的发生,和其他浮点舍入或精度设置,当存在。
不多。允许operator+()
的过载一般的说法是有一定现实世界中使用重载operator-()
,这将是的非常的怪异(或不对称),如果你要允许超载operator-()
但不operator+()
。
我相信,我第一次读Stroustrop这种说法,但我没有我的书和我的权利,以验证它。我可能是错的。的
一元加号存在于C,其中它没有绝对没有(很像auto
关键字)。为了没有它,Stroustrup的将不得不引入用C无端的不相容性。
在它是在C ++中,人们很自然地允许过载功能,就像一元减号和Stroustrup的可能已经推出了它出于这个原因,如果它不是已经存在。
所以,这意味着什么。它可以作为作为排序的装饰,使事情看起来更加匀称,使用+1.5作为相反-1.5为例。在C ++中,它可以被重载,但它是怎么回事,如果operator+()
做任何事情是混乱。记住标准的规则:重载算术运算符的时候,做事情喜欢int
s做
如果你正在寻找一个理由,为什么它的存在,找到一些关于C的早期历史,我怀疑有没有很好的理由,因为下没有真正的设计。考虑无用auto
关键字(大概对比static
,现在的C ++ 0x被回收)和entry
关键字,它从来没有任何东西(后来在C90省略)。有一个著名的电子邮件中,里奇或Kernighan的说,当他们意识到运算符优先级有问题,有已经是三个安装有上千行的代码,他们不希望打破。
我无法引用任何来源,但我开始了解到它是用于显式类型提升,这意味着无损类型转换。这将其置于转换层次结构的顶部,
- 晋升:
new_type operator+(old_type)
- 转换:
new_type(old_type)
- 投掷:
operator(new_type)(old_type)
- 强迫:
new_type operator=(old_type)
当然,这是我对 15 年前读过的一本微软(非常古老的)c/c++ 手册中的注释的解释,所以请对此持保留态度。
#include <stdio.h>
int main()
{
unsigned short x = 5;
printf ("%d\n",sizeof(+x));
printf ("%d\n",sizeof(x));
return 0;
}
如上面的示例中所示,一元+真正改变类型,大小分别4和2。奇怪的是,表达+ x是确实的sizeof计算,我认为这是不应该。也许这是由于以下事实的sizeof具有相同的优先级一元+。
我想你可以用它来总是会让一些积极。只是重载一元+运算符是ABS。不值得混淆你的同胞开发商,除非你真的只是想混淆你的代码。然后,它会很好地工作。
修改完全重写了,因为我是waaaayyy掉在我原来的答复。
这应该让你处理你的类型为正值的明确声明(我想大多在非数学运算)。看来,否定会比较有用,但我想这里有一个地方可以有所作为的一个例子:
public struct Acceleration
{
private readonly decimal rate;
private readonly Vector vector;
public Acceleration(decimal rate, Vector vector)
{
this.vector = vector;
this.rate = rate;
}
public static Acceleration operator +(Acceleration other)
{
if (other.Vector.Z >= 0)
{
return other;
}
return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
}
public static Acceleration operator -(Acceleration other)
{
if (other.Vector.Z <= 0)
{
return other;
}
return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
}
public decimal Rate
{
get { return rate; }
}
public Vector Vector
{
get { return vector; }
}
}