转换操作符定义

类可通过一个实参调用的非explicit构造函数定义一个隐式转换(其他类型—>类类型)。当提供了实参类型的对象而需要一个类类型的对象时,编译器将使用该转换。这种构造函数定义了到类类型的转换。例如

Class A{
A(int){};//非explicit构造函数
}
Func(A a);
Int num;
Func(num);//调用的时候通过int类型的也能调用,因为执行能构造函数的隐式转换。

除了其他类型通过构造函数转换为类类型以外,我们可以通过定义转换操作符(类类型——>其他类型)。

class SmallInt{
public:
SmallInt(int i=0):val(i){}
{
If(i<0||i>255)
throw std::out_of_range(“Bad smallIntinitialization”);
}
operator int()const //转换函数,int类型为要转换的类型
{
return val;
}
private:
Std::size_t val;
}

使用转换操作符有下注意点

(1)转换函数必须是成员函数,不能定义返回类型,并且参数必须为空。

(2)转换函数一般不应该改变被转换的对象,所以被定义为const成员函数。

(3)转换操作符可以不必与所需要的类型完全匹配

Func(double);
SmallInt sm;
//这样调用时没有问题的,SmallInt先转换为int类型,由int类型再转换为double类型。
Func(sm);

(4)只能应用一个类类型转换,类类型转换之后不能再跟另一个类类型转换

class Integral{
public:
operator SmallInt()cosnt //定义了到Smallint类型的转换
{}
}
Func(intd);
Integral intVal;
//这个调用时错误的,虽然SmallInt定义了到int的转换,但是这产生了两次转换不对
Func(intVal);

(5)使用构造函数执行隐式转换,构造函数的参数类型可以不必完全与所提供的类型匹配。

Func(SmallInt);
short sobj;
Func(sobj);//可以调用SmallInt(int)构造函数将short类型转换为SmallInt。


转换操作符与类构造函数隐式转换存在的二义性

(1)由于类中定义了多个转换符而存在二义性

class SmallInt{
public:
operator int()const; //到int类型的转换
operator double()const; //到double类型的转换
}
Func(long double);
SmallInt si;
//这个定义就存在二义性,因为不知道调用哪个转换函数,都可以转换为相应的类型。
Func(si);

(2)由于类中定义了多个构造函数隐式转换而造成二义性

class SmallInt{
public:
SmallInt(int);//int到SmallInt的隐式转换
SmallInt(double);// double到SmallInt的隐式转换
}
Func(SmallInt);
long l;
//用long类型去调用就存在二义性,不知道采用哪个隐式转换
Func(l);

(3)由转换操作符和默认构造函数隐式转换造成的二义性

class SmallInt{
public:
//接受Integral类型的构造函数,可以执行隐式转换
SmallInt(Integral);
}
class Integral{
public:
operator SmallInt();// 到SmallInt转换
}
Func(SmallInt);
Integral val;
//这时就存在二义性,不知道调用哪个转换
Func(val);

注:上面所以的二义性,可以通过显示指定某种转换来避免,即指定显示转换或者显示构造函数

避免二义性

(1)最好不要给一个类定义多个类型转换符;

(2)将构造函数声明为exliplict,调用的时候使用显示转换;

(3)避免两个类使用互相转换;

重载、转换和操作符

(1)确定候选函数;

(2)选择可行函数;

(3)选择最佳匹配函数

C++一些注意点之转换操作符的更多相关文章

  1. C++的隐式类型转换与转换操作符

    C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象).如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能.隐式转换的发生条件:函数调用中, ...

  2. C#中如何利用操作符重载和转换操作符

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  3. C++学习笔记33 转换操作符

    有时候,我们要转换为类类型和类类型,同时,这两个类继承关系不存在,这时候我们就需要一些所谓的转换操作符运营商. 一个简单的例子.类别A转换为int种类 #include <iostream> ...

  4. C++ 隐式类类型转换和转换操作符

    隐式类类型转换 C++语言定义了内置类型之间的几个自动转换.也可以定义如何将其他类型的对象隐式转换为我们的类类型,或将我们的类类型的对象隐式转换为其他类型.为了定义到类类型的隐式转换,需要定义合适的构 ...

  5. RxJava系列3(转换操作符)

    RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...

  6. linq操作符:转换操作符

    这些转换操作符将集合转换成数组:IEnumerable.IList.IDictionary等.转换操作符是用来实现将输入对象的类型转变为序列的功能.名称以"As"开头的转换方法可更 ...

  7. C#中如何利用操作符重载和转换操作符 (转载)

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  8. 《C#高效编程》读书笔记09-避免在API中使用转换操作符

    转换操作符为类之间引入了一种"可替换性"(substitutability)."可替换性"表示一个类的实例可以替换为另一个类的实例. public class ...

  9. c++ cc24a_demo //转换函数,用来做转换操作符,int()括号里面必须是空的,必须定义为const,代码示范

    c++ cc24a_demo //转换函数,用来做转换操作符,int()括号里面必须是空的,必须定义为const,代码示范 #include <iostream> #include < ...

随机推荐

  1. Android变化如何破解几场金

    我们在玩游戏的总会遇到一些东西需要购买,但是,我们可能要花钱,那么我们应该怎么办呢?这与游戏的插.我们在这里谈论的Android游戏,搜索互联网上的移动端游戏插件,您可能会发现一个叫段:八门神器.ap ...

  2. JavaScript中数字与字符串相互转化

    一.数字转换成字符串 ①Number类定义的toString()方法:这个方法可以接收表示转换基数(radix,范围在2~36之间)的可选参数,如果不指定此参数,转换规则将是基于十进制.例如: ②Nu ...

  3. 微软发布Win10开发者指南视频

    假设你是一个开发者,推荐你看看微软今天推出了一系列视频,标题是Win10开发人员指南,总体长度6时,多达22章内容,介绍很广泛.其实,即使你是编程新手或仅有兴趣,也值得一看. 开发人员Jerry Ni ...

  4. C# Windows Schedule task此次收购task下一步执行时间

    最近进行了一次需求和Windows Schedule task相关职能,通过schedule,计算下一次运行task时间. 它用于由第三方DLL实现,以下网站,以下载来自: http://tasksc ...

  5. 记得12306货运系统“抢购空”编写插件--chrome交互式插件的各个部分

    --chrome交互式插件的各个部分 Chrome插件的基础知识就不多说了.随便找个新手教程就能够上手了,比如官方提供的Overview与Getting Started教程足够入门了:笔者也是现学现卖 ...

  6. linux_inux中find批量删除空文件及空文件夹脚本

    1.{}和之间有一个空格 2.find . -name 之间也有空格 3.exec 是一个后续的命令,{}内的内容代表前面查找出来的文件 linux下批量删除空文件(大小等于0的文件)的方法 rm - ...

  7. error:stray&#39;\243&#39;in program

    error:stray'\243'in program 问题:       C原因在编译时出现例如以下错误 error:stray'\243'in program 错误原因: 非 - 标准ascII字 ...

  8. monkey命令详解

    标准的monkey 命令 adb shell monkey [options] <eventcount> 例如: adb shell monkey -v    产生500次随机事件,作用在 ...

  9. 【百度地图API】如何制作自定义样式的公交导航结果面板?

    原文:[百度地图API]如何制作自定义样式的公交导航结果面板? 摘要: 百度地图API有默认的公交导航结果面板,但样式比较单一:而百度地图上的结果面板就比较美观.如何利用百度地图API来制作一个比较美 ...

  10. 【百度地图API】如何在地图上添加标注?——另有:坐标拾取工具+打车费用接口介绍

    原文:[百度地图API]如何在地图上添加标注?--另有:坐标拾取工具+打车费用接口介绍 摘要: 在这篇文章中,你将学会,如何利用百度地图API进行标注.如何使用API新增的打车费用接口. ------ ...