operator 类型转换及重载

一、类型转换
类型转换函数的一般形式为 :
operator 类型名 ()
{实现转换的语句}
在函数名前面不能指定函数类型,函数没有参数.
 
如:
Complex::operator double()
{
return m_dReal;
}
int main()
{
Complex obj(3,4);
double dNum = 0.0;
dNum = 2.5 + obj;
cout<<"dNum="<<dNum<<endl;//dNum=5.5
return 0;
}
如果在Complex类中没有定义类型转换函数operator double, 程序编译 将出错. 因为不能实现double型数据与Complex类对象相加. 现在,一定了成员函数operator double, 就可以利用它将Complex类对象转换为double型数据. 请注意 : 程序中不必显式地调用类型转换函数,它是自动被调用的,即 隐式调用 .
 
二、operator 重载圆括号
 
include <iostream>
using namespace std;
class Time{
    int hour;
    int minute;
    int second;
public:
    Time( int h=0, int m=0, int s=0 )
    {
        operator()( h, m, s );
    }
    //版本0,返回时间表示的秒数
    int operator()()
    {
        return hour*3600+minute*60+second;
    }
    //版本1,设置为整点
    void operator()( int h )
    {
        operator()( h, 0, 0 );
    }
    //版本2,设置整小时和分钟
    void operator()( int h, int m )
    {
        operator()( h, m, 0 );
    }
    //版本3,设置时分秒
    void operator()( int h, int m, int s )
    {
        hour = h;
        minute = m;
        second = s;
    }
    friend ostream& operator<<( ostream& os, const Time& ct )
    {
        os << ct.hour << ';:';;
        if( ct.minute<10 )
            os << ';0';;
        os << ct.minute << ';:';;
        if( ct.second<10 )
            os << ';0';;
        os << ct.second;
        return os;
    }
};
int main()
{
    Time t;
    cout << t << endl;
    t( 9 );//调用版本1
    cout << t << endl;
    t( 7, 30 );//调用版本2
    cout << t << endl;
    t( 0, 10, 20 );//调用版本3
    cout << t << endl;
    cout << t() << endl;//调用版本0
    return 0;
}

三、重载解引用
T& operator*() const
    {
        if(!_ptr)
        {
            throwNullHandleException(__FILE__, __LINE__);           
        }

        return *_ptr;
    }

四、重载->
#include <iostream>
using namespace std;

class A{
public:
	void action(){
		cout << "Action in class A!" << endl;
	}
};

class B{
	A a;
public:
	A* operator->(){
		return &a;
	}
	void action(){
		cout << "Action in class B!" << endl;
	}
};

class C{
	B b;
public:
	B operator->(){
		return b;
	}
	void action(){
		cout << "Action in class C!" << endl;
	}
};

int main(int argc, char *argv[])
{
	C* pc = new C;
	pc->action();
	C c;
	c->action();	
	getchar();
	return 0;
}

上面代码输出结果是:

Action in class C!
Action in class A!

c是对象,c后面的箭头操作符使用的是重载箭头操作符,即调用类C的operator->()成员函数。此时返回的是类B的对象,所以调用类B的operator->()成员函数,B的operator->()返回的是指针,所以现在可以使用内置箭头操作符了。对B的operator->()返回的指针进行解引用,然后调用解引用后的对象的成员函数action,此时调用的就是类A的action()。这里存在一个递归调用operator->()的过程,最后再使用一次内置含义的箭头操作符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值