转换函数(C++)

在构造函数的转换,描述上一节中,一个类型对象可以隐式转换为特定的类类型。 本节描述可提供从特定类类型的显式转换为另一种类型的方法。 从类类型的转换使用转换功能通常是实现。 转换函数使用以下语法:

语法

  • 转换函数的名称:
    运算符 转换类型名称 ()

  • 将类型名称:
    类型说明符列表 PTR 运算符opt

下面的示例指定转换类型 Money 键入 double的转换功能:

// spec1_conversion_functions1.cpp
struct Money {
   operator double() { return _amount; }

private:
    double _amount;
};

int main() {
   Money Account;
   double CashOnHand = Account;
}

CashOnHand 的初始化和 Account 导致从类型 Account 的转换键入 double。

转换函数通常称为 “转换运算符”,因为它们 (和构造函数) 是调用函数,则使用转换。 下面的示例使用转换或显式转换,打印类型 Money对象的当前值:

cout << (double)Account << endl;

转换函数在派生类继承。 转换运算符隐藏转换为同一类型仅的基类转换运算符。 因此,一个用户定义的 运算符 int 功能在基类不隐藏一个用户定义的 短运算符 功能。

仅,在执行隐式转换时,用户定义的转换功能适用。 如果没有显式定义的转换函数,编译器无法找到对象可以转换的中间类型。

如果的转换导致多义性需要,会生成错误。 出现多义性,当多个用户定义的转换可用,或者个用户定义的转换和固定转换存在时。

示例

下面的示例声明与潜在的多义性的类声明:

// spec1_conversion_functions2.cpp
#include <string.h>
#include <stdio.h>

struct String {
   // Define constructor that converts from type char *.
   String( char *szBuffer ) {
      strcpy_s( _text, szBuffer );
   }

   // Define conversion to type char *.
   operator char *() {
      return _text;
   }

   int operator==( const String &s )  {
      return !strcmp( _text, s._text );
   }

private:
   char _text[80];
};

int main() {
   String s( "abcd\0" );
   char *ch = "efgh";

   // Cause the compiler to select a conversion.
   return s == ch; // C2666
}

在表达式 s == ch,编译器没有两种方法和方法确定是否正确。 使用用户定义的 operator==,它可以转换 ch 转换为类型 String 对象的构造函数然后执行比较。 也可以将 s 转换为类型 char * 使用指针转换函数然后执行指针的比较。

由于两种方法比其他不是 “右”,编译器无法确定比较表达式的含义,并且,将产生错误。

请参见

参考

转换