类型自动转换
在C++中,把接受一个参数的构造函数称作自动类型转换函数.
class A
{
private:
int a;
public:
A(){};
A(double d){a=d;}
~A(){std::cout<<"调用析构函数\n";}
void show(){std::cout<<a<<std::endl;}
}
定义了可以接受一个double类型的构造函数,我们就可以这样创建对象
int main()
{
A a;
a=3.4;//将double类型的值赋值给a对象
a.show();
return 0;
}
输出
3
调用析构函数
调用析构函数
这种赋值方式称为隐式类型转换,讲double类型的值赋值给A类型变量,将会调用A的构造函数A::A(double),产生一个临时变量,讲临时变量的内容给a.
有时候,这种隐式的转换方式可能会产生问题,比如:产生意料之外的类型转换
我们可以使用 explicit 关键字,关闭这种隐式转换方式.
explicit A(double b){a=b;}
这样,就不能使用隐式转换了,但是仍可以使用显示转换.
A a;
a=A(3.4);
使用显示转换看起来没有那么晦涩了.
当然,我们也可以使用该构造函数转换其他类型的数值,当类只有一个A(double)的构造函数时
A a(3);
a=A(3);
可以显示的将int转为double类型,然后使用A的构造函数,请注意为什么是只有一个,因为当函数从在二义性时,这种转换方式将出错.
如,我们在定义一个这样的构造函数
A(long l){a=l;}
我们继续使用
a=A(3)
会产生错误,因为编译器不知道该使用那个构造函数.
强制类型转换
上面是将基本类型转换为我们定义的类型,下面我们翻转一下.如何实现我们定义的类型转换为其他类型.
这里,我们使用C++的运算符函数—-转换函数
operator typename()
转换函数是用户定义的强制类型转换,例如我们经常使用
while (cin){
balabala...
}
这里while接受一个bool类型的值,如果有输入值的话需要cin为bool类型;
这里就可以使用强制类型转换.用我们上面的例子来说就是.
public:
operator bool()
{
return a;
}
这样我们就定义了一个从A类型到bool类型的转换函数.
我们可以使用这样的判断方式
if (a){
balabala...
};
同样亦可以转换为其他类型.
operator int()
operator double()
这里注意定义方式:
- 转换函数必须是类方法
- 转换函数没有返回值
- 转换函数没有参数
同样的,我们在使用这样的函数时,应注意避免产生二义性.毕竟编译器很严谨的.最好是使用显示类型转换或者是使用非转换函数替换.
A::operator int() {...}
替换为
int A::A2int() {...}