曲径通幽论坛

标题: 创建转换函数 [打印本页]

作者: beyes    时间: 2011-12-16 10:42
标题: 创建转换函数
有时候需要在表达式中将自己创建的类和其它数据类型进行混合运算,这虽然可以通过类的重载运算符来实现,但一种更简单的方法是我们自己创建转换函数,通过转换函数我们可以将类转换为与表达式中其它部分兼容的类型。类型转换函数的通用形式如下:
operator type() { return value; }
其中,type 是要转换的目标类型,value 是对象被转换类型之后的值。

测试代码:
[C++] 纯文本查看 复制代码
#include <iostream>
using namespace std;


class three_d {
        int x, y, z;    //三个坐标值
public:
        three_d(int a, int b, int c) { x = a; y = b; z = c; }


        three_d operator+(three_d op2); //重载'+'运算符


        friend ostream &operator<<(ostream &stream, three_d &obj);


        operator int() {return x * y * z; }     //创建的转换函数
};


//输出3个坐标值 -- 通过类 three_d 的插入符
ostream &operator<<(ostream &stream, three_d &obj)
{
        stream << obj.x << ", ";
        stream << obj.y << ", ";
        stream << obj.z << "\n";


        return stream;  //返回流对象
}


three_d three_d::operator+(three_d op2)
{
        three_d temp(0, 0, 0);


        temp.x = x + op2.x;
        temp.y = y + op2.y;
        temp.z = z + op2.z;


        return temp;
}


int main()
{
        three_d a(1, 2, 3), b(4, 5, 6);


        cout << a << b;


        cout << b + 100;        //这里对象b被转换为int类型整数
        cout << "\n";


        a = a + b;      //两个three_d类型对象相加,没有发生呢类型转换


        cout << a;


        return 0;
}

运行输出:
./change
1, 2, 3
4, 5, 6
220
5, 7, 9
上面程序中,当执行 b + 100 这条语句时,自动发生了类型转换,因为与 b 相加的是整型数 100 ,因此对象的转换函数就被调用了 -- 将 b 转换整数 -- 而这个转换的结果是 b 中的 3 个成员相乘的乘积,所以最后的结果是  120 + 100 为 220 。

一旦创建了转换函数,那么在需要类型转换的时候都将调用这个函数,包括当对象被作为参数传递给函数时。例如,当 three_d 类型的对象被作为参数传递到标准的 abs() 函数时,因为函数 abs() 本身需要的也正是一个整型参数,所以程序仍然会调用从 three_d 到 int 类型的转换函数。

当然,我们还可以创建不同的类型转换函数以满足不同的需要。比如可以定义一个将 three_d 类型转换为 double 类型或 long 类型的转换函数。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2