C++中用户定义的转换

(1)用户定义的转换的必要性:

我们希望能够在SmallInt对象和其他SmallInt对象或者内置算术类型的对象之间进行加减操作,我们要通过提供6个SmallInt操作符函数来实现对这些操作的支持:

 class SmallInt ...{
friend operator+( const SmallInt &, int );
friend operator-( const SmallInt &, int );
friend operator-( int, const SmallInt & );
friend operator+( int, const SmallInt & );
public:
SmallInt( int ival ) : value( ival ) ...{ }
operator+( const SmallInt & );
operator- ( const SmallInt & );
// ...
private:
int value;
};

两个成员操作符允许我们加减两个SmallInt对象。友元全局操作符允许我们在SmallInt对象和内置算术类型的对象之间进行加减操作。之所以只需要6个操作符,是因为任何内置算术类型都可以被转换为与int型参数相匹配。

如果我们还想支持按位操作符、逻辑操作符、关系操作符和复合赋值操作符,则要求的操作符的数目就变得非常可怕了。我们更希望的,不是提供所有的重载操作符,而是一种将SmallInt类对象自动转换成int 型对象的方式。

C++提供了一种机制,通过它,每个类都可以定义一组“可被应用在该类型对象上的转换”。对于SmallInt,我们定义了一个从SmallInt对象到int型的转换。

 class SmallInt ...{
public:
SmallInt( int ival ) : value( ival ) ...{ }
// 转换操作符
// SmallInt ==> int
operator int() ...{ return value; }
// 没有提供重载操作符
private:
int value;
};

(2)需要注意的地方:

(a)转换函数必须是成员函数,它的声明不能指定返回类型和参数表。

 operator int( SmallInt & ); // 错误: 不是成员
class SmallInt ...{
public:
int operator int(); // 错误: 返回类型
operator int( int = 0 ); // 错误参数表
// ...
};

(b)显式的类型转换会导致调用转换函数。(须注意在必要的时候将转换类型设置为const,只允许对被转换的类对象进行只读访问)

 #include "Token.h"
Token tok( "function", 78 );
// 函数型的表示法: 调用 Token::operator SmallInt()
SmallInt tokVal = SmallInt( tok );
// static_cast: 调用 Token::operator tName()
char *tokName = static_cast< char * >( tok );

(c)如果转换的目标(本例中的double)与转换函数的类型(本例中的int类型)不完全匹配,但目标类型可以通过标准转换序列到达,则仍可调用转换函数。

 extern void calc( double );
Token tok( "constant", 44 );
// 调用 tok.operator int() 吗? 是的
// int --> double 通过标准转换
calc( tok );

(d)使用构造函数作为转换函数。

 extern void func( Number );
SmallInt si( 87 );
{
// 调用 Number( const SmallInt & )
func( si );
}

当然,可通过在类的构造函数前设置explicit,以禁止将其用来执行隐式转换。

时间: 2024-11-05 12:07:15

C++中用户定义的转换的相关文章

SQL SERVER中用户定义标量函数(scalar user defined function)的性能问题

用户定义函数(UDF)分类       SQL SERVER中的用户定义函数(User Defined Functions 简称UDF)分为标量函数(Scalar-Valued Function)和表值函数(Table-Valued Function).其中表值函数又分为Inline table-valued functions和Multistatement table-valued functions.     用户定义函数(UDF)在 SQL Server 中发挥重要的作用.用户定义函数可以

c++-vs2010提示不存在用户定义的从Date到const Date的转换

问题描述 vs2010提示不存在用户定义的从Date到const Date的转换 Date ReadDate(const string& prompt) { Date dt; cout< cin>>dt; return dt; } void SetDob(const Date& dtb) { dob=dtb; } 重载操作符 ostream& operator<<(ostream& os,Date& eml) { int mo=0,da

access-Access中定义GroupConcat函数时, .显示用户定义类型未定义,怎么修改?

问题描述 Access中定义GroupConcat函数时, .显示用户定义类型未定义,怎么修改? 定义的函数如下:Public Function GroupConcat(sColumn As String sTable As String Optional sCriteria As String Optional sDelimiter As String = "")On Error GoTo ErrHandlerDim rs As New ADODB.RecordsetDim sSQL

ArcGIS中的坐标系定义与转换 (转载)

原文:ArcGIS中的坐标系定义与转换 (转载) 1.基准面概念:  GIS中的坐标系定义由基准面和地图投影两组参数确定,而基准面的定义则由特定椭球体及其对应的转换参数确定,因此欲正确定义GIS系统坐标系,首先必须弄清地球椭球体(Ellipsoid).大地基准面(Datum)及地图投影(Projection)三者的基本概念及它们之间的关系.   基准面是利用特定椭球体对特定地区地球表面的逼近,因此每个国家或地区均有各自的基准面,我们通常称谓的北京54坐标系.西安80坐标系实际上指的是我国的两个大

封装-java web项目中用户实体类定义

问题描述 java web项目中用户实体类定义 在java web项目中,都有用户信息封装在用户实体类中.然后在控制类中多个方法都需要调用这个用户实体类.那么,第一种方案:我可以将这个用户实体类定义成全局变量,并在第一次登录的时候赋值,然后在之后的方法中就可以直接调用该全局变量.第二种方案:在登录的时候将用户实体类存入session中,然后在其他方法调用时,从session中取出该实体.请问这两种方案应该用哪种?如果是第二种,那是否应该将该用户实体定义为全局变量,然后在每次需要调用时,从sess

vb6.0-VB6.0中定义一个rdoEnvironment时总是显示用户定义类型未定义

问题描述 VB6.0中定义一个rdoEnvironment时总是显示用户定义类型未定义 rt,VB6.0中定义一个rdoEnvironment时总是显示用户定义类型未定义

LINQ to SQL语句(21)之用户定义函数

用户定义函数 我们可以在LINQ to SQL中使用用户定义函数.只要把 用户定义函数拖到O/R设计器中,LINQ to SQL自动使用FunctionAttribute属性 和ParameterAttribute属性(如果需要)将其函数指定为方法.这时,我们只需 简单调用即可. 在这里注意:使用用户定义函数的时候必须满足以下形 式之一,否则会出现InvalidOperationException异常情况. 具有正确映 射属性的方法调用的函数.这里使用FunctionAttribute属性和 P

LINQ体验(15)——LINQ to SQL语句之用户定义函数

用户定义函数 我们可以在LINQ to SQL中使用用户定义函数.只要把用户 定义函数拖到O/R设计器中,LINQ to SQL自动使用FunctionAttribute属性和 ParameterAttribute属性(如果需要)将其函数指定为方法.这时,我们只需简 单调用即可. 在这里注意:使用用户定义函数的时候必须满足以下形式 之一,否则会出现InvalidOperationException异常情况. 具有正确映射 属性的方法调用的函数.这里使用FunctionAttribute属性和 P

PHP中用户身份认证实现二法

用户在设计和维护站点的时候,经常需要限制对某些重要文件或信息的访问.通常,我们可以采用内置于WEB服务器的基于HTTP协议的用户身份验证机制.当访问者浏览受保护页面时,客户端浏览器会弹出对话窗口要求用户输入用户名和密码,对用户的身份进行验证,以决定用户是否有权访问页面.下面用两种方法来说明其实现原理. 一.用HTTP标头来实现 标头是服务器以HTTP协议传送HTML信息到浏览器前所送出的字串.HTTP采用一种挑战/响应模式对试图进入受密码保护区域的用户进行身份验证.具体来说,当用户首次向WEB服