C++类类型转换

转换构造函数和类型转换运算符共同定义了类类型转换,这样的转换有时也被称为用户定义的类型转换。

类型转换运算符

类型转换运算符时类的一种特殊的成员函数,它负责将一个类类型的值转换称其它类型,和转换构造函数的功能恰恰相反,一般形式如下:

operator type() const;

其中type表示类型,类型转换运算符可以面向任意类型进行定义,只要该类型能作为函数的返回类型。类型转换运算符既没有显式的返回类型,也没有形参,而且必须定义称类的成员函数。类型转换运算符通常不应该改变待转换对象的内容,因此,类型转换运算符一般被定义为const成员。

class MyInt {
public:
	//转换构造函数
	MyInt(int value = 0) :value_(value) {};
	//类型转换运算符
	operator int() const { return value_;};
private:
	int value_;
};

int main()
{
	MyInt a;
	a = 10;
	std::cout << a + 20 << std::endl;//a被隐式转换为int
	system("pause");
}

正确使用类型转换运算符能极大简化类设计者的工作,同时使得使用类更加容易,但是如果类类型和转换类型之间不存在明显的映射关系,这样的类型转换可能具有误导性。

在实践中,类很少提供类型转换运算符,大多数情况下如果类型转换自动发生,用户可能会比较意外,而不是感到受了帮助。但是定义向bool类型的转换还是比较普遍的现象。

类型转换运算符可能产生意外结果

在早期C++标准库中istream可以隐式转换为bool,下面代码中std::cin会被转换为bool,然后提升为int进行左移运算,导致代码能编译通过。

int main()
{
	int i = 1;
	std::cin << i;
	system("pause");
}

为了防止这样的异常情况发生,C++11引入了显式的类型转换运算符,方法是在类型转换运算符前面加上explicit,这样当类型转换是显式时才能执行类型转换,该规定存在一个例外,如果表达式被用作条件,则编译器会将显式的类型转换自动应用于它。

避免有二义性的类型转换

不要为类定义相同的类型转换,例如当A类定义了一个接受B类对象的转换构造函数,同时B类定义了一个转换目标是A类的类型转换运算符。

如果类中定义了多个转换源或转换目标,当这些转换源类型或转换目标类型可以通过其它类型转换联系在一起,也会产生二义性问题。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页