C++基础教程面向对象(学习笔记(28))

重载类型转换

在转换和转换中,您了解到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美分!

猜你喜欢

转载自blog.csdn.net/qq_41879485/article/details/83214321