全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

有关C++中类类型转换操作符总结(必看篇)

实例如下:

class SmallInt {
public:
  SmallInt(int i = 0): val(i)
  { 
   if (i < 0 || i > 255)
    throw std::out_of_range("Bad SmallInt initializer");
  }
  operator int() const { return val; }
private:
  std::size_t val;
};

转换函数采用如下通用形式:

operator type();

type表示内置类型名、类类型名或由类型别名定义的名字。对任何可作为函数返回类型的类型(除了 void 之外)都可以定义转换函数。一般而言,不允许转换为数组或函数类型,转换为指针类型(数据和函数指针)以及引用类型是可以的。转换函数必须是成员函数,不能指定返回类型,并且形参表必须为空。operator int 返回一个 int 值;如果定义 operator Sales_item,它将返回一个 Sales_item 对象,诸如此类。转换函数一般不应该改变被转换的对象。因此,转换操作符通常应定义为 const 成员。

SmallInt si;

double dval;

si >= dval // si converted to int and then convert todouble

优点:类类型转换可能是实现和使用类的一个好处。通过为 SmallInt 定义到int 的转换,能够更容易实现和使用 SmallInt 类。int 转换使 SmallInt 的用户能够对 SmallInt 对象使用所有算术和关系操作符,而且,用户可以安全编写将 SmallInt 和其他算术类型混合使用的表达式。定义一个转换操作符就能代替定义 48个(或更多)重载操作符,类实现者的工作就简单多了。

缺点:二义性

class SmallInt {

public:

     SmallInt(int= 0);

    SmallInt(double);

//Usually it is unwise to define conversions to multiple arithmetic types

    operatorint() const { return val; }

    operatordouble() const { return val; }

private:

   std::size_tval;

};

 

void compute(int);

void fp_compute(double);

void extended_compute(long double);

SmallInt si;

compute(si); // SmallInt::operator int() const

fp_compute(si); // SmallInt::operator double() const

extended_compute(si); // error: ambiguous

对 extended_compute 的调用有二义性。可以使用任一转换函数,但每个都必须跟上一个标准转换来获得 long double,因此,没有一个转换比其他的更好,调用具有二义性。

如果两个转换操作符都可用在一个调用中,而且在转换函数之后存在标准转换,则根据该标准转换的类别选择最佳匹配。若无最佳匹配,就会出现二义性。

再比如:

可能存在两个转换操作符,也可能存在两个构造函数可以用来将一个值转换为目标类型。

考虑 manip 函数,它接受一个 SmallInt 类型的实参:

void manip(const SmallInt &);

double d; int i; long l;

manip(d); // ok: use SmallInt(double) to convert theargument

manip(i); // ok: use SmallInt(int) to convert theargument

manip(l); // error: ambiguous

第三个调用具有二义性。没有构造函数完全匹配于 long。使用每一个构造函

数之前都需要对实参进行转换:

1. 标准转换(从 long 到double)后跟 SmallInt(double)。

2. 标准转换(从 long 到int)后跟 SmallInt(int)。

这些转换序列是不能区别的,所以该调用具有二义性。

当两个类定义了相互转换时,很可能存在二义性:

class Integral;

class SmallInt {

public:

SmallInt(Integral);// convert from Integral to SmallInt

};

class Integral {

public:

operatorSmallInt() const; // convert from Integral to SmallInt 

};

 

void compute(SmallInt);

Integral int_val;

compute(int_val); // error: ambiguous

实参 int_val 可以用两种不同方式转换为 SmallInt 对象,编译器可以使

用接受 Integral 对象的构造函数,也可以使用将 Integral 对象转换为

SmallInt 对象的 Integral 转换操作。因为这两个函数没有高下之分,所以这

个调用会出错。

在这种情况下,不能用显式类型转换来解决二义性——显式类型转换本身既可以使用转换操作又可以使用构造函数,相反,需要显式调用转换操作符或构造函数:

compute(int_val.operator SmallInt()); // ok: useconversion operator

compute(SmallInt(int_val)); // ok: use SmallInt constructor

改变构造函数以接受 const Integral 引用:

class SmallInt {

public:

SmallInt(constIntegral&);

};

则对compute(int_val) 的调用不再有二义性!原因在于使用 SmallInt构造函数需要将一个引用绑定到 int_val,而使用 Integral 类的转换操作符可以避免这个额外的步骤。这一小小区别足以使我们倾向于使用转换操作符。

显式强制转换消除二义性

class SmallInt {

public:

// Usually it is unwise to define conversions tomultiple

arithmetic types

operatorint() const { return val; }

operatordouble() const { return val; }

// ...

private:

std::size_tval;

};

void compute(int);

void compute(double);

void compute(long double);

SmallInt si;

compute(si); // error: ambiguous


可以利用显式强制转换来消除二义性:

compute(static_cast<int>(si)); // ok: convertand call compute(int)


显式构造函数调用消除二义性

class SmallInt {

public:

SmallInt(int= 0);

};

class Integral {

public:

Integral(int= 0);

};

void manip(const Integral&);

void manip(const SmallInt&);

manip(10); // error: ambiguous

可以用显示构造函数消除二义性:

manip(SmallInt(10)); // ok: call manip(SmallInt)

manip(Integral(10)); // ok: call manip(Integral)

标准转换优于类类型转换

class LongDouble

{

public:

     LongDouble(double );

     //…

};

void calc( int );

void calc( LongDouble );

double dval;

calc( dval ); // which function

最佳可行函数是voidcalc(int), 调用此函数的转换为:将实参double类型转换为int类型的,为标准转换;调用voidcalc( LongDouble)函数时,将实参从double转换为LongDouble类型,为类类型转换,因为标准转换优于类类型转换,所以第一个函数为最佳可行函数。

以上这篇有关C++中类类型转换操作符总结(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# c  # 类型转换操作符  # C++超详细讲解逗号操作符  # C++中操作符的前置与后置有什么区别  # 详解C++赋值操作符重载  # C++-操作符重载、并实现复数类详解  # 浅谈C++虚重载操作符 virtual operator= 的使用方法  # C++超详细讲解逻辑操作符  # 转换为  # 可以用  # 给大家  # 可以使用  # 这一  # 就会  # 第一个  # 就能  # 两种  # 这两个  # 希望能  # 很可能  # 使我  # 诸如此类  # 这篇  # 不能用  # 用户可以  # 第三个  # 更容易  # 既可 


相关文章: 建站之星下载版如何获取与安装?  电商网站制作公司有哪些,1688网是什么意思?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  孙琪峥织梦建站教程如何优化数据库安全?  如何选择香港主机高效搭建外贸独立站?  建站之星客服服务时间及联系方式如何?  如何通过建站之星自助学习解决操作问题?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  ,想在网上投简历,哪几个网站比较好?  已有域名能否直接搭建网站?  广州美橙建站如何快速搭建多端合一网站?  如何规划企业建站流程的关键步骤?  建站之星后台密码遗忘?如何快速找回?  广东企业建站网站优化与SEO营销核心策略指南  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  小型网站制作HTML,*游戏网站怎么搭建?  如何制作算命网站,怎么注册算命网站?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  建站之星2.7模板快速切换与批量管理功能操作指南  网站制作员失业,怎样查看自己网站的注册者?  建站之星后台管理如何实现高效配置?  如何选择高效便捷的WAP商城建站系统?  MySQL查询结果复制到新表的方法(更新、插入)  建站之星安装提示数据库无法连接如何解决?  建站之星后台管理系统如何操作?  如何通过虚拟主机快速完成网站搭建?  Swift开发中switch语句值绑定模式  如何快速搭建高效香港服务器网站?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  常州企业建站如何选择最佳模板?  香港服务器部署网站为何提示未备案?  网站制作需要会哪些技术,建立一个网站要花费多少?  如何在IIS服务器上快速部署高效网站?  江苏网站制作公司有哪些,江苏书法考级官方网站?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何快速配置高效服务器建站软件?  如何快速搭建安全的FTP站点?  已有域名如何免费搭建网站?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  音乐网站服务器如何优化API响应速度?  宝塔新建站点为何无法访问?如何排查?  如何快速搭建二级域名独立网站?  建站之星微信建站一键生成小程序+多端营销系统  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  高端建站三要素:定制模板、企业官网与响应式设计优化  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  网页设计网站制作软件,microsoft office哪个可以创建网页?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework) 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。