C++转换函数(operator typeName())与规范

一.转换函数转换类

 

通常在将double类型的数字变成int类的时候,我们会使用强制转换。如下所属。

double a = 12.23;
cout<< int (a)<<endl;//输出的就是12了

如果我们想将一个类转换成数字呢?匪夷所思,但是可以。我们定义一个Stone类,即石头,储存其重量

class Stone{
private:
    double weight;
public:
    Stone(double a)
{
    weight = a;
}
    operator int()
{
    return int (weight);
}
#include <iostream>
#include "Stone.h"
using namespace std;
void test01();
int main() {

    test01();

    return 0;
}
void test01()
{
    Stone s = 10.2;
    cout<< int(s);
}

如此,便可将一个类转换成数字了。

注意点:

        1.转换函数必须是类方法;

        2.转换函数不能制定返回类型;

        3.转换函数不能有参数;

        4.虽然没有制定类型,但是在实现的时候是需要return 值的。

二.自动应用类型转换(二义性)

void test01()
{
    Stone s = 10.2;
    cout<< s;
}

隐式转换:

这里并没有使用转换函数将s对象转换成int类,直接就输出了s,得到的是10.因为在类的定义中只有这一条匹配,就自动使用了转换函数。但是在类中若有多个转换函数则不能自动转换了,因为存在了二义性

Stone::operator char() {
    return  char(weight);
}

在类的实现中插入了这么一条的话,上面的cout<<s将变成错误的了,因为存在二义性,编译器不能确定到底应该使用哪个转换函数。

三.隐式转换的危害以及防范(explict)

      在上文中说明了转换函数的隐式函数的用法,可能会感觉很方便,能够使程序员随心所欲的操作,但是这种操作可能会带来一些危害,而在大型工作中,我们更希望有严格与健壮的代码。危害如下所示:

int arr[20];
....我写啊写代码
Stone temp(13.2);
....我写阿写代码,加班好困好困
int Temp =1;
....我还在写,困死了
cout<<arr[temp]<<endl;//woc输出错了

看懂了吧,这种情况是可能出现的,因为我们通常用编辑器自动补全,我们觉得编辑器是知道他们的类型的,所以就按回车了。结果输入的是temp被自动转换成数字13了,从而输出了arr[13]而不是我们想要输出的arr[1];

因此可以使用关键字explict,在C++98中该关键字不能用于转换函数,但是在C++11中消除了这种限制,可以将转换运算符声明为显式的。

这样一来就好多了,安全可靠,真好。

class Stone {
private:
    double weight;
public:
    Stone(double a);
   explicit operator int();
};

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值