运算符重载专题

来源:互联网 发布:2016第二季度经济数据 编辑:程序博客网 时间:2024/06/14 18:31

1.不能重载的运算符

 

类属关系运算符“.”

成员指针运算符“*”

作用域分辨符“::”

sizeof运算符

三目运算符“?:”


2.基本规则


1.一元操作符可以是不带参数的成员函数或带一个参数的非成员函数。


2.二元操作符可以是带一个参数的成员函数或带两个参数的非成员函数。


3.operator=、operator[]、operator()、operator->只能定义为成员函数。

4.成员函数重载operator++和Operator--时带一个int参数表示后缀(即后缀是二元操作符)

   不带参数表示前缀(即前缀是一元操作符)

 

 

1)运算符重载为成员函数

(a)对于二元运算符op,如果要重载op为某类的成员函数,使之能够实现表达式 k op t,其中k为A类的对象,则应当把op重载为A类的成员函数,该函数只有一个形参,形参的类型是t所属的类型。经过这样重载之后,表达式 k op t 就相当于函数调用k.operator op( t )

(b)对于前置一元运算符U(如负号“-”“--”“++”),若要重载U为类的成员函数,用来实现表达式U oprd,其中oprd为A类的对象,则U应当重载为A类的成员函数,且该函数不带形参。经过重载之后,表达式U oprd 就相当于函数调用oprd.operator U()。

(b)后置运算符“++”和“--”,若要将它们重载为类的成员函数,用来实现表达式oprd++或oprd--,其中oprd为A类的对象,那么就应当重载这2个运算符为A类的成员函数,这时函数要带有一个整型(int)形参(相当于是二元操作符,只是一元的形式)。重载之后,表达式 oprd ++ 和 oprd -- 就分别相当于函数调用oprd.operator ++(0) 和 oprd.operator --(0)。

 

 

(2)运算符重载为全局(友元)函数

(a)对于二元运算符op,如果它的一个操作数为类A的对象,就可以将op重载为A类的友元函数,该函数有两个形参,其中一个形参的类型是A类。经过这样的重载之后,表达式k op t就相当于函数调用operator op( k, t )

(b)对于前置一元运算符U(如负号“-”“++”“--”),若要实现表达式 U oprd 其中oprd为A类的对象,则U可以重载为A类的友元函数,函数有一个形参,为A类的对象oprd。经过重载之后,表达式U oprd 就相当于函数调用operator U( oprd )

(c)对于后置运算符“++”和“--”,如果要实现表达式 oprd ++ 或 oprd --, 其中oprd为A类的对象,那么运算符就可以重载为A类的友元函数,这时函数的形参有两个,一个是A类的对象oprd,另一个是整型(int)形参。第二个参数是用于与前置运算符函数相区别的。重载之后,表达式oprd ++ 和 oprd -- 就分别相当于函数调用operator ++ (oprd, 0)

和operator -- (oprd, 0)。

     一般说来,单目运算符最好被重载为成员;对双目运算符最好被重载为友元函数,双目运算符重载为友元函数比重载为成员函数更方便,但是,有的双目运算符还是重载为成员函数为好,例如,赋值运算符。

 



原创粉丝点击