在 C++ 中,显示转换函数(explicit conversion function)和隐式转换函数(implicit conversion function)在声明和使用上有明显的区别。
- 声明方式:显示转换函数使用
explicit
关键字进行声明,明确表示该函数只能通过显式调用进行类型转换。隐式转换函数不使用任何关键字进行声明,其类型转换将在需要时自动进行,无需显式调用。 - 调用方式:显示转换函数必须通过显式调用进行类型转换,可以使用
static_cast
、reinterpret_cast
或函数名调用等方式进行调用。隐式转换函数会在需要时自动进行类型转换,无需显式调用。例如,在赋值操作或函数参数传递时,编译器会自动调用隐式转换函数。 - 表达意图:显示转换函数明确表示一种有意的类型转换操作,强调开发者的意图,提高代码的可读性和明确性。隐式转换函数可能会导致意外的类型转换,代码的含义难以预测,可能会给代码理解和调试带来困难。
class MyInt
{
private:
int value;
public:
explicit MyInt(int v) : value(v) {} // 显式构造函数
int getValue() const
{
return value;
}
explicit operator int()const //显示转换函数,转换为int
{
return value;
}
operator bool()const // 隐式转换函数,转换为bool
{
if (value > 0)
{
return true;
}
else
{
return false;
}
}
};
void printValue(int num)
{
std::cout << num << std::endl;
};
int main()
{
MyInt myInt(42);
int intValue = myInt.getValue();
//显示调用
printValue(myInt.operator int());
printValue((int)myInt);
printValue(static_cast<int>(myInt));
//隐式调用
bool b = myInt;
if (myInt)
{
}
return 0;
}
Comments NOTHING