C++ Primer Plus读书笔记—— 11.6 类的自动转换和强制类型转换

其他类型转换为类类型

如果类的构造函数只接受唯一一个参数,那么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)。
比如:intlongdouble的转换都有可能造成精度的丢失。
编译器不会承担选择哪个构造函数的责任,于是编译无法通过。

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;
}

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/108268826
今日推荐