C++ 运算符重载 类类型的转换

运算符重载
1、运算符重载的格式如下:
operator op(argument-list)其中op必须是有效的C++运算符如:+ - * []等

下面是一个重载+的例子:

#ifndef CLASS_H
#define CLASS_H

class Time{

    private:
        int hours;
        int minutes;
    public:
        Time operator+(Time &t);
        Time operator*(double n);

}
#endif


...
Time Time::operator+(Time &t)
{
    Time sum;
    sum.hours = this.hours+t.hours;
    sum.minutes = this.minutes + t.minutes;
    
    return sum;
}

Time Time::operator+(double n)
{
    Time sum;
    sum.hours = this.hours*n;
    sum.minutes = this.minutes*n;
    
    return sum;
}



void main()
{
    Time t1, t2;
    Time sum;
    sum = t1 + t2;  //相当于sum = t1.operator+(t2)
    sum = t1 * 1.2; //一定要记住运算符使用时的顺序问题,doule类型必须放在第二位, 也就是说左侧的操作数应该是调用对            象
}

2、
上述例子试讲运算符重载作为类的成员函数,还可以将重载运算符作为非成员函数来实现,这样做的好处是不必考虑操作数的顺序问题。

此时会用到友元函数,因为我们需要去访问类的成员。

声明 :friend Time operator*(double n, const Time & t); //不是类的成员函数,但是与累的成员函数权限相同
定义 :Time operator*(double n, const Time & t)         //不需要Time::限定符
        {...}


3、、运算符重载的限制

1)必须至少有一个为用户自定义的类型,这样可以防止用户为标准的C++类型重载
2)重载之后不能违反原来的运算符的运算规则
3)不能自创不存在的运算符
4)规定的不能重载的运算符:
    sizeof    . :: ?: typeid 以及一些强制转换符
5)有一些只能通过成员函数进行重载:
    =,(), [],->

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

1、

例如有如下的构造函数

Time(double d);  Time(double d , int i=0);

此时可以这样进行对象的初始化    Time t = Time(16.2);     Time t = 16.2;

它将自动去匹配构造函数,进行隐式转换。。但是注意一点,能做这种转换的构造函数只能接受一个参数或者有默认的参数。

想要去除这种自动隐式转换可以在构造函数声明时加上explicit关键字

2、

那么如何将类类型转换为基本的数据类型呢? 用户必须提供转换函数才行

转换函数必须为类成员函数 , 形式如下:operator typename();

定义过转换函数以后,在进行如double d = t;的操作时,编译器会自动的寻找转换函数


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值