C++ Primer 第十四章操作重载与类型转换 14.9 重载、类型转换与运算符 练习和总结

14.9 重载、类类型转换与运算符

在学习构造函数的时候,我们知道如果构造函数只有一个形参或者只有一个形参没有默认值,那么可以通过隐式转换,将该形参类型转化为类类型。

同样,我们也可以将类类型转化为其他的类型,虽然C++提供了这样的操作,但是我们应当尽量避免使用类型转换运算符,因为使用类型转换运算符可能会造成很多潜在的风险,比如各种二义性,以及如果二者的转换规则不明显可能会造成代码可读性非常差。

我们可以通过

operator type() const;

的方法来重载类型转换运算符。注意其没有返回值类型

一般情况下,我们只重载转化为bool类型,这对于很多类类型都是很好理解的,如果一个对象数据成员都是一个什么都没有的状态,我们可以认为它是false的。

operator bool() const;

这样定义的类类型转换运算符是可以隐式转换的,但是隐式转换可能会造成一些潜在问题。
比如过去的C++中,cin可以隐式转换为bool。

下面的代码旧版本就会出现的问题,使用istream对象调用输出运算符,本来不应该执行,但是cin可以隐式转化为bool,bool又会经过整型提升,所以这里就变成了一个将一个整型左移了。

int i=1;
cin<<i;
新标准下的cin不会出现这个问题了

如果不想隐式的转换,我们还可以添加explict,要求如果要使用类型转换则必须显式转换。

explicit operator bool() const;

int i=1;
//只有这样带能正确的通过编译
static_cast<bool>(cin)<<i;

添加explicit可以,在需要转换时需要显式,但是有一个例外,即当表达式作为条件时,还是可以隐式的转换。

在这里插入图片描述
while(cin>>value)其实就是一个好例子,从标准输入中去读数据到value中,并返回cin。此时cin可以转化为bool,如果cin的状态为good则为true,为其他类型则为false。

可以看到这样方式可以简化代码的编写。

我们应该尽量避免使用类型转换运算符,一般情况下最多只转化为bool

练习
14.45

string返回bookNo,double返回销售的钱

14.46

不应该定义,因为将一个Sales_date对象转为string和double,没有明显的映射关系,不如直接定义函数,返回需要值

14.47
operator const int()

是类类型可以转化为cont int类型

operator int() const;

这个类型转换运算符是一个const函数。

14.48

可以含有一个向bool类型转换运算符,我定义的类是My_Date日期类,里面有年月日三个属性,默认年月日的值都是0,如果都是0可以认为对象是false。

因为我的目的是在条件中检测这个对象是否有意义,不需要在其他的地方转换,所以我将其定义为explicit。

14.49
My_Date::operator bool() const
{
	if (year==0&&month==0&&day==0)
	{
		return false;
	}
	return true;
}
14.50

ex1的初始化是错误的,因为ldobj可以先转化为double,再变为int,也可以先转化为float再变为int。

ex2的初始化时正确的,直接由ldobj转化为float

14.51

可能用到double->int
double->LongDouble

编译器调用的是calc(int),我觉得可能是将double->int
比将double ->LongDouble优先级高

14.52

ld=si+ld。ld可以转化为通过float或者double,再转化为int变为SamllInt类型,由二义性

ld=ld+si
ld可以先转化为float或者double,转后转化为int,再转为Smallint
但是ld的+操作,可以接收si。

所以使用id的+操作。

14.53

不合法
sl可以转化为int,int再转化为double

但是3.14可以转化为int,再隐式构造对象

double d = si.operator int + 3.14;

我们应当尽量避免使用类型转换运算符,可以看到类型转换运算符带来的负面问题太多了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值