全网整合营销服务商

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

免费咨询热线: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++超详细讲解逻辑操作符  # 转换为  # 可以用  # 给大家  # 可以使用  # 这一  # 就会  # 第一个  # 就能  # 两种  # 这两个  # 希望能  # 很可能  # 使我  # 诸如此类  # 这篇  # 不能用  # 用户可以  # 第三个  # 更容易  # 既可 


相关文章: 韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  山东云建站价格为何差异显著?  如何获取免费开源的自助建站系统源码?  如何快速查询域名建站关键信息?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  如何高效配置IIS服务器搭建网站?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  建站之星Pro快速搭建教程:模板选择与功能配置指南  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  html制作网站的步骤有哪些,iapp如何添加网页?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  定制建站方案优化指南:企业官网开发与建站费用解析  香港服务器网站卡顿?如何解决网络延迟与负载问题?  建站主机选购指南:核心配置优化与品牌推荐方案  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  如何续费美橙建站之星域名及服务?  网站制作软件有哪些,制图软件有哪些?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  建站之星后台密码如何安全设置与找回?  北京专业网站制作设计师招聘,北京白云观官方网站?  活动邀请函制作网站有哪些,活动邀请函文案?  如何通过可视化优化提升建站效果?  如何通过商城自助建站源码实现零基础高效建站?  如何选择网络建站服务器?高效建站必看指南  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  历史网站制作软件,华为如何找回被删除的网站?  建站之星后台密码遗忘或太弱?如何重置与强化?  建站主机SSH密钥生成步骤及常见问题解答?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  如何快速搭建支持数据库操作的智能建站平台?  ,怎么用自己头像做动态表情包?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  如何用搬瓦工VPS快速搭建个人网站?  香港服务器租用每月最低只需15元?  Bpmn 2.0的XML文件怎么画流程图  ,sp开头的版面叫什么?  网站网页制作专业公司,怎样制作自己的网页?  简单实现Android验证码  如何快速登录WAP自助建站平台?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  简历在线制作网站免费版,如何创建个人简历?  大连 网站制作,大连天途有线官网?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星伪静态规则如何设置?  焦点电影公司作品,电影焦点结局是什么?  网站制作企业,网站的banner和导航栏是指什么?  c++ stringstream用法详解_c++字符串与数字转换利器  c# 在ASP.NET Core中管理和取消后台任务 

您的项目需求

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