是否可以改变行为if()
:
class Foo {
int x;
};
Foo foo;
if(foo)
仅当 的值x
不是零时才继续?或者...
将用户定义的显式类型转换为 int 是否可行/这是一种合适的方法吗?或者...
最好做类似的事情if(foo.getX())
吗?
是否可以改变行为if()
:
class Foo {
int x;
};
Foo foo;
if(foo)
仅当 的值x
不是零时才继续?或者...
将用户定义的显式类型转换为 int 是否可行/这是一种合适的方法吗?或者...
最好做类似的事情if(foo.getX())
吗?
您可以通过定义将对象转换为布尔值operator bool()
:
explicit operator bool() const
{
return foo.getX();
}
该explicit
关键字防止隐式转换Foo
为bool
。例如,如果你不小心foo
输入了一个算术表达式,如果你声明为,foo + 1
编译器可以检测到这个错误,否则即使不是有意的也会被转换为。operator bool()
explicit
foo
bool
一般来说,形式的成员函数
operator TypeName()
(带有可选explicit
和const
限定符)是转换运算符。它允许您将您的类转换为TypeName
. 另一方面,具有一个参数的构造函数允许您将任何类型强制转换为您的类:
class Foo {
Foo(int x); // convert int to Foo
operator bool() const; // convert Foo to bool
int x;
};
这为您的类定义了隐式转换。如果可能,编译器会尝试应用这些转换(就像它对内置数据类型所做的那样,例如5 + 1.0
)。您可以将它们声明explicit
为抑制不需要的隐式转换。
您可以定义一个运算符将对象转换为bool
class Foo
{
int x;
public:
operator bool() const
{
return x > 0;
}
};
但这可能会产生意想不到的后果,因为隐式转换到bool
您不希望发生转换时。例如
int x = 42 + Foo();
C++11 解决了这个问题,允许您将转换运算符声明为explicit
,然后只允许在某些上下文中进行隐式转换,例如在if
语句中。
explicit operator bool() const // allowed in C++11
现在
int x = 42 + Foo(); // error, no implicit conversion to bool
int x = 42 + static_cast<bool>(Foo()); // OK, explicit conversion is allowed