C++一些注意点之转换操作符
来源:互联网 发布:江西省网络助学平台 编辑:程序博客网 时间:2024/06/06 18:47
转换操作符定义
类可通过一个实参调用的非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(int d);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++一些注意点之型别转换
- c 的一些注意点
- Session的一些操作和注意点
- phoenix的一些操作以及注意点
- c语言中一些注意点
- C指针的一些注意点
- C语言入门 一些注意点
- C/C++ 内置类型转换注意点
- C++一些注意点之静态成员
- c++一些注意点之复制控制
- C++一些注意点之异常处理
- sizeof操作符注意点
- Objective-C之注意点(一)
- 混合开发之(C-OC)注意点
- Flash的一些基本概念以及MTD操作注意点
- iOS多线程,锁,互斥,同步
- 西班牙新路规:醉酒走路也挨罚
- C++Primer第6章学习笔记
- HDU 4284 Travel
- iPad和iPhone的app图标尺寸、用途、设置方法
- C++一些注意点之转换操作符
- adb server is out of date
- Java Socket接收和发送(字符串)
- Usermod 命令详解
- 15 个使用 jQuery 和 CSS 的选项卡菜单教程[转载]
- C语言实现二叉树的遍历
- 网络字节序与主机字节序分析
- 出现“找不到该项目”的错误提示解决方法
- ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction