C++ 运算符重载

来源:互联网 发布:周春芽绿狗 知乎 编辑:程序博客网 时间:2024/06/05 19:10

一,运算符重载

运算符重载是一种静态的C++多态,C++允许将运算符扩展到用户定义的类型,例如:可以把两个对象相加。编译器将根据操作数的数目以及类型来决定使用哪种加法定义,重载使代码看起来更加的自然。


二,运算符重载实例

定义一个与时间相关的类Time

class Time{private:    int hours;    int minutes;public:    Time():hours(0), minutes(0){};    Time(int h, int m):hours(h), minutes(m){}    Time operator+(const Time &t) const;    friend ostream & operator<<(ostream &os, const Time &t);};Time Time::operator+(const Time &t) const{    Time sum;    sum.minutes = minutes + t.minutes;    sum.hours = hours + t.hours + sum.minutes / 60;    sum.minutes = sum.minutes % 60;    return sum;}ostream & operator<<(ostream &os, const Time &t){    os<<t.hours<<" "<<t.minutes<<endl;    return os;}int main(){    Time t1(1, 20);    Time t2(1, 20);    Time sum = t1 + t2;    cout<<sum;    return 0;}
输出结果

2 40Process returned 0 (0x0)   execution time : 0.010 sPress any key to continue.

operator+()函数的名称使得可以使用函数表示法或运算符表示法来调用。

下面这两种方式的计算结果是一样的:

Time sum = t1.operator+(t2);Time sum = t1 + t2;


三,运算符重载的限制

1,重载后的运算符必须至少有一个是用户自定义类型,这将防止用户为标准类型重载运算符。

2,使用运算符时不能违反运算符原来的语法规则(操作数个数、优先级、结合性)。

3,不能重载下面的运算符

(1),sizeof 运算符。

(2),. 成员运算符。

(3),:: 作用域解析运算符。

(4),?: 条件运算符。

(5),typeid 一个RTTI运算符。

(6),四种类型转换运算符。


4,大多数的运算符可以通过成员或非成员函数进行重载,但是下面的运算符只能通过成员函数进行重载。

(1), = 赋值运算符。

(2),() 函数调用运算符。

(3),[] 下标运算符。

(4),-> 通过指针访问类成员运算符。


四,重载运算符作为成员函数的局限性

把运算符重载为类的成员函数,运算符左侧的操作数是调用对象,因此,运算符的第一个操作数必须是类对象。因为,重载运算符作为成员函数,当对象调用这个函数时,一个参数通过this指针隐式传递。例如:

Time operator+(const Time &t) const;

加法运算符需要两个操作数,上面operator+的参数只有一个,其中的一个操作数是被隐式传递的调用对象。


五,运算符重载与函数重载

1,函数重载

C++允许功能相近的函数,在相同的作用域内以相同函数名声明,从而形成函数重载。


2,运算符重载

运算符重载是对已有的运算符赋予更多的含义。C++预定义的运算符只能用于基本类型数据,不能用于自定义类型数据。编译器对重载运算符的选择,遵循函数重载的原则。运算符重载的实质就是函数重载。

1 0
原创粉丝点击