C++类的显示转换和隐式转换

Aki 发布于 2023-10-31 194 次阅读


在 C++ 中,显示转换函数(explicit conversion function)和隐式转换函数(implicit conversion function)在声明和使用上有明显的区别。

  • 声明方式:显示转换函数使用 explicit 关键字进行声明,明确表示该函数只能通过显式调用进行类型转换。隐式转换函数不使用任何关键字进行声明,其类型转换将在需要时自动进行,无需显式调用。
  • 调用方式:显示转换函数必须通过显式调用进行类型转换,可以使用 static_castreinterpret_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;
}