转换函数(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 * 使用指针转换函数然后执行指针的比较。
由于两种方法比其他不是 “右”,编译器无法确定比较表达式的含义,并且,将产生错误。