class mydouble
{
public:
mydouble(double d)
{
m_data = d;
}
operator float() // 重载针对float的强制类型转换
{
return (float)m_data;
}
operator int() // 重载针对int的强制类型转换
{
return (int)m_data;
}
private:
double m_data;
};
这是一个非常简单的例子,不过它已经足以描述我要说明的问题。假如,我们有如下的一个函数:
print(int n)
{
printf("%d\n", n);
}
当我们如下来使用mydouble的时候:
mydouble dbl(234.33);
print(dbl); // 注意此处正隐式调用了operator int()函数
我们所定义的int型强制类型转换就会被调用。
我们看到,强制类型转换的操作符重载,很不符合我们的习惯。通常,函数都是需要定义一个返回类型的,不过,对于强制类型转换的操作符重载函数来说,因为我们已经知道它所需要获得的类型,从而就不再追加这样的一个累赘,而是将函数名与返回类型合并,给出一个简洁的形式。
强制类型转换,在函数调用的时候经常会被用到,而用的最为频繁的,估计会是CString类中的LPCTSTR强制类型转换。这个函数返回的是字符串的指针,从而可以使很多需要提供字符串的函数,可以直接传入CString的对象,比如下面的例子:
char sz1vName[64] = {0};
CString str("Tian");
strcpy(sz1vName, str); // 其实,此时调用了强制类型转换,将str转换成一个const char*的指针
显然,强制类型转换所带来的好处是不言而喻的,并且,实现它们也并不那么困难,那么我这里有一个思考题:为什么printf函数可以向下面那样使用呢?它使用了强制类型转换了吗?
printf("My name is %s\n", str);