当前位置:主页   - 电脑 - 程序设计 - C/C++
C++中用户定义的转换
来源:网络   作者:   更新时间:2012-02-21
收藏此页】    【字号    】    【打印】    【关闭

   (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,以禁止将其用来执行隐式转换。

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明