您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > c++程序设计第五章 特殊函数和成员
1第五章特殊函数和成员5.1对象成员的初始化类的对象可以做其他类的数据成员,称为对象成员。如:classA{类名1成员1;类名2成员2;……};当A类产生对象时要初始化A的所有成员,所以会调用A类的函数。构造2A类的构造函数定义如下:A::A(参数0):成员1(参数1),成员2(参数2),成员n(参数表n){//其他操作……}注:如果初始化列表某项的参数表为空,则列表中相应的项可以省略。3如有:classdate{intyear,month,day;public:……};classstudent{intnum;stringname;datebirthday;public:……};则student类的构造函数形式为:student(intn,strings,dated):num(n),name(s),birthday(d){……}4若对象B是类A的子对象,则在建立A类对象时:执行B的构造函数(初始化类中的其他成员)构造顺序执行B的构造函数(初始化B的数据成员)执行B的析构函数执行A的析构函数析构顺序注意:1)A产生对象时,先调用对象成员的构造函数,初始化对象成员,然后才执行A的构造函数,对象成员的初始化顺序与这些对象在类A中的说明顺序,与它们在初始化列表中的顺序无关。5注意:2)A类的构造函数中未给出成员对象初始化的,成员对象产生时调用无参构造函数,若此时成员所在类中没有无参构造函数则报错!6找出下面程序的错误,改正后分析程序结果(lt5_1b.cpp)classA{intx1,y1;public:A(intc,intd){x1=c;y1=d;coutA构造!x1y1endl;}};classB{Aa;intx2,y2;public:B(){coutB默认构造!;}B(intc=0,intd=0){x2=c;y2=d;coutB构造!x2y2endl;}};voidmain(){Bb;}A(){coutA默认构造endl;}}Bb(1,2);B(intc,intd,intx,inty):a(x,y)Bb(1,2,10,100);7练习:给出程序运行结果(lt5_1.cpp)#includeiostreamusingnamespacestd;classPoint{intx,y;public:Point():x(0),y(0){}Point(inta,intb):x(a),y(b){cout构造:x,yendl;}};classRectangle{Pointa;Pointb;public:Rectangle(intx,inty,intm,intn):a(x,y),b(m,n){}};voidmain(){Rectanglea(1,1,5,5);}b(m,n),a(x,y)9const成员和引用成员的初始化数据成员不能在定义时初始化数据成员操作语句必须放在成员函数中引用成员不能初始化为常量的引用const成员和引用成员必须在构造函数初始化列表中初始化(lt5_1c.cpp)初始化列表形式的构造函数:A::A(参数0):成员1(参数1),成员2(参数2){……}10usingnamespacestd;classexample{constintnum;intdata;int&ref;public:example(intn,intf):num(n),data(f),ref(data){cout构造...endl;}voidshow(){cout对象中的数据是:num,data,refendl;}};voidmain(){intx=1,y=2;examplea(x,y);a.show();}11定义时使用了static,则成员为静态成员5.2静态成员说明:1)静态数据成员必须在类体外按照如下格式:类型类名::静态成员名=值;进行初始化,不可在构造函数中初始化12classTest{staticintx;intn;public:Test(){}Test(inta,intb){x=a;n=b;}staticintfunc(){returnx;}staticvoidsfunc(Test&r,inta){r.n=a;}intGetn(){returnn;}};intTest::x=25;静态数据成员的初始化134、静态成员是类的成员不是对象的成员2、static成员的所有者是类,被该类的所有对象所共有,所有对象均可访问静态成员。静态成员仍然遵循public,private,protected访问准则。3、静态成员不依赖于对象而存在对象不存在时静态成员已存在5、静态成员函数没有this指针,不可直接使用非静态成员,必须通过对象(或者指向对象的指针)使用非静态成员。14classTest{staticintx;intn;public:Test(){}Test(inta,intb){x=a;n=b;}staticintfunc(){returnx;}staticvoidsfunc(Test&r,inta){r.n=a;}intGetn(){returnn;}};intTest::x=25;类中的任何函数都可以访问静态成员。静态成员函数不能直接访问非静态数据成员,可以通过对象来访问。(inta){n=a;}error:illegalreferencetodatamember'Test::n'inastaticmemberfunction.157、未定义对象时,可以通过类使用静态成员按如下格式:类名::静态数据成员名类名::静态成员函数();6、静态成员函数不能说明为虚函数(第8章)16classTest{intn;public:Test(){}Test(inta,intb){x=a;n=b;}staticintfunc(){returnx;}staticvoidsfunc(Test&r,inta){r.n=a;}intGetn(){returnn;}};intTest::x=25;voidmain(){coutTest::func();}通过类使用静态成员函数staticintx;coutTest::x();通过类使用静态成员函数或者数据成员17classTest{intn;staticintx;public:Test(){}Test(inta,intb){x=a;n=b;}staticintfunc(){returnx;}staticvoidsfunc(Test&r,inta){r.n=a;}intGetn(){returnn;}};intTest::x=25;voidmain(){Testb,c;b.sfunc(b,58);coutb.Getn();coutb.func();coutc.func();Testa(24,56);couta.func()b.func()c.func()endl;}58252524242418classTest{intn;staticintx;public:Test(){}Test(inta,intb){x=a;n=b;}staticintfunc(){n=x+1;returnx;}staticvoidsfunc(Test&ref,inta){ref.n=a;}intGetn(){returnn;}};找出下面类定义中的错误,并说明原因intTest::x=100;静态成员函数不能直接访问非静态数据成员静态数据成员必须进行初始化191,静态成员函数与类名连用,可通过对象使用classtest{staticintx;intn;public:test(inta=0,intb=0){x=a;n=b;}staticintfunc(){returnx;}intgetn(){returnn;}};inttest::x=25;voidmain(){couttest::func()endl;testb;coutb.func()endl;}与类名连用通过对象使用202,在没有建立对象之前,静态成员已经存在classtest{staticintx;intn;public:test(inta=0,intb=0){x=a;n=b;}staticintfunc(){returnx;}intgetn(){returnn;}};inttest::x=25;voidmain(){couttest::func()endl;testb,c;coutb.func()endl;}213,静态成员是类的成员不是对象的成员classtest{staticintx;intn;public:test(inta=0,intb=0){x=a;n=b;}staticintfunc(){returnx;}intgetn(){returnn;}};inttest::x=25;voidmain(){couttest::func()endl;testb,c;coutb.func()endl;}224,静态成员被类的所有对象共享classtest{staticintx;intn;public:test(inta=0,intb=0){x=a;n=b;}staticintfunc(){returnx;}intgetn(){returnn;}};inttest::x=25;voidmain(){couttest::func()endl;testb,c;coutb.func()c.func()endl;}235,静态成员函数不可使用非静态成员classtest{staticintx;intn;public:test(inta=0,intb=0){x=a;n=b;}staticintfunc(){returnn;}};inttest::x=25;voidmain(){couttest::func()endl;testb,c;coutb.func()c.func()endl;}错误24特点:一旦定义一直存在于内存中,直到程序结束才释放复合语句(用{}括起来的多条语句)内定义的对象只在复合语句内有效,复合语句执行完毕,对象释放内存。5.2静态成员---静态对象静态对象是由static声明的类的对象25classtest{intn;public:test(inti){n=i;cout构造:nendl;}~test(){cout析构:nendl;}intgetn(){returnn;}voidinc(){++n;}};voidmain(){cout循环开始endl;for(inti=0;i2;i++){couti=i时:endl;testb(3);b.inc();coutb.n=b.getn()endl;}cout循环结束endl;coutmain结束endl;}bi=0时:34循环开始构造:3b=4析构4i=0时:bi=1时:3426classtest{intn;public:test(inti){n=i;cout构造:nendl;}~test(){cout析构:nendl;}intgetn(){returnn;}voidinc(){++n;}};voidmain(){cout循环开始endl;for(inti=0;i2;i++){couti=i时:endl;testb(3);b.inc();coutb.n=b.getn()endl;}cout循环结束endl;coutmain结束endl;}statictestb(3);bi=0时:34循环开始构造:3b=4i=0时:i=1时:i=1时:5b=5循环结束main结束析构527voidmain(){cout循环开始endl;for
本文标题:c++程序设计第五章 特殊函数和成员
链接地址:https://www.777doc.com/doc-3163653 .html