初始化不正确的价值不良样式后,正在抛出异常



是以下定义不良样式还是明显错误?也就是说,在 iNTIAL时,投掷是错误的吗?

myClass::myClass(int arg) : value(arg)
   {
    if (value < 0)
       throw (myException("Negative value not allowed!"));
   }

似乎最好使用Intializer-list而不是分配体内的值,而且据我了解,如果我在上抛出

如果参数不在有效范围内,则允许使用初始化列表,并在初始化值之前投掷:

inline int RequirePositive(int value)
{    
    if (value < 0) throw (myException("Negative value not allowed!"));
    return value;
}
class myClass {
    myClass(int arg) : value(RequirePositive(arg)) {}
};

如果 value age> = 0是类不变的,那么您实际上只有几个可能性。一种是编写CTOR以接受unsigned参数,因此一个值&lt; 0根本不可能。另一个是抛出例外。

但是,是的,如果用户传递一个无法创建有效对象的值,那么抛出异常是完全可以接受的(通常是正确的做法)。构造函数的责任是创建一个有效的对象。如果它传递了一个无法创建有效对象的值,而异常通常是正确的响应。

提出异常时:至少在这种情况下,这并不重要。例外将使当前对象的创建倒退,因此它永远不会存在。如果先测试值更快,而不是复制该值,那么如果它无效,则可能会有所作为。诸如int之类的东西几乎无关紧要。如果您有一棵大树,并且可以通过仅查看树的根节点来确定它是否有效,那么先检查该节点可能会更好,而仅复制三个节点如果有效。

后者显然是一种优化,但可以是足够大且足够简单的,即使不进行分析也可能值得(可以说,避免悲观的优化不太优化)。

您正在使用内置类型的初始化列表,您没有获得任何性能优势,所以为什么不在构造函数主体内部检查后将分配给成员变量。在您的情况下,您有一半创建的非法对象,而不是创建一半的法律对象。那么,为什么完全给物体任何无效的状态,只是在片刻之后被销毁。

可以从构造函数上抛出异常(在大多数情况下,不是灾难函数)。如果您不能做任何对它们所经过的价值的含义,即碰到0的负值,那么抛出一个例外似乎是要做的,毕竟您无法创建法律对象。

您可以使用未签名的INT?0至4,294,967,295。使呼叫者更明确地,值必须为0。

,除非该类是在紧密的循环中多次初始化的,否则额外功能的性能损失都可以忽略不计。与不当初始化的班级所做的损害相比,这是一个很小的代价!特别是考虑到"不良值"可能是用户输入的结果,因此生成的问题可能很难报告/故障排除

我不会这样做。只需使用使用您的班级的人就会理解这是明智的原因的方法。

最新更新