C++中用户定义的转换

时间:2010-04-13

  (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/C++ 函数调用与函数返回值
下一篇:借助智能DAQ, 获得数据采集技术

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料