重载类型转换
在转换和转换中,您了解到C ++允许您将一种数据类型转换为另一种数据类型。以下示例显示将int转换为double:
int n = 5;
double d = n; // int 隐式转换为 double
C ++已经知道如何在内置数据类型之间进行转换。但是,它不知道如何转换任何用户定义的类。这就是重载类型转换运算符发挥作用的地方。
重载类型转换操作符允许我们将类转换为另一种数据类型。看看下面的类:
class Cents
{
private:
int m_cents;
public:
Cents(int cents=0)
{
m_cents = cents;
}
int getCents() { return m_cents; }
void setCents(int cents) { m_cents = cents; }
};
这个类非常简单:它将一些Cents作为整数保存,并提供访问函数来获取和设置cents。它还提供了一个构造函数,用于将int转换为Cents。
如果我们可以将int转换为Cents,那么我们能否将Cents转换回int也没有意义吗?在某些情况下,这可能不是真的,但在这种情况下,它确实有意义。
在下面的示例中,我们必须使用getCents()将我们的Cents变量转换回整数,以便我们可以使用printInt()打印它:
void printInt(int value)
{
std::cout << value;
}
int main()
{
Cents cents(7);
printInt(cents.getCents()); // 打印7
return 0;
}
如果我们已经编写了许多以整数作为参数的函数,那么我们的代码将会被调用getCents(),这使得它变的的更麻烦。
为了简化操作,我们可以重载int类型转换,这将允许我们将Cents类直接转换为int。以下示例显示了如何完成此操作:
class Cents
{
private:
int m_cents;
public:
Cents(int cents=0)
{
m_cents = cents;
}
// 重载int类型转换
operator int() { return m_cents; }
int getCents() { return m_cents; }
void setCents(int cents) { m_cents = cents; }
};
有两点需要注意:
要重载将类转换为int的函数,我们在类中编写一个名为operator int()的新函数。请注意,运算符和我们要转换的类型之间有一个空格。
转换运算符没有返回类型。C ++假设您将返回正确的类型。
现在在我们的例子中,我们可以像这样调用printInt():
int main()
{
Cents cents(7);
printInt(cents); // print 7
return 0;
}
编译器首先会注意到函数printInt采用整数参数。然后它会注意到变量cents不是int。最后,它将查看我们是否提供了将Cents转换为int的方法。因为我们有,它将调用我们的运算符int()函数,它返回一个int,返回的int将被传递给printInt()。
我们现在也可以将我们的Cents变量显式地转换为int:
Cents cents(7);
int c = static_cast<int>(cents);
您可以为所需的任何数据类型重载强制转换运算符,包括您自己的用户定义数据类型!
这是一个名为Dollars的新类,它提供了一个重载的Cents强制转换运算符:
class Dollars
{
private:
int m_dollars;
public:
Dollars(int dollars=0)
{
m_dollars = dollars;
}
// 允许我们将Dollars换算为Cents
operator Cents() { return Cents(m_dollars * 100); }
};
这允许我们将Dollars对象直接转换为Cents对象!这允许你做这样的事情:
class Cents
{
private:
int m_cents;
public:
Cents(int cents = 0)
{
m_cents = cents;
}
// 重载int转换类型
operator int() { return m_cents; }
int getCents() { return m_cents; }
void setCents(int cents) { m_cents = cents; }
};
class Dollars
{
private:
int m_dollars;
public:
Dollars(int dollars=0)
{
m_dollars = dollars;
}
// 允许我们将Dollars换算为Cents
operator Cents() { return Cents(m_dollars * 100); }
};
void printCents(Cents cents)
{
std::cout << cents; // cents将在这里隐式地转换为int
}
int main()
{
Dollars dollars(9);
printCents(dollars); // dollars将在这里隐式地转换为Cents
return 0;
}
因此,该程序将打印值:
900
这是有正确的,因为9美元是900美分!