一.转换函数转换类
通常在将double类型的数字变成int类的时候,我们会使用强制转换。如下所属。
double a = 12.23;
cout<< int (a)<<endl;//输出的就是12了
如果我们想将一个类转换成数字呢?匪夷所思,但是可以。我们定义一个Stone类,即石头,储存其重量
class Stone{
private:
double weight;
public:
Stone(double a)
{
weight = a;
}
operator int()
{
return int (weight);
}
#include <iostream>
#include "Stone.h"
using namespace std;
void test01();
int main() {
test01();
return 0;
}
void test01()
{
Stone s = 10.2;
cout<< int(s);
}
如此,便可将一个类转换成数字了。
注意点:
1.转换函数必须是类方法;
2.转换函数不能制定返回类型;
3.转换函数不能有参数;
4.虽然没有制定类型,但是在实现的时候是需要return 值的。
二.自动应用类型转换(二义性)
void test01()
{
Stone s = 10.2;
cout<< s;
}
隐式转换:
这里并没有使用转换函数将s对象转换成int类,直接就输出了s,得到的是10.因为在类的定义中只有这一条匹配,就自动使用了转换函数。但是在类中若有多个转换函数则不能自动转换了,因为存在了二义性。
Stone::operator char() {
return char(weight);
}
在类的实现中插入了这么一条的话,上面的cout<<s将变成错误的了,因为存在二义性,编译器不能确定到底应该使用哪个转换函数。
三.隐式转换的危害以及防范(explict)
在上文中说明了转换函数的隐式函数的用法,可能会感觉很方便,能够使程序员随心所欲的操作,但是这种操作可能会带来一些危害,而在大型工作中,我们更希望有严格与健壮的代码。危害如下所示:
int arr[20];
....我写啊写代码
Stone temp(13.2);
....我写阿写代码,加班好困好困
int Temp =1;
....我还在写,困死了
cout<<arr[temp]<<endl;//woc输出错了
看懂了吧,这种情况是可能出现的,因为我们通常用编辑器自动补全,我们觉得编辑器是知道他们的类型的,所以就按回车了。结果输入的是temp被自动转换成数字13了,从而输出了arr[13]而不是我们想要输出的arr[1];
因此可以使用关键字explict,在C++98中该关键字不能用于转换函数,但是在C++11中消除了这种限制,可以将转换运算符声明为显式的。
这样一来就好多了,安全可靠,真好。
class Stone {
private:
double weight;
public:
Stone(double a);
explicit operator int();
};