上一篇文章写了关于普通类型转换为类类型的语法与性质,今天我们来看一下:类类型如何转换为普通类型。
一、类型转换函数:
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语言,数据结构等技术问题。