上一篇文章写了关于普通类型转换为类类型的语法与性质,今天我们来看一下:类类型如何转换为普通类型。
一、类型转换函数:
C++类中,可以定义类型转换函数,类型转换函数用于将类对象转换为其他类型。
语法规则:
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;}operator int () //转换构造函数{int ret = mValue; //这里相当于有一个转换,类的值给int了return ret;;}
};int main()
{ Test t(100);int i = t; //等价于:i = t.operator int() ;相当于隐式的调用了成员函数operator int ()cout << "t.value() = " << t.value() << endl;cout << "i = " << i << endl;return 0;
}
运行结果为:
t.value() = 100
i = 100
由运行结果知,我们成功的将一个类类型的值赋值给int类型,所以说,类类型,已经成功转换为int类型。
可以看看下图的巧妙的解释:
那么总结一下类类型的一些特点:
- 与转换构造函数具有同等的地位
- 使得编译器有能力将类类型转换为其他类型
- 编译器能够隐式的使用类型转换函数
二、类类型之间的转换
上面讲了类类型转换为其他类型,那么类类型转换为类类型呢?
语法与类型转换函数类似,只不过我们类型转换函数的类型,改为类类型即可:
operator class() //这个class是一个类对象,在这里是需要将它转换为另一个类类型
{class ret;...return ret;
}
看这个规则不如直接写一段代码,下面我们还是来直接写一段代码来分析吧:
#include <iostream>
#include <string>using namespace std;class Test;class Value
{
public:Value(){}explicit Value(Test& t) //与下面的operator Value()互斥(他们均能被隐式的自动调{ //用),所以加上explicit关键字让它只能被显示的调用}
};class Test
{int mValue;
public:Test(int i = 0){mValue = i;}int value(){return mValue;}operator Value() //类类型转换为类类型时调用的函数{Value ret;cout << "operator Value()" << endl;return ret;}
};int main()
{ Test t(100);Value v = t; //等下于v = t.operator Value()return 0;
}
运行结果:
operator Value()
编译通过没有报错,说明这一句:Value v = t;是可以被编译通过的,Test类类型转换为Value类类型成功。
而这里写成 explicit Value(Test& t),加上explicit是因为:编译器无法抑制隐式的类型转换函数,那么它与下面的operator Value()互斥,当编译到Value v = t这里时,需要隐式调用转换函数,可以调用Value(Test& t) ,也可以调用 operator Value(),这个时候编译器就会犯难,报错!!!所以在Value(Test& t) 前面加上抑制隐式;类型调用的关键字:explicit。
既然类型转换函数与转换构造函数会产生冲突,那么工程中是如何解决的呢?
在QT这种非常成熟的编译器里,都是用type toType()公有成员函数代替类型转换函数的。
看下面一个在QT中编写的函数,就很好理解了:
#include <QDebug>
#include <QString>int main()
{QString str = "";int i = 0;double d = 0;short s = 0;str = "-255";i = str.toInt(); //核心在这三个调用d = str.toDouble();s = str.toShort();qDebug() << "i = " << i << endl;qDebug() << "d = " << d << endl;qDebug() << "s = " << s << endl;return 0;
}
三、总结:
- C++类中可以定义类型转换函数
- 类型转换函数用于将类对象转换为其他类型
- 类型转换函数与转换构造函数具有同等的地位
- 工程中用Type toType()公有的成员函数代替类型转换函数
想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。