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 < ...
随机推荐
- Eclipse 4.4.2 取消空格键代码上屏
基本是照这个站点来的: 点击打开链接 可是问题不止这些!! 从网上下了SDK, 然后打开之后首先发现没有plugins窗体, 好吧, 先通过Help -> Install New Softwar ...
- java基金会成立
在java在,数据收集的操作,应使用非常.最近看了零星收集的小知识,在这里,一点点排序. 它基本上是四个常用的类操作点总结集合. 首先.集合大致分为两个方向.一种是普通的集合类型,通过接口collec ...
- HTTPS背后的加密算法(转)
当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信.InfoQ的这篇文章对此有非常详细的描述.这些复杂的步骤的第一步,就是浏览器与服务器之间协商一 ...
- Objective-C马路成魔【14-关键C语言功能】
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 这里介绍一 ...
- No bean named 'sessionFactory' is defined
1.错误叙述性说明 严重:Servlet service() for servlet default threw exception . org.springframework.beans.facto ...
- 2014联合三所学校 (HDU 4888 HDU 4891 HDU 4893)
HDU 4891 The Great Pan 注册标题 他怎么说,你怎么样 需要注意的是乘法时,它会爆炸int 代码: #include<iostream> #include<c ...
- C语言qsort函数算法性能测试
对于该算法的复杂性.一个直接的方法是测量的一定量的算法级数据的执行时间的感知. 随着C语言提供qsort对于示例.随着100一万次的数据,以测试其计算量.感知O(nlg(n))时间成本: C码如下面: ...
- Android实现“是否退出”对话框和“带图标的列表”对话框
今天我们学习的内容是实现两种对话框(Dialog),第一种是询问是否退出对话框,另外一种是带图标的列表对话框,程序的执行效果是,我们点击button1的时候,弹出第一种对话框,我们点击button2的 ...
- MVC 验证码
验证码类 public class VerifyCode { public string checkCode = String.Empty; public byte[] BuildImg() { in ...
- Xutils呼叫流源代码文件下载方法
//我主要是好奇Xutils哪里回调onLoading(),查找等了很久也没找到,果然easy查找只是把它写下来 前言: 1.代码摘要只有主线,提供一般流程 2.为了易于理解,码变量名,而是类名的驼峰 ...