运算符重载
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、运算符重载的格式如下:
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;的操作时,编译器会自动的寻找转换函数