C++顶用户定义的转换[VC/C++编程]
本文“C++顶用户定义的转换[VC/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,以禁止将其用来履行隐式转换.
以上是“C++顶用户定义的转换[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |