类的自动和强制类型转换
原始类型转换为自定义类型
可以用一个参数的构造函数来实现,例如:
class Student{
string s;
int grade;
Student(int i);
}
int main(void)
{
Student s;
s=11;//隐式调用构造函数来实现类型转换
s=Student(11);//显式调用构造函数
}
main函数中执行s=11这条语句时,先用构造函数临时构造一个Student变量,再将这个变量赋值给s,最终达到和类型转换相同的效果。
另外,如果声明了explicit关键字,那么不能隐式调用构造函数构造临时变量,只能显式调用:
//两种显式调用构造函数的方法
s=Student(11);
s=(Student)11;
这种转化方式也允许先进行原始类型之间的转换:
//先将double类型的参数转换为int类型,再进行类型转换
s=Student(11.3);
s=(Student)11.3;
s=11.3;
注意,这种构造函数可能引起二义性:
class Student{
string s;
int grade;
Student(int i);
Student(double d);
}
int main(void)
{
Student s;
//下面两个函数都会导致二义性
s=11;
s=Student(11);
}
在这种情况下,11既可以作为int参数调用构造函数,也可以先转换为double参数,然后调用构造函数。
将自定义类型转换为原始类型
将自定义类型转换为其他类型需要特定的转换函数:
转换函数有以下几个特点:
- 转换函数必须是类方法
- 转换函数不能指定返回类型
- 转换函数不能有参数
例如:
class Student{
string st;
int grade;
Student(int i);
operator double();
}
int main(void)
{
Student s;
s=11;
s=Student(11);
double d=s;//调用operator double()函数
}
转换函数也会导致二义性:
class Student{
string st;
int grade;
Student(int i);
operator double();
operator int();
}
int main(void)
{
Student s;
s=11;
s=Student(11);
double d=s;//调用operator double()函数,这样不会导致二义性
cout<<s;//导致二义性
}
在最后一句中,s既可以转换成double类型,也可以转换成int类型,因此会导致二义性。但是如果进行强制类型转换就不用担心这个问题:
cout<<<(double)s;//不会导致二义性
和构造函数一样,转换函数也可以用explicit关键字来表明必须使用显示类型转换。
我是霜_哀,在算法之路上努力前行的一位萌新,感谢你的阅读!如果觉得好的话,可以关注一下,我会在将来带来更多更全面的知识讲解!