C++ 在类变量中使用assert()是一种好的做法吗?

C++ 在类变量中使用assert()是一种好的做法吗?,c++,assert,C++,Assert,例如: void Date::month(unsigned int inMonth) { assert(inMonth <= 12); _month = inMonth; } void Date::month(unsigned int in month){ 断言(月是的 这是正确的方法 虽然我会叫它setMonth()而不是month() 另外,请记住,assert()在发布版本中被预处理为零。因此,如果您想要在发布版本中也能工作的东西,请编写您自己的assert或进行适

例如:

void Date::month(unsigned int inMonth) {
    assert(inMonth <= 12);
    _month = inMonth;
}
void Date::month(unsigned int in month){
断言(月是的

这是正确的方法

虽然我会叫它
setMonth()
而不是
month()

另外,请记住,
assert()
在发布版本中被预处理为零。因此,如果您想要在发布版本中也能工作的东西,请编写您自己的assert或进行适当的运行时检查。

是的

这是正确的方法

虽然我会叫它
setMonth()
而不是
month()


另外,请记住,
assert()
在发布版本中被预处理为nothing。因此,如果您想要在发布版本中也能工作的东西,请编写自己的assert或进行适当的运行时检查。

没关系,您可以在应用程序中出现意外输入时进行断言。
此外,由于您不想设置无效的月份值,因此还可以抛出类似ArgumentException的异常。

这很好,只要是应用程序中的意外输入,您就可以断言它。
此外,由于您不想设置无效的月份值,因此还会抛出类似ArgumentException的异常。

另一种使代码更具可读性的方法是为月份定义枚举类型:

enum e_Month {
   e_Month_January,
   e_Month_February, 
   e_Month_March, 
   // etc..
   e_Month_December
};
现在,您的任务变成:

void Date::month(e_Month inMonth) { _month = inMonth; }

大多数编译器将另一种类型分配给枚举时会导致错误,因此您可以获得编译时安全性,使其始终在范围内。

另一种使代码更具可读性的方法是为月份定义枚举类型:

enum e_Month {
   e_Month_January,
   e_Month_February, 
   e_Month_March, 
   // etc..
   e_Month_December
};
现在,您的任务变成:

void Date::month(e_Month inMonth) { _month = inMonth; }

大多数编译器在为枚举分配另一个类型时都会导致错误,从而使编译时安全性始终在范围内。

您不应该使用assert来确保public成员函数的参数有效。原因是您的类的客户端无法在任何情况下对失败的断言作出反应有意义的方式(从发布版本中删除断言的事实也没有帮助)

根据经验,assert只能用于严格受您控制的事情(例如,私有方法的参数)

在这种情况下,最好抛出一个异常:

void Date::month(unsigned int month) 
{
    if(month == 0 || month > 12)
    {
        throw std::invalid_argument("a month must be in the [1-12] range"); 
    }
    _month = month;
}

您不应该使用assert来确保public成员函数的参数有效。原因是类的客户端无法以任何有意义的方式对失败的断言做出反应(从发布版本中删除断言的事实也没有帮助)

根据经验,assert只能用于严格受您控制的事情(例如,私有方法的参数)

在这种情况下,最好抛出一个异常:

void Date::month(unsigned int month) 
{
    if(month == 0 || month > 12)
    {
        throw std::invalid_argument("a month must be in the [1-12] range"); 
    }
    _month = month;
}
同意,但是如果公共方法中的
assert()
会导致性能问题(想想
vector::operator[]
),那么在公共方法中使用
assert()
可能会更好。但决不能使用
assert()
来验证外部数据,比如通过文件、套接字、键盘等进行输入(至少不是在生产代码中),而是
assert()
在公共方法中,如果
throw
导致性能问题(想想
vector::operator[]
),可能会更好。但决不能使用
assert()
来验证外部数据,如通过文件、套接字、键盘等进行输入(至少不在生产代码中)