




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C++中的類和對象
C++中的類和對象1FAQ1如何理解類和對象?在面向?qū)ο蟪绦蛟O(shè)計中,類表示對現(xiàn)實世界中一類具有共同特征的事物的抽象。類的定義是由兩部分組成的,分別是聲明部分和實現(xiàn)部分。聲明部分用來聲明該類的成員,包括數(shù)據(jù)成員及成員函數(shù)(數(shù)據(jù)成員即是屬性,成員函數(shù)即是方法),實現(xiàn)部分是成員函數(shù)的具體實現(xiàn)。12/9/20222FAQ1如何理解類和對象?在面向?qū)ο蟪绦蛟O(shè)計中,類表示對現(xiàn)實class類名{ public: 公有數(shù)據(jù)成員或成員函數(shù)聲明; private: 私有數(shù)據(jù)成員或成員函數(shù)聲明; protected: 受保護(hù)數(shù)據(jù)成員或成員函數(shù)聲明;}12/9/20223class類名12/9/20223#include“iostream.h”classStu{ private: charname[20]; intage; charsex[10]; public: voidstuinfo() { cout<<”name:”<<name<<endl; cout<<”age:”<<age<<endl; cout<<”sex:”<<sex<<endl; }}12/9/20224#include“iostream.h”12/9/2022#include“iostream.h”classStu{ private: charname[20]; intage; charsex[10]; public: voidstuinfo();};voidStu::stuinfo(){ cout<<”name:”<<name<<endl; cout<<”age:”<<age<<endl; cout<<”sex:”<<sex<<endl;}12/9/20225#include“iostream.h”12/9/2022對象的定義方式:先定義類再定義對象定義類的同時定義對象#include“iostream.h”classStu{private: charname[20]; intage; charsex[10];public: voidstuinfo();};Stus1,s2;
//對象#include“iostream.h”classStu{private: charname[20]; intage; charsex[10];public: voidstuinfo();}s1,s2;
12/9/20226對象的定義方式:#include“iostream.h”#FAQ2如何理解對象的初始化?構(gòu)造函數(shù)用來對類對象進(jìn)行初始化,它完成對內(nèi)存空間的申請、賦初值等工作。析構(gòu)函數(shù)主要是用來做清理工作的。12/9/20227FAQ2如何理解對象的初始化?構(gòu)造函數(shù)用來對類對象進(jìn)行初始化classStu{ private: charname[20]; intage; charsex[10]; public: Stu(charc1[20],charc2[10],intn); //構(gòu)造函數(shù) voidstuinfo();};12/9/20228classStu12/9/20228classStu{ private: charname[20]; intage; charsex[10]; public: Stu(charc1[20],charc2[10],intn); //構(gòu)造函數(shù) voidstuinfo(); ~Stu(); //析構(gòu)函數(shù)};12/9/20229classStu12/9/20229#include<iostream.h>#include<string.h>classStu{ private: charname[20]; intage; charsex[10]; public: Stu(charc1[20],charc2[10],intn); //構(gòu)造函數(shù) voidstuinfo(); ~Stu(); //析構(gòu)函數(shù)};Stu::Stu(charc1[20],charc2[10],intn) //構(gòu)造函數(shù)定義{ cout<<“constructorcalled!”<<endl; strcpy(name,c1); strcpy(sex,c2); age=n;}12/9/202210#include<iostream.h>12/9/2022Stu::~Stu() //析構(gòu)函數(shù)定義{ cout<<“disconstructorcalled!”<<endl;}voidStu::stuinfo(){ cout<<”name:”<<name<<endl; cout<<”age:”<<age<<endl; cout<<”sex:”<<sex<<endl; }voidmain(){ Stus1(“Mary”,”w”,23),s2(“Jack”,”m”,25); s1.stuinfo(); s2.stuinfo();}12/9/202211Stu::~Stu() //析構(gòu)函數(shù)定義12/9/2022FAQ3如何理解對象的生存周期?對象的生存周期是從對象創(chuàng)建到釋放的一段時間。對象可以按生存周期的不同分為4種,即局部對象,全局對象,靜態(tài)對象和動態(tài)對象。局部對象的生存周期較短;靜態(tài)對象的生存周期較長;全局對象的生存周期最長;而動態(tài)對象的生存周期取決于new運算符和delete運算符的之間的間隔。12/9/202212FAQ3如何理解對象的生存周期?對象的生存周期是從對象創(chuàng)建到#include<iostream.h>#include<string.h>classTest{ char*mp;public: Test(char*lp) //類Test的構(gòu)造函數(shù) { mp=NULL; cout<<"Test::Test()"<<endl; intlen=strlen(lp)+1; //獲得lp指向內(nèi)容的長度 mp=newchar[len]; //動態(tài)分配len大小的內(nèi)存空間 memset(mp,0,len); //內(nèi)存設(shè)置 strncpy(mp,lp,len); //將len長的lp內(nèi)容賦給mp } ~Test() { cout<<"Test::~Test()"<<endl; if(NULL!=mp) delete[]mp; //如果mp的內(nèi)容不為NULL,釋放 }13#include<iostream.h>13 operatorchar*() //重載char*類型 { returnmp; //返回mp }};intmain(){ Testt=Test(""); char*p=t; cout<<"callfunbefore"<<endl; cout<<"len"<<strlen(p)<<endl; cout<<"end"<<endl; return0;}12/9/202214 operatorchar*() //重載char*類型1FAQ4如何向函數(shù)傳遞對象?值傳遞地址傳遞12/9/202215FAQ4如何向函數(shù)傳遞對象?值傳遞12/9/202215#include<iostream.h>classTest{public:Test(inta) //構(gòu)造函數(shù){num=a;}voidsetnum(inta){num=a;}intgetnum(){returnnum;}private:intnum;};voidadd(Testt) //類對象作為函數(shù)參數(shù){t.setnum(t.getnum()+t.getnum()); cout<<"\nnumvalueadd.";cout<<t.getnum()<<endl;}intmain(){Testtt(100); //調(diào)用構(gòu)造函數(shù)add(tt); //調(diào)用函數(shù)add(),參數(shù)按值傳遞cout<<"objectttchangedismain.";cout<<tt.getnum()<<endl;return0;}16#include<iostream.h>16#include<iostream.h>classTest{public: Test(inta) //構(gòu)造函數(shù) { num=a; } voidsetnum(inta) { num=a; } intgetnum() { returnnum; }private: intnum;};voidadd(Test*t) //類對象作為函數(shù)參數(shù){ t->setnum(t->getnum()+t->getnum()); cout<<"\nnumvalueadd."; cout<<t->getnum()<<endl;}intmain(){ Testtt(100); //調(diào)用構(gòu)造函數(shù) add(&tt); //調(diào)用函數(shù)add(),參數(shù)按值傳遞 cout<<"objectttchangedismain."; cout<<tt.getnum()<<endl; return0;}17#include<iostream.h>17#include<iostream.h>classTest{public: Test(inta) //構(gòu)造函數(shù) { num=a; } voidsetnum(inta) { num=a; } intgetnum() { returnnum; }private: intnum;};voidadd(Test&t) //類對象作為函數(shù)參數(shù){ t.setnum(t.getnum()+t.getnum()); cout<<"\nnumvalueadd."; cout<<t.getnum()<<endl;}intmain(){ Testtt(100); //調(diào)用構(gòu)造函數(shù) add(tt); //調(diào)用函數(shù)add(),參數(shù)按值傳遞 cout<<"objectttchangedismain."; cout<<tt.getnum()<<endl; return0;}18#include<iostream.h>18FAQ5編寫C++類時需要注意哪些問題?使用關(guān)鍵字class來定義C++類時,class必須是小寫,其后面緊跟著類的名稱。類以左大括號開始,右大括號結(jié)束,大括號中的內(nèi)容都屬于該類的成員。一般情況下,在類體內(nèi)先說明公有成員,然后說明私有成員。在說明成員時,一般按照成員的類型由小到大的順序說明。類中的數(shù)據(jù)成員的類型可以是任意的,包含整型、浮點型、字符型、數(shù)組、指針和引用等,也可以是另一個類的對象、自身類的指針或引用,但是自身類的對象是不可以的。在類體中不允許對所定義的數(shù)據(jù)成員進(jìn)行初始化。可以將類定義的說明部分或者整個定義部分(包含實現(xiàn)部分)放到一個頭文件中。12/9/202219FAQ5編寫C++類時需要注意哪些問題?使用關(guān)鍵字class聲明類的靜態(tài)變量時必須在類內(nèi)部和類外部的全局內(nèi)存區(qū)中兩次聲明,但訪問的方式與類中的普通成員相同。靜態(tài)變量和函數(shù)可以在聲明實例之前就被訪問。默認(rèn)的情況下,類中的成員都被認(rèn)為是私有的,并且只能被類中的其他成員函數(shù)訪問。通常情況下如果沒有自定義構(gòu)造函數(shù),系統(tǒng)會自動定義默認(rèn)且僅有的構(gòu)造函數(shù)和析構(gòu)函數(shù)。而且當(dāng)使用自定義構(gòu)造函數(shù)時,要求構(gòu)造函數(shù)必須聲明為公有。在C++中,存在3種類型的類,分別為類,結(jié)構(gòu)和聯(lián)合,三者使用不同的關(guān)鍵字來聲明,分別為class,struct和union。在類的成員函數(shù)中調(diào)用非成員函數(shù),在非成員函數(shù)前必須加上“::”。12/9/202220聲明類的靜態(tài)變量時必須在類內(nèi)部和類外部的全局內(nèi)存區(qū)中兩次聲明12/9/20222112/9/202221FAQ6如何理解構(gòu)造函數(shù)?構(gòu)造函數(shù)的主要功能是給對象分配空間,因為對象在定義時都會默認(rèn)調(diào)用構(gòu)造函數(shù),以此進(jìn)行內(nèi)存空間的分配以及變量的初始化操作。12/9/202222FAQ6如何理解構(gòu)造函數(shù)?構(gòu)造函數(shù)的主要功能是給對象分配空間#include<iostream.h>classTime{public: Time() {//構(gòu)造函數(shù)Time() hour=0; minute=0; sec=0; } voidset_Time(); voidshow_Time();private: inthour; intminute; intsec;};intmain(){ Timet1; t1.set_Time(); t1.show_Time(); Timet2; t2.show_Time(); return0;}voidTime::set_Time(){ cin>>hour; cin>>minute; cin>>sec;}voidTime::show_Time(){ cout<<hour<<":"<<minute<<":"<<sec<<endl;}23#include<iostream.h>23如果自己沒有定義構(gòu)造函數(shù),系統(tǒng)會自動創(chuàng)建默認(rèn)的無參數(shù),空構(gòu)造函數(shù)。如果自定義了一個構(gòu)造函數(shù),系統(tǒng)則不會自動創(chuàng)建默認(rèn)構(gòu)造函數(shù)。并且當(dāng)聲明類的實例時,需要使用自定義的構(gòu)造函數(shù)。構(gòu)造函數(shù)必須是公有的。構(gòu)造函數(shù)的名稱必須與類名相同。構(gòu)造函數(shù)沒有返回值。構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi),也可定義在類體外。構(gòu)造函數(shù)是一個特殊的函數(shù),該函數(shù)的名稱與類名相同,不指定類型說明,有隱含的返回值,該值由系統(tǒng)內(nèi)部使用。程序中不能直接調(diào)用構(gòu)造函數(shù),在創(chuàng)建對象時系統(tǒng)自動調(diào)用構(gòu)造函數(shù)。構(gòu)造函數(shù)可以無參數(shù),可以有一個參數(shù),也可以有多個參數(shù)。構(gòu)造函數(shù)可以重載,即可以定義多個參數(shù)個數(shù)不同的構(gòu)造函數(shù)。12/9/202224如果自己沒有定義構(gòu)造函數(shù),系統(tǒng)會自動創(chuàng)建默認(rèn)的無參數(shù),空構(gòu)造FAQ7默認(rèn)構(gòu)造函數(shù)是什么,它有什么特點?如果程序中沒有提供任何構(gòu)造函數(shù),則C++提供一個默認(rèn)的構(gòu)造函數(shù),該默認(rèn)構(gòu)造函數(shù)是無參構(gòu)造函數(shù),它僅負(fù)責(zé)創(chuàng)建對象,不做任何初始化的工作。默認(rèn)構(gòu)造函數(shù)的特點如下:在創(chuàng)建對象時編譯器自動創(chuàng)建并調(diào)用。無參數(shù),函數(shù)體為空。僅當(dāng)沒有自定義構(gòu)造函數(shù)時編譯器才會自動創(chuàng)建。12/9/202225FAQ7默認(rèn)構(gòu)造函數(shù)是什么,它有什么特點?如果程序中沒有提供#include<iostream.h>#include<vector.h>classStu{public: Stu():val(6){} Stu(intval):val(6){} intval;};voidmain(){ Stus; cout<<s.val; Stuarr[4]; cout<<arr[2]; vector<Stu>vec(5); cout<<vec[3].val<<endl; Stu*ptr=newStudent[4]; cout<<ptr[1].val; Stuss=Student(); cout<<ss.val; }26#include<iostream.h>26FAQ8何時調(diào)用拷貝構(gòu)造函數(shù)?拷貝構(gòu)造函數(shù)是由編譯器調(diào)用,用來完成一系列基于同一類的其他對象的構(gòu)件及初始化,拷貝構(gòu)造函數(shù)的一般形式如下:
類名(類名&變量名) {
函數(shù)體; }12/9/202227FAQ8何時調(diào)用拷貝構(gòu)造函數(shù)?拷貝構(gòu)造函數(shù)是由編譯器調(diào)用,用對象以值傳遞的方式傳入函數(shù)體,即函數(shù)的返回值是對象,調(diào)用函數(shù)進(jìn)行形參和實參結(jié)合時。例如:classTest{…};copyfun(Testp) //函數(shù)的形參是類的對象{…}intmain(){ Testt; copyfun(t);//當(dāng)調(diào)用函數(shù),函數(shù)的實參傳給形參,調(diào)用拷貝構(gòu)造函數(shù) …//省略}12/9/202228對象以值傳遞的方式傳入函數(shù)體,即函數(shù)的返回值是對象,調(diào)用函數(shù)對象以值傳遞的方式從函數(shù)返回,即函數(shù)的返回值是對象,函數(shù)返回值時。例如:classTest{…};Testcopyfun() //函數(shù)的返回值是類的對象{ Testt(100); returnt; //函數(shù)返回的是對象intmain(){ Testt1; t1=copyfun(); //返回函數(shù)值時,調(diào)用拷貝構(gòu)造函數(shù) …//省略}12/9/202229對象以值傳遞的方式從函數(shù)返回,即函數(shù)的返回值是對象,函數(shù)返回對象需要通過其他對象進(jìn)行初始化,即當(dāng)使用類的一個對象去初始化該類的另一個對象時。例如:classTest{…};intmain(){ Testt1; Testt2(t1); //使用t1初始化t2 …//省略}12/9/202230對象需要通過其他對象進(jìn)行初始化,即當(dāng)使用類的一個對象去初始化#include<iostream.h>#include<string.h>//自定義類PersonclassPerson{public: //公有聲明部分 Person(char*pn); //構(gòu)造函數(shù)聲明 Person(Person&p); //拷貝構(gòu)造函數(shù)聲明 ~Person(); //析構(gòu)函數(shù)聲明private: //私有聲明部分 char*pname; //定義字符指針pname};//構(gòu)造函數(shù)實現(xiàn)部分Person::Person(char*pn){ cout<<"Personiscalled:"<<pn<<endl; //輸出pn里存儲的字符串 pname=newchar[strlen(pn)+1]; if(pname!=0) strcpy(pname,pn); //將pn的值賦給pname}31#include<iostream.h>31//拷貝構(gòu)造函數(shù)實現(xiàn)部分Person::Person(Person&p){ cout<<"cope"<<p.pname<<"tonewmemory\n"; pname=newchar[strlen(p.pname)+1]; //同構(gòu)造函數(shù),分配空間 if(pname!=0) //判斷是否分配成功 strcpy(pname,p.pname); //復(fù)制字符串}//析構(gòu)函數(shù)實現(xiàn)部分Person::~Person(){ cout<<"~Personiscalled:"<<pname<<endl;//輸出要析構(gòu)的Person對象的值 pname[0]='\0'; //將字符串賦空值 deletepname; //釋放pname所在的內(nèi)存空間}voidmain(){ Personp1("");//用構(gòu)造函數(shù)定義Person對象p1,為其字符串賦值 Personp2(p1); //用拷貝構(gòu)造函數(shù)定義Person對象p2,其字符串與p1相同}32//拷貝構(gòu)造函數(shù)實現(xiàn)部分32FAQ9深拷貝與淺拷貝的區(qū)別是什么?淺拷貝就是對默認(rèn)拷貝構(gòu)造函數(shù)所實現(xiàn)的數(shù)據(jù)成員逐一賦值,如果類中包含指針類型數(shù)據(jù),將會產(chǎn)生錯誤。為了解決該問題,需要顯式定義拷貝構(gòu)造函數(shù),使其不但可以復(fù)制數(shù)據(jù)成員,而且可以為對象分配內(nèi)存空間,這就是深拷貝。classA{…};Aa1;Aa2=a1; //調(diào)用拷貝賦值函數(shù)Aa3(a1); //調(diào)用拷貝構(gòu)造函數(shù)classA{public: …//省略 intcint; char*cp; //指針變量cp};12/9/202233FAQ9深拷貝與淺拷貝的區(qū)別是什么?淺拷貝就是對默認(rèn)拷貝構(gòu)造A::A(constA&a){ cint=a.cint; intlen=strlen(a.cp); cp=newchar[len]; memcopy(cp,a.cp,len); …//省略}AA::operator=(A&b){ if(a.cp!=NULL) deletea.cp; cint=a.cint; intlen=strlen(a.cp); cp=newchar[len]; memcopy(cp,a.cp,len); …//省略}12/9/202234A::A(constA&a)12/9/202234深拷貝和淺拷貝的區(qū)別當(dāng)拷貝對象狀態(tài)中包含其他對象的引用時,如果需要復(fù)制的是引用對象指向的內(nèi)容,而不是引用(內(nèi)存地址),則是深拷貝,否則是淺拷貝。淺拷貝就是成員數(shù)據(jù)之間的賦值,當(dāng)值拷貝時,兩個對象就有共同的資源。而深拷貝是先將資源復(fù)制一份,使對象擁有不同的資源,但資源內(nèi)容是相同的。深拷貝在處理引用時,如果改變新對象內(nèi)容將不會影響到原對象內(nèi)容。淺拷貝資源后釋放資源時可能會產(chǎn)生資源歸屬不清楚的情況,從而導(dǎo)致程序運行出錯。12/9/202235深拷貝和淺拷貝的區(qū)別當(dāng)拷貝對象狀態(tài)中包含其他對象的引用時,如FAQ10如何理解析構(gòu)函數(shù)?析構(gòu)函數(shù),其作用與構(gòu)造函數(shù)剛好相反,是用來清理內(nèi)存中無用的資源。只有當(dāng)一個對象的生命周期結(jié)束時才調(diào)用析構(gòu)函數(shù)。12/9/202236FAQ10如何理解析構(gòu)函數(shù)?析構(gòu)函數(shù),其作用與構(gòu)造函數(shù)剛好相沒有使用析構(gòu)函數(shù)的程序的代碼如下:classBaud{public: Baud(longspeed);private: intm_aSpeed; char*m_pszSpeed;}Baud::Baud(intspeed){ m_aSpeed=newchar[10]; if(m_pSpeed!=NULL) sprint(m_pszSpeed,“%ld”,speed);}12/9/202237沒有使用析構(gòu)函數(shù)的程序的代碼如下:12/9/202237構(gòu)造函數(shù)和析構(gòu)函數(shù)的區(qū)別:每個類可以有多個構(gòu)造函數(shù),但卻只能有一個析構(gòu)函數(shù)??梢宰远x帶參數(shù)的構(gòu)造函數(shù),但是卻不允許為析構(gòu)函數(shù)傳遞參數(shù)。析構(gòu)函數(shù)的特點如下。析構(gòu)函數(shù)是成員函數(shù),函數(shù)體可以寫在類的內(nèi)部,也可以寫在類的外部。析構(gòu)函數(shù)是一個特殊函數(shù),其名稱與類名相同,并在前面加“~”字符,用來與構(gòu)造函數(shù)加以區(qū)別。析構(gòu)函數(shù)不可以指定返回值類型,也沒有參數(shù)。一個類中只允許定義一個析構(gòu)函數(shù)。析構(gòu)函數(shù)可以手動調(diào)用,也可以被系統(tǒng)調(diào)用。12/9/202238構(gòu)造函數(shù)和析構(gòu)函數(shù)的區(qū)別:12/9/202238#include<iostream.h>classDestory{ intx,y,z;public: Destory() { x=y=z=0; } ~Destory() //析構(gòu)函數(shù) { cout<<"destructor...\n"; } Destory(inti,intj,intk) { x=i;y=j;z=k; } Destoryoperator=(Destoryop2); voidshow();};12/9/202239#include<iostream.h>12/9/20223DestoryDestory::operator=(Destoryop2){ x=op2.x; y=op2.y; x=op2.z; return*this;}voidDestory::show(){ cout<<x<<","; cout<<y<<","; cout<<z<<"\n";}intmain() //主函數(shù){ Destorya(1,2,3),c; cout<<"beforec=a;\n"; c=a; cout<<"afterc=a;\n"; c.show(); return0;}40DestoryDestory::operator=(DesThankyou!12/9/202241Thankyou!12/9/202241C++中的類和對象
C++中的類和對象42FAQ1如何理解類和對象?在面向?qū)ο蟪绦蛟O(shè)計中,類表示對現(xiàn)實世界中一類具有共同特征的事物的抽象。類的定義是由兩部分組成的,分別是聲明部分和實現(xiàn)部分。聲明部分用來聲明該類的成員,包括數(shù)據(jù)成員及成員函數(shù)(數(shù)據(jù)成員即是屬性,成員函數(shù)即是方法),實現(xiàn)部分是成員函數(shù)的具體實現(xiàn)。12/9/202243FAQ1如何理解類和對象?在面向?qū)ο蟪绦蛟O(shè)計中,類表示對現(xiàn)實class類名{ public: 公有數(shù)據(jù)成員或成員函數(shù)聲明; private: 私有數(shù)據(jù)成員或成員函數(shù)聲明; protected: 受保護(hù)數(shù)據(jù)成員或成員函數(shù)聲明;}12/9/202244class類名12/9/20223#include“iostream.h”classStu{ private: charname[20]; intage; charsex[10]; public: voidstuinfo() { cout<<”name:”<<name<<endl; cout<<”age:”<<age<<endl; cout<<”sex:”<<sex<<endl; }}12/9/202245#include“iostream.h”12/9/2022#include“iostream.h”classStu{ private: charname[20]; intage; charsex[10]; public: voidstuinfo();};voidStu::stuinfo(){ cout<<”name:”<<name<<endl; cout<<”age:”<<age<<endl; cout<<”sex:”<<sex<<endl;}12/9/202246#include“iostream.h”12/9/2022對象的定義方式:先定義類再定義對象定義類的同時定義對象#include“iostream.h”classStu{private: charname[20]; intage; charsex[10];public: voidstuinfo();};Stus1,s2;
//對象#include“iostream.h”classStu{private: charname[20]; intage; charsex[10];public: voidstuinfo();}s1,s2;
12/9/202247對象的定義方式:#include“iostream.h”#FAQ2如何理解對象的初始化?構(gòu)造函數(shù)用來對類對象進(jìn)行初始化,它完成對內(nèi)存空間的申請、賦初值等工作。析構(gòu)函數(shù)主要是用來做清理工作的。12/9/202248FAQ2如何理解對象的初始化?構(gòu)造函數(shù)用來對類對象進(jìn)行初始化classStu{ private: charname[20]; intage; charsex[10]; public: Stu(charc1[20],charc2[10],intn); //構(gòu)造函數(shù) voidstuinfo();};12/9/202249classStu12/9/20228classStu{ private: charname[20]; intage; charsex[10]; public: Stu(charc1[20],charc2[10],intn); //構(gòu)造函數(shù) voidstuinfo(); ~Stu(); //析構(gòu)函數(shù)};12/9/202250classStu12/9/20229#include<iostream.h>#include<string.h>classStu{ private: charname[20]; intage; charsex[10]; public: Stu(charc1[20],charc2[10],intn); //構(gòu)造函數(shù) voidstuinfo(); ~Stu(); //析構(gòu)函數(shù)};Stu::Stu(charc1[20],charc2[10],intn) //構(gòu)造函數(shù)定義{ cout<<“constructorcalled!”<<endl; strcpy(name,c1); strcpy(sex,c2); age=n;}12/9/202251#include<iostream.h>12/9/2022Stu::~Stu() //析構(gòu)函數(shù)定義{ cout<<“disconstructorcalled!”<<endl;}voidStu::stuinfo(){ cout<<”name:”<<name<<endl; cout<<”age:”<<age<<endl; cout<<”sex:”<<sex<<endl; }voidmain(){ Stus1(“Mary”,”w”,23),s2(“Jack”,”m”,25); s1.stuinfo(); s2.stuinfo();}12/9/202252Stu::~Stu() //析構(gòu)函數(shù)定義12/9/2022FAQ3如何理解對象的生存周期?對象的生存周期是從對象創(chuàng)建到釋放的一段時間。對象可以按生存周期的不同分為4種,即局部對象,全局對象,靜態(tài)對象和動態(tài)對象。局部對象的生存周期較短;靜態(tài)對象的生存周期較長;全局對象的生存周期最長;而動態(tài)對象的生存周期取決于new運算符和delete運算符的之間的間隔。12/9/202253FAQ3如何理解對象的生存周期?對象的生存周期是從對象創(chuàng)建到#include<iostream.h>#include<string.h>classTest{ char*mp;public: Test(char*lp) //類Test的構(gòu)造函數(shù) { mp=NULL; cout<<"Test::Test()"<<endl; intlen=strlen(lp)+1; //獲得lp指向內(nèi)容的長度 mp=newchar[len]; //動態(tài)分配len大小的內(nèi)存空間 memset(mp,0,len); //內(nèi)存設(shè)置 strncpy(mp,lp,len); //將len長的lp內(nèi)容賦給mp } ~Test() { cout<<"Test::~Test()"<<endl; if(NULL!=mp) delete[]mp; //如果mp的內(nèi)容不為NULL,釋放 }54#include<iostream.h>13 operatorchar*() //重載char*類型 { returnmp; //返回mp }};intmain(){ Testt=Test(""); char*p=t; cout<<"callfunbefore"<<endl; cout<<"len"<<strlen(p)<<endl; cout<<"end"<<endl; return0;}12/9/202255 operatorchar*() //重載char*類型1FAQ4如何向函數(shù)傳遞對象?值傳遞地址傳遞12/9/202256FAQ4如何向函數(shù)傳遞對象?值傳遞12/9/202215#include<iostream.h>classTest{public:Test(inta) //構(gòu)造函數(shù){num=a;}voidsetnum(inta){num=a;}intgetnum(){returnnum;}private:intnum;};voidadd(Testt) //類對象作為函數(shù)參數(shù){t.setnum(t.getnum()+t.getnum()); cout<<"\nnumvalueadd.";cout<<t.getnum()<<endl;}intmain(){Testtt(100); //調(diào)用構(gòu)造函數(shù)add(tt); //調(diào)用函數(shù)add(),參數(shù)按值傳遞cout<<"objectttchangedismain.";cout<<tt.getnum()<<endl;return0;}57#include<iostream.h>16#include<iostream.h>classTest{public: Test(inta) //構(gòu)造函數(shù) { num=a; } voidsetnum(inta) { num=a; } intgetnum() { returnnum; }private: intnum;};voidadd(Test*t) //類對象作為函數(shù)參數(shù){ t->setnum(t->getnum()+t->getnum()); cout<<"\nnumvalueadd."; cout<<t->getnum()<<endl;}intmain(){ Testtt(100); //調(diào)用構(gòu)造函數(shù) add(&tt); //調(diào)用函數(shù)add(),參數(shù)按值傳遞 cout<<"objectttchangedismain."; cout<<tt.getnum()<<endl; return0;}58#include<iostream.h>17#include<iostream.h>classTest{public: Test(inta) //構(gòu)造函數(shù) { num=a; } voidsetnum(inta) { num=a; } intgetnum() { returnnum; }private: intnum;};voidadd(Test&t) //類對象作為函數(shù)參數(shù){ t.setnum(t.getnum()+t.getnum()); cout<<"\nnumvalueadd."; cout<<t.getnum()<<endl;}intmain(){ Testtt(100); //調(diào)用構(gòu)造函數(shù) add(tt); //調(diào)用函數(shù)add(),參數(shù)按值傳遞 cout<<"objectttchangedismain."; cout<<tt.getnum()<<endl; return0;}59#include<iostream.h>18FAQ5編寫C++類時需要注意哪些問題?使用關(guān)鍵字class來定義C++類時,class必須是小寫,其后面緊跟著類的名稱。類以左大括號開始,右大括號結(jié)束,大括號中的內(nèi)容都屬于該類的成員。一般情況下,在類體內(nèi)先說明公有成員,然后說明私有成員。在說明成員時,一般按照成員的類型由小到大的順序說明。類中的數(shù)據(jù)成員的類型可以是任意的,包含整型、浮點型、字符型、數(shù)組、指針和引用等,也可以是另一個類的對象、自身類的指針或引用,但是自身類的對象是不可以的。在類體中不允許對所定義的數(shù)據(jù)成員進(jìn)行初始化??梢詫㈩惗x的說明部分或者整個定義部分(包含實現(xiàn)部分)放到一個頭文件中。12/9/202260FAQ5編寫C++類時需要注意哪些問題?使用關(guān)鍵字class聲明類的靜態(tài)變量時必須在類內(nèi)部和類外部的全局內(nèi)存區(qū)中兩次聲明,但訪問的方式與類中的普通成員相同。靜態(tài)變量和函數(shù)可以在聲明實例之前就被訪問。默認(rèn)的情況下,類中的成員都被認(rèn)為是私有的,并且只能被類中的其他成員函數(shù)訪問。通常情況下如果沒有自定義構(gòu)造函數(shù),系統(tǒng)會自動定義默認(rèn)且僅有的構(gòu)造函數(shù)和析構(gòu)函數(shù)。而且當(dāng)使用自定義構(gòu)造函數(shù)時,要求構(gòu)造函數(shù)必須聲明為公有。在C++中,存在3種類型的類,分別為類,結(jié)構(gòu)和聯(lián)合,三者使用不同的關(guān)鍵字來聲明,分別為class,struct和union。在類的成員函數(shù)中調(diào)用非成員函數(shù),在非成員函數(shù)前必須加上“::”。12/9/202261聲明類的靜態(tài)變量時必須在類內(nèi)部和類外部的全局內(nèi)存區(qū)中兩次聲明12/9/20226212/9/202221FAQ6如何理解構(gòu)造函數(shù)?構(gòu)造函數(shù)的主要功能是給對象分配空間,因為對象在定義時都會默認(rèn)調(diào)用構(gòu)造函數(shù),以此進(jìn)行內(nèi)存空間的分配以及變量的初始化操作。12/9/202263FAQ6如何理解構(gòu)造函數(shù)?構(gòu)造函數(shù)的主要功能是給對象分配空間#include<iostream.h>classTime{public: Time() {//構(gòu)造函數(shù)Time() hour=0; minute=0; sec=0; } voidset_Time(); voidshow_Time();private: inthour; intminute; intsec;};intmain(){ Timet1; t1.set_Time(); t1.show_Time(); Timet2; t2.show_Time(); return0;}voidTime::set_Time(){ cin>>hour; cin>>minute; cin>>sec;}voidTime::show_Time(){ cout<<hour<<":"<<minute<<":"<<sec<<endl;}64#include<iostream.h>23如果自己沒有定義構(gòu)造函數(shù),系統(tǒng)會自動創(chuàng)建默認(rèn)的無參數(shù),空構(gòu)造函數(shù)。如果自定義了一個構(gòu)造函數(shù),系統(tǒng)則不會自動創(chuàng)建默認(rèn)構(gòu)造函數(shù)。并且當(dāng)聲明類的實例時,需要使用自定義的構(gòu)造函數(shù)。構(gòu)造函數(shù)必須是公有的。構(gòu)造函數(shù)的名稱必須與類名相同。構(gòu)造函數(shù)沒有返回值。構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi),也可定義在類體外。構(gòu)造函數(shù)是一個特殊的函數(shù),該函數(shù)的名稱與類名相同,不指定類型說明,有隱含的返回值,該值由系統(tǒng)內(nèi)部使用。程序中不能直接調(diào)用構(gòu)造函數(shù),在創(chuàng)建對象時系統(tǒng)自動調(diào)用構(gòu)造函數(shù)。構(gòu)造函數(shù)可以無參數(shù),可以有一個參數(shù),也可以有多個參數(shù)。構(gòu)造函數(shù)可以重載,即可以定義多個參數(shù)個數(shù)不同的構(gòu)造函數(shù)。12/9/202265如果自己沒有定義構(gòu)造函數(shù),系統(tǒng)會自動創(chuàng)建默認(rèn)的無參數(shù),空構(gòu)造FAQ7默認(rèn)構(gòu)造函數(shù)是什么,它有什么特點?如果程序中沒有提供任何構(gòu)造函數(shù),則C++提供一個默認(rèn)的構(gòu)造函數(shù),該默認(rèn)構(gòu)造函數(shù)是無參構(gòu)造函數(shù),它僅負(fù)責(zé)創(chuàng)建對象,不做任何初始化的工作。默認(rèn)構(gòu)造函數(shù)的特點如下:在創(chuàng)建對象時編譯器自動創(chuàng)建并調(diào)用。無參數(shù),函數(shù)體為空。僅當(dāng)沒有自定義構(gòu)造函數(shù)時編譯器才會自動創(chuàng)建。12/9/202266FAQ7默認(rèn)構(gòu)造函數(shù)是什么,它有什么特點?如果程序中沒有提供#include<iostream.h>#include<vector.h>classStu{public: Stu():val(6){} Stu(intval):val(6){} intval;};voidmain(){ Stus; cout<<s.val; Stuarr[4]; cout<<arr[2]; vector<Stu>vec(5); cout<<vec[3].val<<endl; Stu*ptr=newStudent[4]; cout<<ptr[1].val; Stuss=Student(); cout<<ss.val; }67#include<iostream.h>26FAQ8何時調(diào)用拷貝構(gòu)造函數(shù)?拷貝構(gòu)造函數(shù)是由編譯器調(diào)用,用來完成一系列基于同一類的其他對象的構(gòu)件及初始化,拷貝構(gòu)造函數(shù)的一般形式如下:
類名(類名&變量名) {
函數(shù)體; }12/9/202268FAQ8何時調(diào)用拷貝構(gòu)造函數(shù)?拷貝構(gòu)造函數(shù)是由編譯器調(diào)用,用對象以值傳遞的方式傳入函數(shù)體,即函數(shù)的返回值是對象,調(diào)用函數(shù)進(jìn)行形參和實參結(jié)合時。例如:classTest{…};copyfun(Testp) //函數(shù)的形參是類的對象{…}intmain(){ Testt; copyfun(t);//當(dāng)調(diào)用函數(shù),函數(shù)的實參傳給形參,調(diào)用拷貝構(gòu)造函數(shù) …//省略}12/9/202269對象以值傳遞的方式傳入函數(shù)體,即函數(shù)的返回值是對象,調(diào)用函數(shù)對象以值傳遞的方式從函數(shù)返回,即函數(shù)的返回值是對象,函數(shù)返回值時。例如:classTest{…};Testcopyfun() //函數(shù)的返回值是類的對象{ Testt(100); returnt; //函數(shù)返回的是對象intmain(){ Testt1; t1=copyfun(); //返回函數(shù)值時,調(diào)用拷貝構(gòu)造函數(shù) …//省略}12/9/202270對象以值傳遞的方式從函數(shù)返回,即函數(shù)的返回值是對象,函數(shù)返回對象需要通過其他對象進(jìn)行初始化,即當(dāng)使用類的一個對象去初始化該類的另一個對象時。例如:classTest{…};intmain(){ Testt1; Testt2(t1); //使用t1初始化t2 …//省略}12/9/202271對象需要通過其他對象進(jìn)行初始化,即當(dāng)使用類的一個對象去初始化#include<iostream.h>#include<string.h>//自定義類PersonclassPerson{public: //公有聲明部分 Person(char*pn); //構(gòu)造函數(shù)聲明 Person(Person&p); //拷貝構(gòu)造函數(shù)聲明 ~Person(); //析構(gòu)函數(shù)聲明private: //私有聲明部分 char*pname; //定義字符指針pname};//構(gòu)造函數(shù)實現(xiàn)部分Person::Person(char*pn){ cout<<"Personiscalled:"<<pn<<endl; //輸出pn里存儲的字符串 pname=newchar[strlen(pn)+1]; if(pname!=0) strcpy(pname,pn); //將pn的值賦給pname}72#include<iostream.h>31//拷貝構(gòu)造函數(shù)實現(xiàn)部分Person::Person(Person&p){ cout<<"cope"<<p.pname<<"tonewmemory\n"; pname=newchar[strlen(p.pname)+1]; //同構(gòu)造函數(shù),分配空間 if(pname!=0) //判斷是否分配成功 strcpy(pname,p.pname); //復(fù)制字符串}//析構(gòu)函數(shù)實現(xiàn)部分Person::~Person(){ cout<<"~Personiscalled:"<<pname<<endl;//輸出要析構(gòu)的Person對象的值 pname[0]='\0'; //將字符串賦空值 deletepname; //釋放pname所在的內(nèi)存空間}voidmain(){ Personp1("");//用構(gòu)造函數(shù)定義Person對象p1,為其字符串賦值 Personp2(p1); //用拷貝構(gòu)造函數(shù)定義Person對象p2,其字符串與p1相同}73//拷貝構(gòu)造函數(shù)實現(xiàn)部分
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房地產(chǎn)項目的合同條款詳解
- 沉井與頂管(培訓(xùn))
- 環(huán)境經(jīng)濟(jì)項目合同履行平臺經(jīng)濟(jì)重點基礎(chǔ)知識點歸納
- 環(huán)境教育與環(huán)境教育技術(shù)政策案例分析重點基礎(chǔ)知識點歸納
- 妝容服務(wù)的經(jīng)營模式和發(fā)展策略
- 炸雞店的消費群體分析
- 元旦的來臨淡藍(lán)色的傳說
- 護(hù)理實踐中的團(tuán)隊合作與協(xié)作
- 粉底選擇指南 找到適合自己的底妝
- 打造自然清新的日常妝容
- 初中語文八年級《駱駝祥子》教育教學(xué)課件
- 第4章 帶傳動設(shè)計 (1)課件
- 8-馬工程《藝術(shù)學(xué)概論》課件-第八章(2019.4.2)【已改格式】.課件電子教案
- 人教版七年級下冊英語單詞辨音訓(xùn)練題(一)
- 公共政策的經(jīng)濟(jì)學(xué)分析課件
- 與總包等的協(xié)調(diào)配合措施
- 在深化糾正“四風(fēng)”和提高工作效率專題研討會上的發(fā)言
- 小學(xué)音樂 花城版 二年級《稻草里的火雞》課件
- 物質(zhì)安全數(shù)據(jù)表(MSDS)84消毒液
- “363生態(tài)課堂”模式及流程
- (高清版)建筑工程風(fēng)洞試驗方法標(biāo)準(zhǔn)JGJ_T 338-2014
評論
0/150
提交評論