曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 2957|回复: 0
打印 上一主题 下一主题

创建转换函数

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2011-12-16 10:42:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有时候需要在表达式中将自己创建的类和其它数据类型进行混合运算,这虽然可以通过类的重载运算符来实现,但一种更简单的方法是我们自己创建转换函数,通过转换函数我们可以将类转换为与表达式中其它部分兼容的类型。类型转换函数的通用形式如下:
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 类型的转换函数。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 00:28 , Processed in 0.080391 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表