类的自动转换和强制类型转换

类型自动转换

在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() {...}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值