C++一些注意点之转换操作符
转换操作符定义
类可通过一个实参调用的非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++一些注意点之转换操作符的更多相关文章
- C++的隐式类型转换与转换操作符
C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象).如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能.隐式转换的发生条件:函数调用中, ...
- C#中如何利用操作符重载和转换操作符
操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...
- C++学习笔记33 转换操作符
有时候,我们要转换为类类型和类类型,同时,这两个类继承关系不存在,这时候我们就需要一些所谓的转换操作符运营商. 一个简单的例子.类别A转换为int种类 #include <iostream> ...
- C++ 隐式类类型转换和转换操作符
隐式类类型转换 C++语言定义了内置类型之间的几个自动转换.也可以定义如何将其他类型的对象隐式转换为我们的类类型,或将我们的类类型的对象隐式转换为其他类型.为了定义到类类型的隐式转换,需要定义合适的构 ...
- RxJava系列3(转换操作符)
RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...
- linq操作符:转换操作符
这些转换操作符将集合转换成数组:IEnumerable.IList.IDictionary等.转换操作符是用来实现将输入对象的类型转变为序列的功能.名称以"As"开头的转换方法可更 ...
- C#中如何利用操作符重载和转换操作符 (转载)
操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...
- 《C#高效编程》读书笔记09-避免在API中使用转换操作符
转换操作符为类之间引入了一种"可替换性"(substitutability)."可替换性"表示一个类的实例可以替换为另一个类的实例. public class ...
- c++ cc24a_demo //转换函数,用来做转换操作符,int()括号里面必须是空的,必须定义为const,代码示范
c++ cc24a_demo //转换函数,用来做转换操作符,int()括号里面必须是空的,必须定义为const,代码示范 #include <iostream> #include < ...
随机推荐
- Android变化如何破解几场金
我们在玩游戏的总会遇到一些东西需要购买,但是,我们可能要花钱,那么我们应该怎么办呢?这与游戏的插.我们在这里谈论的Android游戏,搜索互联网上的移动端游戏插件,您可能会发现一个叫段:八门神器.ap ...
- JavaScript中数字与字符串相互转化
一.数字转换成字符串 ①Number类定义的toString()方法:这个方法可以接收表示转换基数(radix,范围在2~36之间)的可选参数,如果不指定此参数,转换规则将是基于十进制.例如: ②Nu ...
- 微软发布Win10开发者指南视频
假设你是一个开发者,推荐你看看微软今天推出了一系列视频,标题是Win10开发人员指南,总体长度6时,多达22章内容,介绍很广泛.其实,即使你是编程新手或仅有兴趣,也值得一看. 开发人员Jerry Ni ...
- C# Windows Schedule task此次收购task下一步执行时间
最近进行了一次需求和Windows Schedule task相关职能,通过schedule,计算下一次运行task时间. 它用于由第三方DLL实现,以下网站,以下载来自: http://tasksc ...
- 记得12306货运系统“抢购空”编写插件--chrome交互式插件的各个部分
--chrome交互式插件的各个部分 Chrome插件的基础知识就不多说了.随便找个新手教程就能够上手了,比如官方提供的Overview与Getting Started教程足够入门了:笔者也是现学现卖 ...
- linux_inux中find批量删除空文件及空文件夹脚本
1.{}和之间有一个空格 2.find . -name 之间也有空格 3.exec 是一个后续的命令,{}内的内容代表前面查找出来的文件 linux下批量删除空文件(大小等于0的文件)的方法 rm - ...
- error:stray'\243'in program
error:stray'\243'in program 问题: C原因在编译时出现例如以下错误 error:stray'\243'in program 错误原因: 非 - 标准ascII字 ...
- monkey命令详解
标准的monkey 命令 adb shell monkey [options] <eventcount> 例如: adb shell monkey -v 产生500次随机事件,作用在 ...
- 【百度地图API】如何制作自定义样式的公交导航结果面板?
原文:[百度地图API]如何制作自定义样式的公交导航结果面板? 摘要: 百度地图API有默认的公交导航结果面板,但样式比较单一:而百度地图上的结果面板就比较美观.如何利用百度地图API来制作一个比较美 ...
- 【百度地图API】如何在地图上添加标注?——另有:坐标拾取工具+打车费用接口介绍
原文:[百度地图API]如何在地图上添加标注?--另有:坐标拾取工具+打车费用接口介绍 摘要: 在这篇文章中,你将学会,如何利用百度地图API进行标注.如何使用API新增的打车费用接口. ------ ...