转换操作符定义

类可通过一个实参调用的非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. IntelliJ IDEA于Make Project时报:子字符串不是票面金额的结束、非法的表达式显示启动

    IntelliJ IDEA于Make Project当系统提示很多错误,什么孩子不是字符串票面金额的结束.非法的表达式显示启动-- 解决方法是改变File Encoding,更改方法:File > ...

  2. python 编码转换(转)

    主要介绍了python的编码机制,unicode, utf-8, utf-16, GBK, GB2312,ISO-8859-1 等编码之间的转换. 常见的编码转换分为以下几种情况: 自动识别 字符串编 ...

  3. hdu2369 Broken Keyboard(类似dfs)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=2369">http://acm.hdu.edu.cn/showproblem.php ...

  4. R语言数据分析系列六

    R语言数据分析系列六 -- by comaple.zhang 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候怎样下手分析,数据分析的第一步.探索性数据分析. 统计量,即统计学里面关注的数据集 ...

  5. Android开源--MenuDrawer

    开放的源地址:https://github.com/SimonVT/android-menudrawer 简单介绍:menudrawer是跟sliderMenu差点儿相同的一种框架,常被应用做设置界面 ...

  6. 也许游戏 它P/N图分析

    关于游戏的问题,更多的时候是使用P/N图分析              p n p n p n p n   n  n n n n n n n   p n p n p n p n   n  n n n  ...

  7. 玩转Vim-札记

    玩转Vim-札记 距上篇博文已有一周有余,上次主要介绍了编辑器之神Vim的起源.安装并介绍了两种模式以及一些简单的操作.本次将继续对Vim的使用进行介绍. 登堂入室 首先接着说移动吧: 1 0 → 数 ...

  8. 【百度地图API】批量地址解析与批量反地址解析(带商圈数据)

    原文:[百度地图API]批量地址解析与批量反地址解析(带商圈数据) 摘要:因为地址解析的webserives方式还没有开通,所以先用JS版本的地址解析接口来批量获取地址解析数据吧,同时还能得到商圈的数 ...

  9. cocos2d-x 3.2 2048——第六部分(最后一章)

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  10. hdu 5053 the Sum of Cube(上海网络赛)

    the Sum of Cube Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...