其他类型转换为类类型
如果类的构造函数只接受唯一一个参数,那么c++允许此参数的类型转换为类类型。
举例:
// example1
class A{
int x;
public:
A(int x):x(x){
}
};
A a = 1;
// example2
class A{
int x;
double y;
public:
A(int x,double y = 1.0):x(x),y(y){
}
};
A a = 1;
- 必须只接受一个参数,或者有多个参数同时除第一个都有默认值
- 如果为了防止这种隐式转换带来问题,可以给这个构造函数的前面的加上
explicit
关键字。
class A{
int x;
public:
explicit A(int x):x(x){
}
};
A a = A(1);
A a2 = (A)2;
// A a = 1 ; 不合法
类类型转换为其他类型
前面的转换使用的是构造函数。如果想要做到类类型到其他类型的转换,就必须使用c++运算符函数,转换函数。
语法:
- 必须是类方法
- 不能指定返回类型
- 不能有参数
operator typename(){
}
class A{
int x;
public:
A(int x):x(x){
}
operator int(){
return 2*x;
}
};
A a(1);
cout<<a<<endl; // 输出2
同样为了防止隐式转换。可以使用explicit
关键字。
也就是声明成explicit operator int(){return ……}
二义性问题
不论是第一种转换,还是第二种转换,都有可能造成二义性(ambiguous)。
比如:int
到long
、double
的转换都有可能造成精度的丢失。
编译器不会承担选择哪个构造函数的责任,于是编译无法通过。
class A{
long x;
double y;
public:
A(long x):x(x){
}
A(double y):y(y){
}
};
int main() {
A a(1);
return 0;
}
又比如
class A{
long x = 0;
double y = 0.0;
public:
operator long(){
return x;
}
operator double(){
return y;
}
};
int main() {
A a;
int x = a; // erro 转换有二义性
return 0;
}