通常在将double类型的数字变成int类的时候,我们会使用强制转换。如下所属。
double a = 12.23; cout<< int (a)<如果我们想将一个类转换成数字呢?匪夷所思,但是可以。我们定义一个Stone类,即石头,储存其重量
class Stone{ private: double weight; public: Stone(double a) { weight = a; } operator int() { return int (weight); }#include#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<
三.隐式转换的危害以及防范(explict)在上文中说明了转换函数的隐式函数的用法,可能会感觉很方便,能够使程序员随心所欲的操作,但是这种操作可能会带来一些危害,而在大型工作中,我们更希望有严格与健壮的代码。危害如下所示:
int arr[20]; ....我写啊写代码 Stone temp(13.2); ....我写阿写代码,加班好困好困 int Temp =1; ....我还在写,困死了 cout<看懂了吧,这种情况是可能出现的,因为我们通常用编辑器自动补全,我们觉得编辑器是知道他们的类型的,所以就按回车了。结果输入的是temp被自动转换成数字13了,从而输出了arr[13]而不是我们想要输出的arr[1];
因此可以使用关键字explict,在C++98中该关键字不能用于转换函数,但是在C++11中消除了这种限制,可以将转换运算符声明为显式的。
这样一来就好多了,安全可靠,真好。
class Stone { private: double weight; public: Stone(double a); explicit operator int(); };



