- 1、本文档共86页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第 9 章 类的高级部分 皮德常 南京航空航天大学 计算机科学与技术学院 主要内容 9.1 静态成员 例:一个学生类,定义其对象张三、李四,他们分别维护着类成员的一份副本(学号、姓名、籍贯等)。 如果要统计一个班学生总数? 用类外的变量记录,违背了数据封装。 用类的一个数据成员记录,导致多个副本,不仅冗余,而且势必造成数据不一致。 9.1.1 静态数据成员 1. 用关键字static声明; 2. 同一个类中的所有对象都共享该变量; 3. 必须在类外定义和初始化,用(::)来指明所属的类。 4. 静态变量不依赖于对象而存在,无论是否定义该类的对象,这种类型的变量都存在。静态数据成员实际上是在类外定义的一个变量,它的生存期和整个程序的生存期一样,在定义对象之前,静态数据成员就已经存在。 9.1.2 静态函数成员 静态函数成员是类中的一个函数,有static修饰。 静态函数成员和静态数据成员类似,在对象生成之前也已经存在。这就是说在对象产生之前,静态的函数成员就能访问其它静态成员。 类外代码可以使用类名和作用域操作符来调用静态成员函数。 静态成员函数只能引用属于该类的静态数据成员或静态成员函数。见例【例9-2】。 9.2 友元函数 引入友元的原因? 1. 友元函数不是类中的函数成员,但它和类的函数成员一样,可以访问类中定义的私有成员。 2. 友元函数可以是一个外部函数,也可以是另外一个类的函数成员。 3. 将某个函数声明为一个类的友元方式,前面加friend 。 9.2.3 一个类作为另外一个类的友元 若一个类为另一个类的友元,则此类的所有成员都能访问对方类的私有成员。 9.3 对象赋值问题 采用赋值运算符“=”可以将一个对象赋值给另外一个对象,或者采用一个对象初始化另外一个对象。在缺省情况下,这两个操作执行的是对象成员之间的拷贝,也称为按位拷贝或浅拷贝。 【例9-5】浅拷贝应用举例。 . 9.3 对象赋值问题(continued) 当采用一个对象初始化另一个对象时,对象成员之间的赋值也是按位拷贝。 赋值和初始化的区别:赋值出现在两个对象都已经存在的情况下,而初始化出现在创建对象时,例如:Rectangle box1; box1. setData(100, 50); Rectangle box2 = box1; // initialization 9.4 拷贝构造函数 拷贝构造函数是一个特殊的构造函数,当定义一个对象并采用同类型的另外一个对象初始化时,将自动调用拷贝构造函数。 通常,采用缺省的按位拷贝操作也能正确地实现赋值,但在某些情况下不能正确执行。 Example: 进一步演化:Using const Parameters 9.4.1 缺省的拷贝构造函数 如果一个类没有定义拷贝构造函数,C++将为其创建一个缺省的拷贝构造函数。 缺省的拷贝构造函数的功能就是按位赋值。 9.4.4 编译器的一个纰漏 9.4.4 编译器的一个纰漏 9.5 运算符重载 Example 1: The / operator can perform two types of division: floating point and integer. Example 2:Date today( 2011 , 4 , 28 ); today.add (5 );today += 5;//9.5.1 重载赋值运算符 如果对象中有指针成员,采用拷贝构造函数能解决对象初始化问题,但并不能处理对象赋值。 Example: operator= 函数的参数不一定是常引用,上述声明优点 : (1) 效率高。采用引用可以防止参数传递时生成对象拷贝,节省了对象初始化和析构的过程。 (2) 将参数声明为常引用,可以防止函数无意间修改对象right的内容。 (3) 符合赋值运算的常识。 函数调用: p2.operator = (p1);p2 = p1;p3 = p2 = p1; //9.5.2 this指针 this是一个隐含的内嵌指针,它指向调用成员函数的当前对象。 Example: cout person1.getName( ) endl; cout person2.getName( ) endl; 9.5.3 重载双目算术运算符 引入原因:Feetinches length1(3,5), length2(6,3), length3; length3 = length1 + length2;// 等价于 length3 = length1.operator + ( length2 ); 仅讲述如何重载双目运算
文档评论(0)