一、非类类型转换为类类型
1、转换构造函数
接受一个参数的构造函数称之为转换构造函数
2、转换构造函数的形式
1)、只有一个参数的构造函数;
2)、构造函数有多个参数,除了第一个参数外其他参数都有默认值,则该构造函数也是转换构造函数
MyClass(double b); //转换构造函数 形式1
MyClass(double b, int c = 1, float d = 3.6); //转换构造函数 形式2
3、隐式转换
MyClass(double b); //转换构造函数
MyClass obj;
obj = 16.3;
上述代码将使用构造函数创建一个临时的MyClass对象,并将16.3作为初始值,然后采用逐成员赋值方式将该临时对象的内容复制到obj中,这一过程称为隐式转换
4、关闭隐式转换
在构造函数前面加关键字explicit即可禁止隐式转换
explicit MyClass(double b); //关闭隐式转换
5、显式(强制)转换
关闭隐式转换后,仍可进行显式强制转换
explicit MyClass(double b); //关闭隐式转换
MyClass obj;
obj = 16.3; //不允许
obj = MyClass(16.3); //强制转换 形式1
obj = (MyClass)16.3; //强制转换 形式2
二、类类型转换为非类类型
1、转换函数原型
operator typeName();
转换函数说明:
1)、typeName为最终转换后的类型,可以是内置类型、类类型以及由 typedef 定义的类型别名,任何可作为函数返回类型的类型(void 除外)都能够被支持。一般而言,不允许转换为数组或函数类型,转换为指针类型或引用类型是可以的。
2)、转换函数必须是类方法;
3)、转换函数不能指定返回类型;
4)、转换函数不能有参数;
5)、 类型转换函数一般不会更改被转换的对象,所以通常被定义为 const 成员;
6)、类型转换函数可以被继承,可以是虚函数;
7)、 一个类虽然可以有多个类型转换函数(类似于函数重载),但是如果多个类型转换函数要转换的目标类型本身又可以相互转换(类型相近),那么有时候就会产生二义性。
2、使用
#include <iostream>
using namespace std;
class Test
{
private:
float m_a;
float m_b;
public:
Test(float a, float b)
{
m_a = a;
m_b = b;
}
operator int() const
{
return m_a;
}
};
int main()
{
Test t(1.2, 2.3);
int a = t;
cout << "a = " << a << endl;
return 0;
}
运行结果:a = 1