知道了普通类型可以转换成类类型,那么类类型可不可以向普通类型转换呢?为了求证,写几行测试代码试试:
创建一个类,只包含一个私有成员变量,一个构造函数,一个普通成员函数。
class Test
{
int mValue;
public:
Test(int i = 0)
{
mValue = i;
}
int value()
{
return mValue;
}
};
当创建一个Test对象并初始化后是否能够将对象赋值给一个整型变量呢?
Test t(10);
int i = t;
能编译过吗?不能。
Test t(100);
int i = (int)t;
强制类型转换呢?还是不能。
这下怎么办?
别急,有办法的。
试试将int类型重载下;
operator int ()
{
return mValue;
}
在函数名前面不能指定函数类型,函数没有参数。其返回值的类型是由函数名中指定的类型名来确定的。类型转换函数只能作为成员函数,因为转换的主体是本类的对象。不能作为友元函数或普通函数。所以这个类不仅保留了原先类的特性还增加了int类型数据属性。
再试试能够赋值不:
Test t(10);
int i = t;//等价于i = t.operator int();//返回值是int类型
cout << "t.value() = " << t.value() << endl;
cout << "i = " << i << endl;
不仅编译通过,而且两个打印出来的值相等,说明什么?说明赋值成功了。那这是什么情况?
前面实现的重载函数叫做类型转换函数,用于将类对象转换成普通类型,它与转换构造函数具有同等地位使得编译器有能力将类对象转换成其他类型,但编译器也能隐式的使用类型转换函数,而前面调用就属于隐式转换,这下我们就应该警觉了。
既然能进行类类型到普通数据类型那么能否从类类型到类类型的转换呢?当然能,重载一下就好了。
如果一个程序里既有转换构造函数又有类型转换函数会发生什么?编译器的回答是 ambiguous,模糊的,表示编译器也不知道该怎么办了,出现了二义性。
解决办法就是在转换构造函数前加上关键字 explicit就能防止编译器隐式调用了,所以它只能调用类型转换函数。
实际工程中是不希望进行隐式调用的,所以以 type totype();形式的公有成员函数代替类型转换函数,比如Qt中的QString类,一个字符串"123",可以 通过调用toInt()或toDouble()进行类型间的转换。