博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++一些注意点之转换操作符
阅读量:6266 次
发布时间:2019-06-22

本文共 1793 字,大约阅读时间需要 5 分钟。

转换操作符定义

 

      类可通过一个实参调用的非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)选择最佳匹配函数

转载地址:http://hqdpa.baihongyu.com/

你可能感兴趣的文章
python中获取指定目录下所有文件名列表的程序
查看>>
HTML5的本地存储 LocalStorage
查看>>
safari和ie的时间解析(显示为NAN)
查看>>
基于 HTML5 WebGL 的挖掘机 3D 可视化应用
查看>>
Java工具创建密钥库,用于Unity 3D打包、签名、发布
查看>>
Oracle用户解锁
查看>>
MongoDB的使用
查看>>
C#开启异步 线程的四种方式
查看>>
XML解析
查看>>
2784: 【提高】小 X 与煎饼达人(flip)
查看>>
Linux 常用的压缩命令有 gzip 和 zip
查看>>
内存分段与分页
查看>>
第一个WindowService服务
查看>>
zookeeper的三种安装模式
查看>>
腾讯2014实习面经 —— 面试经过回忆
查看>>
MIT Scheme 使用 Edwin
查看>>
BZOJ1500:[NOI2005]维修数列——题解
查看>>
transactionscope报“此操作对该事务的状态无效”问题
查看>>
css3(border-radius)边框圆角详解(转)
查看>>
[摘录]第2章 中场谈判技巧
查看>>