C实验友元函数等.ppt
文本预览下载声明
友元函数 概念:允许一个类将对其非公有成员的访问权授予指定的函数或类。 只能出现在类定义内部,通常将友元声明成组的放在类定义的开始或结尾。 我的算法思路 将2个日期对象的年和月日拆分计算: 例如:计算 2004年3月7日到2009年4月8日的天数差距 第一部分:先计算年之间的天数差距:2004-2008年之间的相差天数,这里要注意闰年的判断! 那么2004年-2008年的年份天数差距包括: 2004年的366天,2005年的365天,2006年的365天,2007年的365天,2008年的366天; 总计:yearDay = 366+365*3+366 = 1827; static类成员 与普通数据成员的区别: 通常,非static数据成员存在于类类型的每个对象中;static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的,并不与该类的对象相关联。 使用static成员的优点 1. static成员的名字是在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突。 2.可以实施封装。Static成员可以是私有成员,而全局对象不行。 3. 通过阅读程序容易看出static成员是与特定类关联的,清晰的显示程序员的意图。 使用类的static成员 可以通过作用域操作符从类直接调用static成员,或者通过对象、引用或指向该类类型对象的指针间接调用; 像其他成员一样,类成员函数可以不用作用域操作符来引用类的static成员。 static成员的定义及初始化 Static成员函数:在类外部定义static成员时,无需重复指定static保留字,该保留字只出现在类定义体内部的声明处; 注意:static成员函数没有this指针,可以直接访问所属类的static成员,不能直接(说明可以间接)使用非static成员;不能被声明为const(常函数),也不能被声明为虚函数。 Static数据成员:必须在类定义体外的外部定义(正好一次),不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。 特殊的const static成员 大家自己去参考书本401-402页 Class A{ //类定义 public: static void f( A ); //静态成员函数 private: int x; //普通数据成员 static int sx; //静态数据成员 }; int A::sx = 0; //类外需对静态数据成员初始化 void f(A c){ c.x = 20; //间接的访问对象成员 coutc.xendl; } //接上 void main() { A a; a.f(a); //通过对象调用静态成员函数 A::f(a); //通过类作用域操作符调用静态成员函数 } 析构函数 构造函数的一个用途是自动获取资源,在构造函数中分配了资源后,需要一个对应操作自动回收或释放资源。析构函数就是这样的一个特殊函数,完成资源回收,作为类构造函数的补充! 何时调用析构函数 撤销类对象时会自动调用析构函数 变量(类对象)在超出作用域时应自动撤销,此时会调用对应的析构函数! 注意:动态分配(即new出来)的对象只有在delete指向该对象的指针时才撤销,如果没有delete,则不会运行该对象的析构函数,导致内存泄露!如: { A a1; //a1是一个局部对象,并不是动态分配的 A* a2 = new A; //A是一个类,a2为动态分配的对象 }//超出作用域了,a1被释放,自动调用析构函数,但a2所指//向的内存不会被释放,应增加delete a2; 何时编写析构函数 仅在有些工作需要析构函数完成时,才需要析构函数,析构函数通常用于释放在构造函数或在对象生命周期内获取的资源! 三法则: 如果类需要析构函数,那么它也需要赋值操作符和复制构造函数! 是否有显示地调用构造函数或析构函数? 答案是有的:关键要理解何时需要调用,当然我们平常很少甚至不需要去显示调用! 例如vector类,我们知道创建一个vector对象时,可以指定大小,比如指定10: vectorstring svec(10); 而系统实际上分配的空间是超过10个的,比如会预先分配15个空间,由于vector是支持随机访问的,所以它的存储空间是一块连续的内存(回顾下链表的存储方式),如果没有预留空间,那么增加元素的时候不得不再次分配更大的空间,然后把原先的元素复制到新的空间中,会造成性能问题! 我们已经知道vector在保存类对象的时候,会调用相应的构造函数初始化每个元素,但是预留的空间呢? 如果也调用构造函数
显示全部