重载与模板

来源:互联网 发布:电脑淘宝怎么删除评价 编辑:程序博客网 时间:2024/06/03 21:16

重载与模板

重载

在重载的定义中,运算符重载是面向对象程序设计的重要特征。运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的函数导致不同的行为。

 

C++在进行运算符重载时,必须写一个运算符函数,其名字规定为operator后随一个要重载的运算符。

 

运算符重载是通过创建运算符重载函数来实现的,运算符重载函数定义了重载的运算符将要进行的操作。运算符重载函数一般定义为它将要操作的类的成员函数或定义为类的友元函数。

 

需要说明的是,(1)运算符重载函数operator@()可以返回任何类型,甚至可以是void型,但通常返回类型与它所操作的类类型相同,这样可使重载运算符用在复杂的表达式中。(2)有的运算符不能定义为友元运算符重载函数。如赋值运算符=、下标运算符[]、函数调用运算符()等。(3)C++编译器根据参数的个数和类型来决定调用哪个重载函数。因此可以为同一个运算符定义几个运算符重载函数来进行不同的操作。

 

运算符重载是应该注意几个问题:

(1)              C++中只能对已有的C++运算符进行重载,不允许用户自己定义新的运算符。

(2)              C++中绝大部分的运算符允许重载,不能重载的运算符有以下几个:成员访问运算符(.)、成员指针访问运算符(.*)、作用域运算符(::)、长度运算符(sizeof)、条件运算符(?:)。

(3)              运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造完成的。一般而言,重载的功能应当与原有的功能相类似。

(4)              重载不能改变运算符的操作对象(即操作数)的个数。

(5)              重载不能改变运算符原有的优先级。C++已经预先规定了每个运算符的优先级,以决定运算次序。

(6)              重载不能改变运算符原有的结合特性。

(7)              运算符重载函数的参数不能全部是C++预定义的基本数据类型。这项规定是为了防止用户修改用于基本类型数据的运算符性质。

(8)              双目运算符一般可以被重载为友元函数或成员函数。

 

 

 

模板

函数模板实际上是建立一个通用函数,其函数返回值类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通过函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来替代,不必定义多个函数。在调用函数时系统会根据形参的类型(模板实参)来取代模板中虚拟类型从而实现了不同函数的功能。

 

在函数模板中允许使用多个类型参数。但是应当注意template定义部分的每个类型参数前必须有关键字typename(或class)。

 

在template语句与函数模板定义域举止间不允许插入别的语句。

 

同一般函数一样,函数模板也可以重载。

 

函数模板与同名的非函数模板函数可以重载。这种情况下调用顺序是:首先寻找一个参数完全匹配的非模板函数,如果找到了就调用它;若没找到,则寻找函数模板,将其实例化,产生一个匹配的模板函数,若找到了,就调用它。

 

类模板

类模板实际上是建立一个通用类,其数据成员、成员函数的返回类型和星灿类型不具体指定,用一个模拟的类型来代表。使用类模板定义对象时,系统会根据实参类型来取代类模板中虚拟类型从而实现了不同类的功能。

 

定义类模板与定义函数模板的格式相似,必须以关键字template开始,然后是尖括号括起来的模板函数,然后是类名。

 

与函数模板类似,其中,template是一个声明模板的关键字,它表示生命一个模板。类型参数(通常用C++标识符表示,如T、Type等)实际上是一个虚拟的类型名,现在并未指定他是哪一种具体的类型,但使用类模板时,必须将类型参数实例化。类型参数前需要加关键字typename(或class),typename与class的作用相同,都表示其后的参数是一个虚拟的类型名(即类型参数)。

 

在类声明中,欲采用通过数据类型的数据成员、成员函数的参数或返回类型前面需加上类型参数。

0 0
原创粉丝点击