注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。
测试环境:Ubuntu 10.10
GCC版本:9.2.0
一、问题
类类型是否能够类型转换到普通类型?
二、类型转换函数
1)C++类中可以定义类型转换函数
2)类型转换函数用于将类对象转换为其它类型
3)语法规则:
operator Type()
{
Type ret;
//...
return ret;
}
编程实验
类型转换函数初探
42-1.cpp
#include <iostream>
#include <string>
using namespace std;
class Test
{
int mValue;
public:
Test(int i = 0)
{
mValue = i;
}
int value()
{
return mValue;
}
operator int () //类型转换函数
{
return mValue;
}
};
int main()
{
Test t(100);
int i = t; //等价于t.operator int(),t返回100
cout << "t.value() = " << t.value() << endl;
cout << "i = " << i << endl;
return 0;
}
操作:
1) g++ 42-1.cpp -o 42-1.out编译正确,打印结果:
t.value() = 100
i = 100
三、类型转换函数
1)类型转换函数
- 与转换构造函数具有同等的地位
- 使得编译器有能力将对象转化为其它类型
- 编译器能够隐式的使用类型转换函数
2)编译器会尽力尝试让源码通过编译
\
3)类型转换函数
类类型之间的相互转换?!类型转换函数 vs 转换构造函数
编程实验
类类型之间的转换
42-2.cpp
#include <iostream>
#include <string>
using namespace std;
class Test;
class Value
{
public:
Value()
{
}
explicit Value(Test& t) //转换构造函数 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;
}
/*
Value toValue() //公有成员代替类型转换函数。和上边效果一致
{
Value ret;
cout << "operator Value()" << end;
return ret;
}
*/
};
int main()
{
Test t(100);
Value v = t; //等价于t.operator Value();
//1、如果定义转换构造函数,注释转换构造函数,上一行代码也可以,等价Value(t)
//2、如果转换构造函数和类类型转换函数都存在,可能会发生冲突,报错
return 0;
}
操作:
1) g++ 42-2.cpp - o 42-2.out编译正常,打印结果:
operator Value()
分析:
执行Value v = t;时t被编译器隐式转换成t.operaotr Value()(调用了类型转换函数)。
1)无法抑制隐式的类型转换函数调用
2)类型转换函数可能与转换构造函数冲突
3)工程中以Type toType()的公有成员代替类型转换函数
#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;
}
打印结果:
i = -255
d = -255
s = -255
小结
1)C++类中可以定义类型转换函数
2)类型转换函数用于将类对象转换为其它类型
3)类型转换函数与转换构造函数具有同等的地位
4)工程中以Type toType()的公有成员代替类型转换函数