Fle*_*515 11 c++ if-statement operator-overloading type-conversion
是否有可能改变行为if():
class Foo {
int x;
};
Foo foo;
if(foo)
Run Code Online (Sandbox Code Playgroud)
只有当值x不是零时才进行?要么...
将显式的用户定义类型转换为int工作/将是一种合适的方法吗?要么...
最好做点什么if(foo.getX())?
Yan*_*ang 24
您可以通过定义operator bool()以下内容将对象转换为布尔值:
explicit operator bool() const
{
return foo.getX();
}
Run Code Online (Sandbox Code Playgroud)
的explicit关键字防止隐式转换从Foo到bool.例如,如果您不小心foo输入了类似的算术表达式foo + 1,则编译器可以在声明operator bool()为as时检测到此错误explicit,否则即使不是意图foo也将转换为bool.
一般来说,表单的成员函数
operator TypeName()
Run Code Online (Sandbox Code Playgroud)
(使用可选explicit和const限定符)是转换运算符.它允许您将类转换为指定的任何类型TypeName.在另一个方向,具有一个参数的构造函数允许您将任何类型转换为类:
class Foo {
Foo(int x); // convert int to Foo
operator bool() const; // convert Foo to bool
int x;
};
Run Code Online (Sandbox Code Playgroud)
这为您的类定义了隐式转换.如果可能,编译器会尝试应用这些转换(例如,它对内置数据类型的作用5 + 1.0).您可以声明它们是explicit为了抑制不需要的隐式转换.
Pra*_*ian 11
您可以定义将对象转换为的运算符 bool
class Foo
{
int x;
public:
operator bool() const
{
return x > 0;
}
};
Run Code Online (Sandbox Code Playgroud)
但是,这可能会产生意想不到的后果,因为bool当您不希望转换发生时会隐式转换.例如
int x = 42 + Foo();
Run Code Online (Sandbox Code Playgroud)
C++ 11允许您将转换运算符声明为explicit,从而仅允许在某些上下文中(例如在if语句中)进行隐式转换,从而解决了此问题.
explicit operator bool() const // allowed in C++11
Run Code Online (Sandbox Code Playgroud)
现在
int x = 42 + Foo(); // error, no implicit conversion to bool
int x = 42 + static_cast<bool>(Foo()); // OK, explicit conversion is allowed
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3575 次 |
| 最近记录: |