假设我有一个类,其中包含一个整数,它应该始终为正数,并带有一个简单的构造函数:
class A {
unsigned int x;
public:
A(unsigned int X) : x(X) {}
};
假设有人无意中创建了一个值为-5
的A对象。当然,这是无效的,因为现在MSB不再表示数字符号,所以X
将获得一个非常大的值。问题是,我现在无法确定该数字是负数还是无效的(也许可以通过按位操作?)。
我应该避免使用unsigned
,改用普通的int
吗?这样做,如果给定的值超出最大值或小于零,我就可以抛出异常。
希望听到一些建议。
注意:此翻译可能存在误差,仅供参考。
x
应该只为非负数,则使用unsigned
。 - Violet Giraffe-Wall -pedantic
以尽早捕获这些情况。 - sehex
需要在特定范围内,则传统的边界检查对于有符号或无符号类型都有效。如果A
的用户鲁莽,他可能会在构造函数中传递一个合理但完全错误的值(例如,从其他地方复制值而不进行检查)。 - DanielKOA
的用户将负数放入一个“unsigned int”中,那就是他自己的问题。接口清楚地表示数字必须是“unsigned”,客户端代码中发生的任何转换都不是你的责任。如果用户输入了“-5”,你可以假设他了解语言的工作原理并且确实想在其中输入“4294967291”或类似的值。如果该值对于你的“A”太大,则需要检查这种情况;如果它没有太大的问题,那么你的问题在哪里? - Christian Rau