单位竣工验收前提交质监站存档文件资料(新2010版)_第1页
单位竣工验收前提交质监站存档文件资料(新2010版)_第2页
单位竣工验收前提交质监站存档文件资料(新2010版)_第3页
单位竣工验收前提交质监站存档文件资料(新2010版)_第4页
单位竣工验收前提交质监站存档文件资料(新2010版)_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+更多特性,卢佩新,目录,友元静态成员成员函数的重载拷贝构造函数运算符类型转换操作符重载new与delete流操作符,Static Members,什么是静态成员static修饰符静态成员的特点,静态数据成员,所有的同一类对象都使用一份数据静态数据成员又称为类变量它属于这个类,被该类的全体对象共享类变量的初始化class Counter static int cnt;,类变量必须在class声明的外面单独声明,并初始化。如果不初始化,则编译器自动初始化0int Counter:cnt;或int Counter:cnt = 0;,静态函数成员,公共的静态函数成员就是一个全局函数对公共的静态函数可以直接调用,不需要通过任何对象静态成员函数中不得使用非静态数据成员,静态成员的应用例子 statics.cpp,#include using namespace std;class Catpublic:Cat(int age):itsAge(age)HowManyCats+; virtual Cat() HowManyCats-; virtual int GetAge() return itsAge; virtual void SetAge(int age) itsAge = age; static int HowManyCats; private:int itsAge;int Cat : HowManyCats = 0;void TelepathicFunction();,静态成员的应用例子 statics.cpp,int main()const int MaxCats = 5; int i;Cat *CatHouseMaxCats;for (i = 0; iMaxCats; i+)CatHousei = new Cat(i);TelepathicFunction();for ( i = 0; iMaxCats; i+)delete CatHousei;TelepathicFunction();return 0;void TelepathicFunction()cout There are ;cout Cat :HowManyCats cats alive!n;,友元,为什么需要友元: Friend As Bridges.什么东西可以成为友元友元函数友元函数是可以直接访问类的私有成员的非成员函数它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend友元类友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员) 当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类,友元的声明,友元函数的声明class Student friend void Register(Student,友元的例子 friend.cpp,#include using namespace std;class beta;class alpha private: int data; public: alpha(): data(3) friend int frifunc (alpha, beta);class beta private: int data; public: beta () : data (7) friend int frifunc(alpha, beta);,友元的例子 friend.cpp,int frifunc(alpha a, beta b) return (a.data + b.data); int main( ) alpha aa; beta bb; cout frifunc(aa, bb) aWidth;cout aLength;Rectangle Rect2(aWidth, aLength);cout nRect2 width: Rect2.GetWidth() endl;cout Rect2 length: Rect2.GetLength() endl;return 0;,Copy Constructor,当由一个已有的对象来构造一个新的对象时,需要copy constructor默认的对象拷贝普通类的copy constructorC+编译器会自动给每一个类加上一个如果没有使用任何动态空间,则可以使用系统的:浅拷贝 (memcpy() will be called)如果该类使用了任何动态分配的内存,则需要重载copy constructor深拷贝 (need overload copy constructor),调用copy constructor,类A的定义如下class A int a;public:A(int v = 0) : a(v) ;下面分别生成对象o1与o2有何不同A o1(3);A o2 = o1;A o1(3);A o2;o2 = o1;,A o2 = o1;使用copy constructorA o2;o2 = o1;使用赋值语句,拷贝构造函数的定义,class A int a;public:A(const A,拷贝构造函数的例子,class V int *pv;public:V(int a) pv = new int; *pv = a; V( ) delete pv;void disp( ) cout This= this endl;cout pv= pv endl;cout *pv= *pv endl;V a(3);V b(5);a.disp();b.disp();,V a(3);V b = a;.*b.pv=100;a.disp( );b.disp( );,V(const V,自动调用构造函数,问题出现Class Aint a;A oa = 3;解决办法class A int apublic:A(int i) : a(i) ;int main()A oa=3;,自动调用的局限,只会使用只含一个参数的constructor任何时候遇到歧义,则放弃尝试,运算符的重载,重载赋值运算符重载运算符的方法运算符作为友元来重新定义作为成员函数来重载运算符操作的返回值返回引用返回重载转换运算符,Operator=,赋值操作符的功能缺省的operator=,缺省的operator=的问题,class V int *pv;public:V(int a) pv = new int; *pv = aV( ) delete pv;void disp( ) cout This= this endl;cout pv= pv endl;cout *pv= *pv endl;V a(3);V b(5);a.disp();b.disp();,V a(3);V b(5);b = a;a.disp( );b.disp( );,Operator=的重载,operator=作为成员函数重载class V V,Operator=重载的注意事项,可能的问题obj = obj;解决办法if (this = 编译器会自动为一个类创建operator=Memberwise assignment复杂类必须自己定义operator=来处理堆内存的使用,异端的operator=重载,class Pixelint x, y;int color;public:Pixel(int a=0, int b=0):x(a),y(b) color=0;Pixel(int a, int b, int c) x = a; y = b; color = c;void draw( ) cout ( x , y )= color endl;Pixel p1(1, 2);Pixel p2(3, 5, 1);p1.draw( );p2.draw( );,Pixel p1(1, 2);Pixel p2(3, 5, 1);p2 = p1;p1.draw( );p2.draw( );,Class Pixel Public: Pixel,copy constructor与operator=,什么时候调用copy constructor什么时候调用operator =指出下面三种写法的差别A o;A o;o = A( );A o1;A o2 = o1;,A o;直接调用constructor,构造对象oA o;o = A( );直接调用constructor ,构造对象o再构造出一个临时对象,并将该临时对象赋给o, (operator= is called)A o1;A o2 = o1;直接调用constructor ,构造对象o1用o1作参数,再调用copy constructor构造对象o2,单目运算符的重载1,operator +作为友元的重载class A int a,b;public:A(int x, int y) : a(x), b(y) friend A,单目运算符的重载2,operator +作为成员函数的重载class A int a,b;public:A(int x, int y) : a(x), b(y) A,class A int a,b;public:A(int x, int y) : a(x), b(y) A,单加与单减的麻烦,Prefix与postfix?+a .vs. a+C+的处理前加为operator+(a)后加为operator+(a,int)使用一个int的哑元前+为左值,应该返回一个引用后+为右值,可以返回一个临时对象的值,双目运算符的重载1,operator +作为友元的重载class A int a,b;public:A(int x, int y) : a(x), b(y) friend A operator + (const A,双目运算符的重载2,operator +作为成员函数的重载class A int a,b;public:A(int x, int y) : a(x), b(y) A operator + (const A,转换运算符,用于将一个对象转换成其他数据类型operator 类型名( );转换运算符没有返回类型类型名即返回类型转换运算符的声明与定义class RMB int y;int j;int f;public:operator double( ) return y + j/10.0 + f/100.0;,流操作符的重载,的重载,作为友元函数的重载class A int a,b;friend istream,可以重载哪些东西?,编译器为类自动生成的元素Default constructorDefault destructorDefault copy constructorDefault operator=所有的运算符不能重载的运算符: ,*,:,?:,sizeof, #,#无法自己定义新的运算符,重载的要点,Operator=只能当成员函数重载只能是成员函数:=,( ), ,-,-*,类型转换函数推荐的原则所有一元运算符按成员函数来重载建议以成员函数重载+=,-=,/=,*=,=,&=,|=,%=,=,= 10) y+; j -= 10; f = fen; if(fen = 10) j+; fen -= 10;RMB:RMB(float a) y = (int)a; j = (int)(a - y) * 10); f = (int)(100*a) - (100*y) - (10*j); ,rmb.cpp 程序,RMB:RMB(double a) y = (int) a; j = (int) (a - y) * 10); f = (int) (100*a - 100*y - 10*j);RMB:RMB(const RMB,rmb.cpp 程序,RMB RMB:operator- (const RMB,rmb.cpp 程序,f = r.f; return *this;RMB:operator float() return (float) (y + j / 10.0 + f / 100.0); RMB:operator long() return long(y * 100 + j * 10 + f); ostream,rmbmain.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论