C++:类的自动转换和强制类型转换

C++:类的自动转换和强制类型转换

标签(空格分隔): c++
作者:陈小默


C++如何处理内置类型转换

C++为内置的基本数据类型提供了自动的转换方式,即使这种转换并不安全。比如,我们可以使用下列语句而不报错。

long count = 8;
double time = 11;
int side = 3.33;

上述语句是可行的,因为在C++看来,这些数值都是相同的数据类型——数字。C++不会自动转换不兼容的类型,比如将一个int类型的值赋值给一个指针变量,尽管指针的内部实现也是int。

构造函数的自动转换

C++中提供了自动类型转换的过程,比如下面这个过程。

Temp t = 28.5;

自动转换的条件

如果需要让一个类能够接受自动类型转换,需要给类提供一个仅含有一个参数的构造方法,当然我们也可以使用默认参数列表保证可以只接受一个参数。

Temp(double degree);

或者

Temp(double degree,double degree2=0);

自动类型转换的流程

当我们第一次接触这种特性的时候也许会觉得这是一种非常不错的特性,但是当我们了解其内部创建流程时也许就不会这么想了。程序会先使用构造函数Temp(double)创建一个临时Temp对象,随后采取复制的方式将内部数据复制到我们声明的对象当中去,最后销毁临时对象。

Temp t = 28.5;

可以用如下代码表示上述过程

Temp t;
{
    Temp $temp = Temp(28.5);
    t = $temp;
}

使用explicit关键字关闭隐式类型转换

当了解自动类型转换的低效之后,我们决定关闭隐式转换的过程。这里,我们可以使用C++提供的explicit关键字。当我们在构造方法前加上该关键字后,我们就不能够使用隐式转换了。但是,这里需要注意的是,我们只能关闭隐式类型转换,对于显式的强制类型转换仍然不可避免。

explicit Temp(double degree);

关闭隐式转换

Temp t = 12.1;//invailidate
Temp t2 = Temp(12.1);
Temp t3 = (Temp)12.1;

自动参数匹配与二义性

由于C++对于基本数据类型会提供自动转换,所以下面的语句也是正确的

Temp t = 10;

但是我们需要注意的是,然如我们提供了两种构造方法

Temp(double d);
Temp(long l);

那么我们再次使用上述语句时就会发出编译错误。因为编译器发现int类型的数值可以匹配上述两种构造方法。于是编译器拒绝编译。

转换函数

通过上面的叙述我们知道编译器能够将一个参数直接转换为对象,但是我们能不能将一个对象转换为一个基本数据类型呢?就像下面这样

Temp t = 22.0;
double d = t;

定义转换函数

C++为了这种功能定义了专门的转换函数,其固定格式为

operator typeName();

需要注意的是:

  • 转换函数必须是类的成员函数
  • 转换函数不能指定返回类型
  • 转换函数不能具有参数

例如将Temp转换为double的转换函数为

operator double();

自动应用类型转换与二义性

加入我们在Temp类中只提供了一个类型转换方法

operator double();

那么我们在使用cout的时候可以直接使用对象了。

cout<<t<<endl;

但是如果我们声明了两种转义类型

operator double();
operator int();

那么我们再次使用cout输出的时候编译器就不知道具体要转换为哪一种类型了。

避免使用隐式类型转换

原则上说,我们最好使用显式的类型转换而不是自动的隐式转换。
1,使用explicit关键字

explicit operator int() ;

2,自定义成员方法Getter

int getNumber();

相比之下第二种方式更符合优良的编程习惯

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值