第11章 重载与模板.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第11章 重载与模板

第11章 重载与模板 编译时的多态性是通过函数重载和模板体现的。 利用函数重载机制,在调用同名的函数时,编译系统可根据实参的具体情况确定所调用的是同名函数中的哪一个。 利用函数模板,编译系统可根据模板实参以及模板函数实参的具体情况确定所要调用的是哪个函数,并生成相应的函数实例; 运算符重载是函数重载的一种特殊情况。利用类模板,编译系统可根据模板实参的具体情况确定所要定义的是哪个类的对象,并生成相应的类实例。 §11.1 重载 定义 函数重载(function overloading )是指一个函数名称具有不同形式的参数的若干个(两个以上)函数的定义。 注意:重载函数可以具有相同的返回类型.但必须有不同类型的参数列表。用不同返回类型和相同参数表生成重载函数将产生语法错误。编译器只用参数列表的数据类型区别同名函数。重载函数不一定要有相同个数的参数,它们可以有不同个数的参数列表。程序员使用带默认值参数的重载函数时要小心,以免出现歧义。 一、运算符重载 引入 类的对象(即抽象数据类型的实例)的操作是通过向对象发送消息完成其功能的(即调用成员函数的形式)。对某些类(特别是有些数值计算类)来说,这种调用方式是繁琐的,而用C++中的丰富的内部运算符来指定对对象的操作会更容易表达和理解。 定义 把C++中的运算符和类的对象结合在一起形成有意义的表达式,这个过程称为运算符重载。 注意: 重载不能改变运算符的优先级。虽然重载具有固定优先级的运算符可能会不便使用,但是在表达式中使用圆括号可以强制改变重载运算符的计算顺序。 重载不能改变运算符的结合律。 重载不能改变运算符操作数的个数。重载的一目运算符仍然是一目运算符,重载的二目运算符仍然是二目运算符,但C++中的唯一的三目运算符(?:)也不能被重载。运算符、*、+和-既可以用作一元运算符,也可以用作二目运算符,可以分别把他们重载为一目运算符和二目运算符。 重载不能创建新的运算符,只有现有的运算符才能被重载。 运算符重载不能改变该运算符用于内部类型对象时的含义。例如,程序不能改变运算符+用于两个整数相加的含义。运算符重载通常和用户自定义的类类型的对象一起使用,或者类类型的对象和内部类型的对象混合运算。 运算符重载函数说明的一般形式如下 : 类类型 operator运算符(参数说明) ; 运算符重载函数定义的一般形式如下: 类类型 类类型名称::operator运算符(参数说明) { 语句序列 } 用于类的对象的运算符必须重载,但有两种情况需要注意: 赋值运算符“=”无需重载就可用于每一个类类型。在没有重载赋值运算符时,赋值运算符的缺省行为是复制对象的数据成员。但是,这种缺省的复制行为用于带有指针成员的对象时是危险的,该情况通常需要显式重载赋值运算符。 地址运算符也无需重载就可以用于任何类的对象,它返回对象在内存中的地址。地址运算符也可以被重载。 当一个类重载了赋值运算符 = 和加法运算符 +,下列语句是允许的: object2 = object2 + object1; 但并不意味运算符 += 也被自动重载了。因此,下面的语句是错误的: object2 += object1; 然而,显式地重载运算符 += 可使上述语句成立。 运算符重载函数既可以是类的成员函数,也可以是非成员函数。非成员函数通常是友元函数。成员函数是用this指针隐式地访问类的对象参数,非成员函数的调用必须明确地列出类的对象参数。不管运算符重载函数是成员函数还是非成员函数,运算符在表达式中的使用方式是相同的。 运算符重载函数的实现方式通常根据下列情况来选择: 当运算式子的左边操作数(或者只有左边的操作数)是定义类的一个对象(或者是对象的引用) ,运算符重载函数可以实现为定义类的一个成员函数。 当左边的操作数可能是另一个不同类的对象(或者为一个内部类型的操作数),运算符重载函数必须要用一个非成员函数来实现。由于运算符重载函数为类的非成员函数,当需要访问类的对象的隐藏成员时,则必须指定为该类一个友元函数。 【例11.1】实现复数类并重载有关的运算符。 //Complex.h-存放类定义的文件 class CComplex //定义一个复数类 { public: CComplex(double m_re=0,double m_im=0); //含有缺省值的构造函数 CComplex(CComplex x); //复制构造函数 CComplex operator+(double x); //实现左边为

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档