抠腚爱揉曼 Coding Iron Man

27Jun/103

关于C++中的类型转换函数

函数原型

C++里面每个类型(class or struct)都可以定义自己的成员函数(方法)以及成员变量(属性),这些都是很常见基本的东西,类似的java,C#或者任何一种OOP都应该有的东西。
关于函数其中有一点比较重要的便是其函数原型,例如:

Prototype: ReturnType FunctionName(ArgumentList)
Example: int sum(int valueA, int valueB)


部分语言针对有返回值和无返回值的函数处理不一样,比如VB里面有Function和Sub之分,后者无返回值。
多数语言里面支持函数重载,即可以定义的多个函数名相同,但是参数列表不同的函数,例如下面两个函数只是可以相互区别的:

int sum(int valueA, int valueB);
float sum(float valueA, float valueB);

这是因为他们的全名其实并不只是sum,而是sum_int_int和sum_float_float,当然这不一定是具体的名字,看编译器心情而定。

运算符函数

在C++里面除了这些普通的函数以外,还有一些特别的函数看上去没有遵守上面的格式,比如类(以及结构体)的构造、析构函数,以及运算符重载函数。
构造析构不必赘述,运算符重载函数有它们自己比较特别的表现形式,例如:

class FooClass
{
public:
    FooClass(int value) : m_value(value)
    {
    }

    int operator + (const FooClass& rightValue)
    {
         return m_value + rightValue.m_value;
    }
private:
   int m_value;
}

FooClass objectA(10);
FooClass objectB(20);
int valueC = objectA + objectB;

这时便可以简单的使用加号运算符(+)来求得对象objectA和objectB内部的m_value相加之和。当然如果你不喜欢这样也完全可以给FooClass加上一个Add之类的方法然后调用:

valueC = objectA.Add(objectB);

类型转换运算符

好了,废话那么多,下面开始进入重点了。
关于运算符的重载,并不只是简单的若干内建运算符(+,-,*,/ etc.)。有一种特殊的运算符叫类型转换运算符(姑且这样叫吧,只是我目前还没找到合适的名字-_-)。他们的形式大约是:

class FooClass
{
public:
    operator int ()
    {
         return m_value;
    }
private:
   int m_value;
}

注意他们的特别之处在于:

  1. 没有返回值
  2. 没有参数
  3. 函数名即是类型名

这个函数可以理解成:有这么样一个运算符,可以把FooClass类型的对象转换为int类型的数值
于是便可以简单的使用以下的代码来将对象objectA里面的m_value的值赋予外部的int类型变量valueC。

FooClass objectA(10);
int valueC = objectA;

编译器会自动搜索合适的类型转换函数并进行链接。
其实这样的用法不知不觉种已经用了很多,当你在把一个int的数值赋值给float的时候,编译器已经会自动链接int类型内建的向float的类型转换函数了,反之亦然。
当然标准的用法应该写作:

int valueC = static_cast<int>(objectA);

先写这么多,下回继续。

Posted by Jay