C++深度解析 类型转换函数(下) --- 类类型 转换到 普通类型,类类型之间的转换(41)
类类型转换到普通类型
类型转换函数:
operator Type()
{
Type ret;
// ......
return ret;
}
类型转换函数:
与转换构造函数具有同等的地位
使得编译器有能力将对象转化为其他类型
编译器能够隐式的使用类型转换函数
示例程序:
#include <iostream>
#include <string>
using namespace std;
class Test
{
int mValue;
public:
Test(int i = 0)
{
mValue = i;
}
int value()
{
return mValue;
}
//类型转换函数 Test转换到int
operator int ()
{
return mValue;
}
};
int main()
{
Test t(100);
//t代表100整形值
int i = t; // 隐式类型转换,int i = t.operator int()
cout << "t.value() = " << t.value() << endl;
cout << "i = " << i << endl;
return 0;
}
结果:
分析:
Test t(1); int i = t; t这个对象为Test类型,怎么可能用于初始化int类型的变量!现在就报错吗?不急,我看看有没有类型转换函数!Ok,发现Test类中定义了operator int(),可以进行转换。
通过类型转换函数,将一个类的对象转换成另一个类类型对象
转换构造函数 VS 类型转换函数
示例程序:
#include <iostream>
#include <string>
using namespace std;
class Test;
class Value
{
public:
Value()
{
}
//转换构造函数
explicit Value(Test& t)
{
}
};
class Test
{
int mValue;
public:
Test(int i = 0)
{
mValue = i;
}
int value()
{
return mValue;
}
//类型转换函数 Test类对象转换到Value类对象
operator Value()
{
Value ret;
cout << "operator Value()" << endl;
return ret;
}
};
int main()
{
Test t(100);
Value v = t; // 等价于:Value(t) Value v = t.operator Value();
return 0;
}
结果如下:
分析:转换构造函数和类型转换函数,它们是互利的。进行类类型转换时,有可能产生冲突,编译器不知道如何选择它们当中的哪一个,我们应该在转换构造函数之前添加explicit关键字,作用是编译器不主动调用转换构造函数。
无法抑制隐式的类型转换函数调用
类型转换函数可能与转换构造函数冲突
工程中以Type to Type()的公有成员代替类型转换函数3
示例程序:
#include <iostream>
#include <string>
using namespace std;
class Test;
class Value
{
public:
Value()
{
}
//转换构造函数
explicit Value(Test& t)
{
}
};
class Test
{
int mValue;
public:
Test(int i = 0)
{
mValue = i;
}
int value()
{
return mValue;
}
//代替类型转换函数,Test类对象转换到Value类对象
Value toValue()
{
Value ret;
cout << "operator Value()" << endl;
return ret;
}
};
int main()
{
Test t(100);
Value v = t.toValue();
return 0;
}
结果如下:
小结
C++类中可以定义类型转换函数
类型转换函数用于将类对象转换为其他类型
类型转换函数与转换构造函数具有同等的地位
工程中以Type toType()的公有成员代替类型转换函数