C++中的运算符重载,帮我详细介绍下
2个回答
展开全部
运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为。运算符重载的实质就是函数重载。在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中完成的。
一、运算符重载的作用
运算符重载为类的用户提供了更直观的接口,使类类型的对象也可以像普通变量一样进行运算符的表达式运算。运算符重载允许C/C++的运算符在用户定义类型(类)上拥有一个用户定义的意义。
二、运算符重载的规则
(1)C++中的运算符除了少数几个以外,全部可以重载,而且只能重载已有的运算符。
可以重载的运算符有:
算术运算符:+,-,*,/,%,++,--;
位操作运算符:&,|,~,^,<<,>>
逻辑运算符:!,&&,||;
比较运算符:<,>,>=,<=,==,!=;
赋值运算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;
其他运算符:[],(),->,,(逗号运算符),new,delete,new[],delete[],->*。
不能重载的运算符只有5个:
类属关系运算符“.”,成员指针运算符“*”,作用域分辨符“::”,sizeof运算符和三目运算符“?:”。
(2)重载之后运算符的优先级和结合性都不变。
(3)四个“不能改变”
·不能改变运算符操作数的个数;
·不能改变运算符原有的优先级;
·不能改变运算符原有的结合性;
·不能改变运算符原有的语法结构。
(4)至少要有一个操作对象是自定义类型。
(5)重载的运算符含义必须清楚,不能有二义性。
三、运算符重载的2种方法
(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)。
一、运算符重载的作用
运算符重载为类的用户提供了更直观的接口,使类类型的对象也可以像普通变量一样进行运算符的表达式运算。运算符重载允许C/C++的运算符在用户定义类型(类)上拥有一个用户定义的意义。
二、运算符重载的规则
(1)C++中的运算符除了少数几个以外,全部可以重载,而且只能重载已有的运算符。
可以重载的运算符有:
算术运算符:+,-,*,/,%,++,--;
位操作运算符:&,|,~,^,<<,>>
逻辑运算符:!,&&,||;
比较运算符:<,>,>=,<=,==,!=;
赋值运算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;
其他运算符:[],(),->,,(逗号运算符),new,delete,new[],delete[],->*。
不能重载的运算符只有5个:
类属关系运算符“.”,成员指针运算符“*”,作用域分辨符“::”,sizeof运算符和三目运算符“?:”。
(2)重载之后运算符的优先级和结合性都不变。
(3)四个“不能改变”
·不能改变运算符操作数的个数;
·不能改变运算符原有的优先级;
·不能改变运算符原有的结合性;
·不能改变运算符原有的语法结构。
(4)至少要有一个操作对象是自定义类型。
(5)重载的运算符含义必须清楚,不能有二义性。
三、运算符重载的2种方法
(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)。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询