第13章运算符重载 13.1运算符重载概述137下标运算符重载 132运算符重载的实现13.8运算符newN与deet重载 13.3单目运算符重载 13,13逗号运算符重载 134双目运算符重载 13.5->运算符重载 13,10类型转换运算符重载 13.6赋值运算符重载13,11运算符重载应用实例
第13章 运算符重载 13.1 运算符重载概述 13.2 运算符重载的实现 13.3 单目运算符重载 13.4 双目运算符重载 13.5 ->运算符重载 13.6 赋值运算符重载 13.7 下标运算符重载 13.8 运算符new与delete重载 13.13 逗号运算符重载 13.10 类型转换运算符重载 13.11 运算符重载应用实例
C++语言允许程序员重新定义已有的运算 符,使其能按用户的要求完成一些特定的操作, 这就是所谓的运算符重载。运算符重载与函数 重载相似,其目的是设置某一运算符,让它具 有另一种功能,尽管此运算符在原先C++语言 中代表另一种含义,但他们彼此之间并不冲突。 C++会根据运算符的位置辨别应使用哪一种功 能进行运算
C++语言允许程序员重新定义已有的运算 符,使其能按用户的要求完成一些特定的操作, 这就是所谓的运算符重载。运算符重载与函数 重载相似,其目的是设置某一运算符,让它具 有另一种功能,尽管此运算符在原先C++语言 中代表另一种含义,但他们彼此之间并不冲突。 C++会根据运算符的位置辨别应使用哪一种功 能进行运算
1131运算符重载概述 运算符重载是对已有的运算符赋予多重含义,同 个运算符作用于不同类型的数据导致不同类型的行 为。C++中预定义的运算符的操作对象只能是基本数 据类型,实际上,对于很多用户自定义类型,也需要 有类似的运算操作,这就提出了对运算符进行重新定 义,赋予已有符号以新功能的要求 运算符重载的实质就是函数重载。在实现过程中, 首先把指定的运算表达式转化为对运算符函数的调用, 运算对象转化为运算符函数的实参,然后根据实参的 类型来确定需要调用的函数,这个过程是在编译过程 中完成的。 C++可以重载的运算符如表13-1所示; C++不能被重载的运算符如表13-2所示
13.1 运算符重载概述 运算符重载是对已有的运算符赋予多重含义,同 一个运算符作用于不同类型的数据导致不同类型的行 为。C++中预定义的运算符的操作对象只能是基本数 据类型,实际上,对于很多用户自定义类型,也需要 有类似的运算操作,这就提出了对运算符进行重新定 义,赋予已有符号以新功能的要求。 运算符重载的实质就是函数重载。在实现过程中, 首先把指定的运算表达式转化为对运算符函数的调用, 运算对象转化为运算符函数的实参,然后根据实参的 类型来确定需要调用的函数,这个过程是在编译过程 中完成的。 C++可以重载的运算符如表13-1所示 ; C++不能被重载的运算符如表13-2所示
运算符重载的规则如下: (1)C++中的运算符除了少数几个以外,全部可 以重载,而且只能重载已有的这些运算符 (2)重载之后运算符的优先级和结合性都不会改 变。 (3)运算符重载是针对新类型数据的实际需要, 对原有运算符进行适当的改造。一般来讲,重载的功 能应当与原有功能相类似,不能改变原运算符的操作 对象个数,同时至少要有一个操作对象是自定义类型
运算符重载的规则如下: (1)C++中的运算符除了少数几个以外,全部可 以重载,而且只能重载已有的这些运算符。 (2)重载之后运算符的优先级和结合性都不会改 变。 (3)运算符重载是针对新类型数据的实际需要, 对原有运算符进行适当的改造。一般来讲,重载的功 能应当与原有功能相类似,不能改变原运算符的操作 对象个数,同时至少要有一个操作对象是自定义类型
132运算符重载的实现 运算符的重载形式有两种:重载为类的成员函数 和重载为类的友元函数。 运算符重载为类的成员函数的语法形式如下: operator() ; friend operator() ;
13.2 运算符重载的实现 运算符的重载形式有两种:重载为类的成员函数 和重载为类的友元函数。 运算符重载为类的成员函数的语法形式如下: operator () { ; } friend operator () { ; }
其中,指定了重载运算符的返回值类型, operator是定义运算符重载函数的关键词,给 定了要重载的运算符名称,是C++中可重载的运算符, 形参表中给出重载运算符所需要的参数和类型。对于 运算符重载为友元函数的情况,还要在函数类型说明 之前使用 friend关键词来说明。 当运算符重载为类的成员函数时,函数的参数个 当重载为类的友元函数时,参数个数与原运算数的个 数相同 般来讲,单目运算符最好重载为成员函数,而 双目运算符则最好重载为友元函数。运算符重载的主 要优点就是允许改变使用于系统内部的运算符的操作 方式,以适应用户新定义类型的类似运算
其中,指定了重载运算符的返回值类型, operator是定义运算符重载函数的关键词,给 定了要重载的运算符名称,是C++中可重载的运算符, 形参表中给出重载运算符所需要的参数和类型。对于 运算符重载为友元函数的情况,还要在函数类型说明 之前使用friend关键词来说明。 当运算符重载为类的成员函数时,函数的参数个 数比原来的运算数个数要少一个(后缀++、--除外); 当重载为类的友元函数时,参数个数与原运算数的个 数相同。 一般来讲,单目运算符最好重载为成员函数,而 双目运算符则最好重载为友元函数。运算符重载的主 要优点就是允许改变使用于系统内部的运算符的操作 方式,以适应用户新定义类型的类似运算
113.3单目运算符重载 类的单目运算符可重载为一个没有参数的非静态 成员函数或者带有一个参数的非成员函数,参数必须 是用户字定义类型的对象或者是对该对象的引用 在C++中,单目运算符有++和-,它们是变量自 动增1和自动减1的运算符。在类中可以对这两个单目 运算符进行重载。 如同“++运算符有前缀、后缀两种使用形式 ++”和“-”重载运算符也有前缀和后缀两种运算符 重载形式,以“++重载运算符为例,其语法格式如 operator++(); /前缀运算 operator++(int);〃后缀运算
13.3 单目运算符重载 类的单目运算符可重载为一个没有参数的非静态 成员函数或者带有一个参数的非成员函数,参数必须 是用户字定义类型的对象或者是对该对象的引用。 在C++中,单目运算符有++和--,它们是变量自 动增1和自动减1的运算符。在类中可以对这两个单目 运算符进行重载。 如同“++”运算符有前缀、后缀两种使用形式, “++”和“--”重载运算符也有前缀和后缀两种运算符 重载形式,以“++”重载运算符为例,其语法格式如 下: operator ++(); //前缀运算 operator ++(int); //后缀运算
使用前缀运算符的语法格式如下: +; 使用后缀运算符的语法格式如下: ++; 使用运算符前缀时,对对象(操作数)进行增量 修改,然后再返回该对象。所以前缀运算符操作时, 参数与返回的是同一个对象。这与基本数据类型的运 算符前缀类似,返回的也是左值 使用运算符后缀时,必须再增量之前返回原有的 对象值。为此,需要创建一个临时对象,存放原有的 对象,以便对操作数(对象)进行增量修改时,保存 最初的值。运算符后缀操作时返回的时原有对象值, 不是原有对象,原有对象已经被增量修改,所以,返 回的应该是存放原有对象值的临时对象
使用前缀运算符的语法格式如下: ++; 使用后缀运算符的语法格式如下: ++; 使用运算符前缀时,对对象(操作数)进行增量 修改,然后再返回该对象。所以前缀运算符操作时, 参数与返回的是同一个对象。这与基本数据类型的运 算符前缀类似,返回的也是左值。 使用运算符后缀时,必须再增量之前返回原有的 对象值。为此,需要创建一个临时对象,存放原有的 对象,以便对操作数(对象)进行增量修改时,保存 最初的值。运算符后缀操作时返回的时原有对象值, 不是原有对象,原有对象已经被增量修改,所以,返 回的应该是存放原有对象值的临时对象
134双目运算符重载 对于双目运算符,一个运算数是对象本身的数据, 由this指针给出,另一个运算数则需要通过运算符重载 函数的参数表来传递。下面分别介绍这两种情况 对于双目运算符B,如果要重载B为类的成员函数, 使之能够实现表达式“oprd1 B oprd2”,其中oprd1为 A类的对象,则应当把B重载为A类的成员函数,该函 数只有一个形参,形参的类型是opd2所属的类型。经 过重载之后,表达式oprd1Bopd2就相当于函数调用 “oprd1. operator B(oprd2)”。 运算符也可以重载为类的友元函数,这样,它就 可以自由地访问该类的任何数据成员。这时,运算符 所需要的运算数都需要通过函数的形参表来传递,在 参数表中形参从左到右的顺序就是运算符运算数的顺 序
13.4 双目运算符重载 对于双目运算符,一个运算数是对象本身的数据, 由this指针给出,另一个运算数则需要通过运算符重载 函数的参数表来传递。下面分别介绍这两种情况。 对于双目运算符B,如果要重载B为类的成员函数, 使之能够实现表达式“oprd1 B oprd2”,其中oprd1为 A类的对象,则应当把B重载为A类的成员函数,该函 数只有一个形参,形参的类型是oprd2所属的类型。经 过重载之后,表达式oprd1 B oprd2就相当于函数调用 “oprd1.operator B(oprd2)”。 运算符也可以重载为类的友元函数,这样,它就 可以自由地访问该类的任何数据成员。这时,运算符 所需要的运算数都需要通过函数的形参表来传递,在 参数表中形参从左到右的顺序就是运算符运算数的顺 序
113.5->运算符重载 >”运算符是成员访问运算符,这种一元的运算 符只能被重载为成员函数,所以也决定了它不能定义 任何参数。一般成员访问运算符的典型用法是: 对象→>成员 成员访问运算符“->函数重载的一般形式为 type class name: operator->();
13.5 ->运算符重载 “->”运算符是成员访问运算符,这种一元的运算 符只能被重载为成员函数,所以也决定了它不能定义 任何参数。一般成员访问运算符的典型用法是: 对象->成员 成员访问运算符“->”函数重载的一般形式为: type class_name::operator->();