文章来源于狄泰软件学院唐老师C++课程课件
一、类类型是否能够类型转换到普通类型?
#include<iostream>
#include<string>
using namespace std;
class Test
{
int mValue;
public:
Test(int i=0)
{
mValue=i;
}
int value()
{
return mValue;
}
};
int main()
{
Test t;
int i=(int)t;
return 0;
}
报错
二、类型转换函数
- 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()
{
return mValue;
}
};
int main()
{
Test t(100);
int i=t;
cout<<"t.value()="<<t.value()<<endl;
cout<<"i="<<i<<endl;
return 0;
}
t.value()=100
i=100
类型转换函数
- 与转换构造函数具有同等的地位
- 使得编译器有能力将对象转换成其他类型
- 编译器能够隐式的使用类型转换函数
编译器会尽力尝试让源码通过编译
Test t(1);
int i=t;
t这个对象为Test类型,怎么可能用于初始化int类型的变量呢,现在就报错吗?不急,先看看有没有类型转换函数。OK发现Test类中定义了operator int (),可以进行转换。
三、类类型之间的相互转换?
类型转换函数VS转换构造函数
实例分析:类类型之间的转换
#include<iostream>
#include<string>
using namespace std;
class Test;
class Value
{
public:
Value()
{
}
explicit Value(Test& t)
{
}
};
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类中无转换构造函数Value(Test &)时,operator Value()存在。
// Value v=t;
//等价于Value v=t.operator Value();
//Value类存在转换构造函数Value(Test &)时,operator Value()不存在。
Value v=t;
//等价于Value(t)
//Value类存在转换构造函数Value(Test&)时,operator Value()存在--》报错。解决方法在转换构造函数之前加explicit关键字。
cout<<"t.value()="<<t.value()<<endl;
return 0;
}
operator Value()
t.value()=100
- 无法抑制隐式的类型转换函数调用
- 类型转换函数可能与转换构造函数冲突
- 工程中以Type toType()的公有成员代替类型转换
Value toValue()
{
Value ret;
cout<<"operator Value()"<<endl;
return ret;
}
总结:
- C++类中可以定义类型转换函数
- 类型转换函数用于将类对象转换为其他类型
- 类型转换函数与转换构造函数具有同等的地位
- 工程中以Type toType()的公有成员代替类型转换函数。