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 < ...
随机推荐
- 使用nodeitk进行对象识别
前言 东莞,晴,29至27度.忙了一天,最终能够写写东西了.今天继续昨天的话题,我们在昨天的例了基础上完好,通过匹配关键点求出映射从而找到场景中的已知对象. 目标 本文你将学习 採用nodeitk的f ...
- poj 1160 Post Office (间隔DP)
Post Office Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 15966 Accepted: 8671 Desc ...
- Entity Framework Code First学习系列
Entity Framework Code First学习系列目录 Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity ...
- SpringMVC传参
@Controller @RequestMapping("/user") public UserController extends BaseController{ @InitBi ...
- 2014辛星完全解读html第五节
员,那么肯定会知道什么叫表单,这里我们就介绍一下前台怎样使用表单.表单的使用也是我们编写网页的必须经历的一关.并且,表单也往往是我们站点的漏洞和弱点出现的地方. *************表单**** ...
- C#后台利用正则表达式查找匹配字符
/// <summary> /// 发送短信 系统固化短信 /// </summary> /// <param name=&qu ...
- JavaScript 数组的indexOf()、remove()、splice() , pop()方法
js中,按照值删除数组中的某个元素 Array.prototype.indexOf = function(val) { for (var i = 0; i < this.l ...
- 注册 集 与 删除 -- C
文章3位设置和清除操作. #include <stdio.h> #include <stdlib.h> #include <string.h> #define BI ...
- dojo的TabContainer添加ContentPane假设closable,怎么不闭幕后予以销毁ContentPane
其主要思想是新的TabContainer的扩展类,重载其closeChild属性,使得其在关闭子容器时.不调用该子容器的destroyRecursive方法. define([ "dojo/ ...
- Java-继承特性
继承的特点: 1.提高了代码的复用性. 2.让类与类之间发生了关系,有了这个关系,才有了多态的特性. (注意:千万不要为了获取其他类的功能,简化代码而继承:必须是类与类之间有所属关系才可以继承,所属关 ...