C++顶用户界说的转换
当前位置:以往代写 > C/C++ 教程 >C++顶用户界说的转换
2019-06-13

C++顶用户界说的转换

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

    关键字:

在线提交作业