C++中的類(lèi)和對(duì)象課件_第1頁(yè)
C++中的類(lèi)和對(duì)象課件_第2頁(yè)
C++中的類(lèi)和對(duì)象課件_第3頁(yè)
C++中的類(lèi)和對(duì)象課件_第4頁(yè)
C++中的類(lèi)和對(duì)象課件_第5頁(yè)
已閱讀5頁(yè),還剩77頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C++中的類(lèi)和對(duì)象

C++中的類(lèi)和對(duì)象1FAQ1如何理解類(lèi)和對(duì)象?在面向?qū)ο蟪绦蛟O(shè)計(jì)中,類(lèi)表示對(duì)現(xiàn)實(shí)世界中一類(lèi)具有共同特征的事物的抽象。類(lèi)的定義是由兩部分組成的,分別是聲明部分和實(shí)現(xiàn)部分。聲明部分用來(lái)聲明該類(lèi)的成員,包括數(shù)據(jù)成員及成員函數(shù)(數(shù)據(jù)成員即是屬性,成員函數(shù)即是方法),實(shí)現(xiàn)部分是成員函數(shù)的具體實(shí)現(xiàn)。12/9/20222FAQ1如何理解類(lèi)和對(duì)象?在面向?qū)ο蟪绦蛟O(shè)計(jì)中,類(lèi)表示對(duì)現(xiàn)實(shí)class類(lèi)名{ public: 公有數(shù)據(jù)成員或成員函數(shù)聲明; private: 私有數(shù)據(jù)成員或成員函數(shù)聲明; protected: 受保護(hù)數(shù)據(jù)成員或成員函數(shù)聲明;}12/9/20223class類(lèi)名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對(duì)象的定義方式:先定義類(lèi)再定義對(duì)象定義類(lèi)的同時(shí)定義對(duì)象#include“iostream.h”classStu{private: charname[20]; intage; charsex[10];public: voidstuinfo();};Stus1,s2;

//對(duì)象#include“iostream.h”classStu{private: charname[20]; intage; charsex[10];public: voidstuinfo();}s1,s2;

12/9/20226對(duì)象的定義方式:#include“iostream.h”#FAQ2如何理解對(duì)象的初始化?構(gòu)造函數(shù)用來(lái)對(duì)類(lèi)對(duì)象進(jìn)行初始化,它完成對(duì)內(nèi)存空間的申請(qǐng)、賦初值等工作。析構(gòu)函數(shù)主要是用來(lái)做清理工作的。12/9/20227FAQ2如何理解對(duì)象的初始化?構(gòu)造函數(shù)用來(lái)對(duì)類(lèi)對(duì)象進(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如何理解對(duì)象的生存周期?對(duì)象的生存周期是從對(duì)象創(chuàng)建到釋放的一段時(shí)間。對(duì)象可以按生存周期的不同分為4種,即局部對(duì)象,全局對(duì)象,靜態(tài)對(duì)象和動(dòng)態(tài)對(duì)象。局部對(duì)象的生存周期較短;靜態(tài)對(duì)象的生存周期較長(zhǎng);全局對(duì)象的生存周期最長(zhǎng);而動(dòng)態(tài)對(duì)象的生存周期取決于new運(yùn)算符和delete運(yùn)算符的之間的間隔。12/9/202212FAQ3如何理解對(duì)象的生存周期?對(duì)象的生存周期是從對(duì)象創(chuàng)建到#include<iostream.h>#include<string.h>classTest{ char*mp;public: Test(char*lp) //類(lèi)Test的構(gòu)造函數(shù) { mp=NULL; cout<<"Test::Test()"<<endl; intlen=strlen(lp)+1; //獲得lp指向內(nèi)容的長(zhǎng)度 mp=newchar[len]; //動(dòng)態(tài)分配len大小的內(nèi)存空間 memset(mp,0,len); //內(nèi)存設(shè)置 strncpy(mp,lp,len); //將len長(zhǎng)的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*類(lèi)型 { 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*類(lèi)型1FAQ4如何向函數(shù)傳遞對(duì)象?值傳遞地址傳遞12/9/202215FAQ4如何向函數(shù)傳遞對(duì)象?值傳遞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) //類(lèi)對(duì)象作為函數(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) //類(lèi)對(duì)象作為函數(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) //類(lèi)對(duì)象作為函數(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編寫(xiě)C++類(lèi)時(shí)需要注意哪些問(wèn)題?使用關(guān)鍵字class來(lái)定義C++類(lèi)時(shí),class必須是小寫(xiě),其后面緊跟著類(lèi)的名稱。類(lèi)以左大括號(hào)開(kāi)始,右大括號(hào)結(jié)束,大括號(hào)中的內(nèi)容都屬于該類(lèi)的成員。一般情況下,在類(lèi)體內(nèi)先說(shuō)明公有成員,然后說(shuō)明私有成員。在說(shuō)明成員時(shí),一般按照成員的類(lèi)型由小到大的順序說(shuō)明。類(lèi)中的數(shù)據(jù)成員的類(lèi)型可以是任意的,包含整型、浮點(diǎn)型、字符型、數(shù)組、指針和引用等,也可以是另一個(gè)類(lèi)的對(duì)象、自身類(lèi)的指針或引用,但是自身類(lèi)的對(duì)象是不可以的。在類(lèi)體中不允許對(duì)所定義的數(shù)據(jù)成員進(jìn)行初始化??梢詫㈩?lèi)定義的說(shuō)明部分或者整個(gè)定義部分(包含實(shí)現(xiàn)部分)放到一個(gè)頭文件中。12/9/202219FAQ5編寫(xiě)C++類(lèi)時(shí)需要注意哪些問(wèn)題?使用關(guān)鍵字class聲明類(lèi)的靜態(tài)變量時(shí)必須在類(lèi)內(nèi)部和類(lèi)外部的全局內(nèi)存區(qū)中兩次聲明,但訪問(wèn)的方式與類(lèi)中的普通成員相同。靜態(tài)變量和函數(shù)可以在聲明實(shí)例之前就被訪問(wèn)。默認(rèn)的情況下,類(lèi)中的成員都被認(rèn)為是私有的,并且只能被類(lèi)中的其他成員函數(shù)訪問(wèn)。通常情況下如果沒(méi)有自定義構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)定義默認(rèn)且僅有的構(gòu)造函數(shù)和析構(gòu)函數(shù)。而且當(dāng)使用自定義構(gòu)造函數(shù)時(shí),要求構(gòu)造函數(shù)必須聲明為公有。在C++中,存在3種類(lèi)型的類(lèi),分別為類(lèi),結(jié)構(gòu)和聯(lián)合,三者使用不同的關(guān)鍵字來(lái)聲明,分別為class,struct和union。在類(lèi)的成員函數(shù)中調(diào)用非成員函數(shù),在非成員函數(shù)前必須加上“::”。12/9/202220聲明類(lèi)的靜態(tài)變量時(shí)必須在類(lèi)內(nèi)部和類(lèi)外部的全局內(nèi)存區(qū)中兩次聲明12/9/20222112/9/202221FAQ6如何理解構(gòu)造函數(shù)?構(gòu)造函數(shù)的主要功能是給對(duì)象分配空間,因?yàn)閷?duì)象在定義時(shí)都會(huì)默認(rèn)調(diào)用構(gòu)造函數(shù),以此進(jìn)行內(nèi)存空間的分配以及變量的初始化操作。12/9/202222FAQ6如何理解構(gòu)造函數(shù)?構(gòu)造函數(shù)的主要功能是給對(duì)象分配空間#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如果自己沒(méi)有定義構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)創(chuàng)建默認(rèn)的無(wú)參數(shù),空構(gòu)造函數(shù)。如果自定義了一個(gè)構(gòu)造函數(shù),系統(tǒng)則不會(huì)自動(dòng)創(chuàng)建默認(rèn)構(gòu)造函數(shù)。并且當(dāng)聲明類(lèi)的實(shí)例時(shí),需要使用自定義的構(gòu)造函數(shù)。構(gòu)造函數(shù)必須是公有的。構(gòu)造函數(shù)的名稱必須與類(lèi)名相同。構(gòu)造函數(shù)沒(méi)有返回值。構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可寫(xiě)在類(lèi)體內(nèi),也可定義在類(lèi)體外。構(gòu)造函數(shù)是一個(gè)特殊的函數(shù),該函數(shù)的名稱與類(lèi)名相同,不指定類(lèi)型說(shuō)明,有隱含的返回值,該值由系統(tǒng)內(nèi)部使用。程序中不能直接調(diào)用構(gòu)造函數(shù),在創(chuàng)建對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用構(gòu)造函數(shù)。構(gòu)造函數(shù)可以無(wú)參數(shù),可以有一個(gè)參數(shù),也可以有多個(gè)參數(shù)。構(gòu)造函數(shù)可以重載,即可以定義多個(gè)參數(shù)個(gè)數(shù)不同的構(gòu)造函數(shù)。12/9/202224如果自己沒(méi)有定義構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)創(chuàng)建默認(rèn)的無(wú)參數(shù),空構(gòu)造FAQ7默認(rèn)構(gòu)造函數(shù)是什么,它有什么特點(diǎn)?如果程序中沒(méi)有提供任何構(gòu)造函數(shù),則C++提供一個(gè)默認(rèn)的構(gòu)造函數(shù),該默認(rèn)構(gòu)造函數(shù)是無(wú)參構(gòu)造函數(shù),它僅負(fù)責(zé)創(chuàng)建對(duì)象,不做任何初始化的工作。默認(rèn)構(gòu)造函數(shù)的特點(diǎn)如下:在創(chuàng)建對(duì)象時(shí)編譯器自動(dòng)創(chuàng)建并調(diào)用。無(wú)參數(shù),函數(shù)體為空。僅當(dāng)沒(méi)有自定義構(gòu)造函數(shù)時(shí)編譯器才會(huì)自動(dòng)創(chuàng)建。12/9/202225FAQ7默認(rèn)構(gòu)造函數(shù)是什么,它有什么特點(diǎn)?如果程序中沒(méi)有提供#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何時(shí)調(diào)用拷貝構(gòu)造函數(shù)?拷貝構(gòu)造函數(shù)是由編譯器調(diào)用,用來(lái)完成一系列基于同一類(lèi)的其他對(duì)象的構(gòu)件及初始化,拷貝構(gòu)造函數(shù)的一般形式如下:

類(lèi)名(類(lèi)名&變量名) {

函數(shù)體; }12/9/202227FAQ8何時(shí)調(diào)用拷貝構(gòu)造函數(shù)?拷貝構(gòu)造函數(shù)是由編譯器調(diào)用,用對(duì)象以值傳遞的方式傳入函數(shù)體,即函數(shù)的返回值是對(duì)象,調(diào)用函數(shù)進(jìn)行形參和實(shí)參結(jié)合時(shí)。例如:classTest{…};copyfun(Testp) //函數(shù)的形參是類(lèi)的對(duì)象{…}intmain(){ Testt; copyfun(t);//當(dāng)調(diào)用函數(shù),函數(shù)的實(shí)參傳給形參,調(diào)用拷貝構(gòu)造函數(shù) …//省略}12/9/202228對(duì)象以值傳遞的方式傳入函數(shù)體,即函數(shù)的返回值是對(duì)象,調(diào)用函數(shù)對(duì)象以值傳遞的方式從函數(shù)返回,即函數(shù)的返回值是對(duì)象,函數(shù)返回值時(shí)。例如:classTest{…};Testcopyfun() //函數(shù)的返回值是類(lèi)的對(duì)象{ Testt(100); returnt; //函數(shù)返回的是對(duì)象intmain(){ Testt1; t1=copyfun(); //返回函數(shù)值時(shí),調(diào)用拷貝構(gòu)造函數(shù) …//省略}12/9/202229對(duì)象以值傳遞的方式從函數(shù)返回,即函數(shù)的返回值是對(duì)象,函數(shù)返回對(duì)象需要通過(guò)其他對(duì)象進(jìn)行初始化,即當(dāng)使用類(lèi)的一個(gè)對(duì)象去初始化該類(lèi)的另一個(gè)對(duì)象時(shí)。例如:classTest{…};intmain(){ Testt1; Testt2(t1); //使用t1初始化t2 …//省略}12/9/202230對(duì)象需要通過(guò)其他對(duì)象進(jìn)行初始化,即當(dāng)使用類(lèi)的一個(gè)對(duì)象去初始化#include<iostream.h>#include<string.h>//自定義類(lèi)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ù)實(shí)現(xiàn)部分Person::Person(char*pn){ cout<<"Personiscalled:"<<pn<<endl; //輸出pn里存儲(chǔ)的字符串 pname=newchar[strlen(pn)+1]; if(pname!=0) strcpy(pname,pn); //將pn的值賦給pname}31#include<iostream.h>31//拷貝構(gòu)造函數(shù)實(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ù)實(shí)現(xiàn)部分Person::~Person(){ cout<<"~Personiscalled:"<<pname<<endl;//輸出要析構(gòu)的Person對(duì)象的值 pname[0]='\0'; //將字符串賦空值 deletepname; //釋放pname所在的內(nèi)存空間}voidmain(){ Personp1("");//用構(gòu)造函數(shù)定義Person對(duì)象p1,為其字符串賦值 Personp2(p1); //用拷貝構(gòu)造函數(shù)定義Person對(duì)象p2,其字符串與p1相同}32//拷貝構(gòu)造函數(shù)實(shí)現(xiàn)部分32FAQ9深拷貝與淺拷貝的區(qū)別是什么?淺拷貝就是對(duì)默認(rèn)拷貝構(gòu)造函數(shù)所實(shí)現(xiàn)的數(shù)據(jù)成員逐一賦值,如果類(lèi)中包含指針類(lèi)型數(shù)據(jù),將會(huì)產(chǎn)生錯(cuò)誤。為了解決該問(wèn)題,需要顯式定義拷貝構(gòu)造函數(shù),使其不但可以復(fù)制數(shù)據(jù)成員,而且可以為對(duì)象分配內(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ū)別是什么?淺拷貝就是對(duì)默認(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)拷貝對(duì)象狀態(tài)中包含其他對(duì)象的引用時(shí),如果需要復(fù)制的是引用對(duì)象指向的內(nèi)容,而不是引用(內(nèi)存地址),則是深拷貝,否則是淺拷貝。淺拷貝就是成員數(shù)據(jù)之間的賦值,當(dāng)值拷貝時(shí),兩個(gè)對(duì)象就有共同的資源。而深拷貝是先將資源復(fù)制一份,使對(duì)象擁有不同的資源,但資源內(nèi)容是相同的。深拷貝在處理引用時(shí),如果改變新對(duì)象內(nèi)容將不會(huì)影響到原對(duì)象內(nèi)容。淺拷貝資源后釋放資源時(shí)可能會(huì)產(chǎn)生資源歸屬不清楚的情況,從而導(dǎo)致程序運(yùn)行出錯(cuò)。12/9/202235深拷貝和淺拷貝的區(qū)別當(dāng)拷貝對(duì)象狀態(tài)中包含其他對(duì)象的引用時(shí),如FAQ10如何理解析構(gòu)函數(shù)?析構(gòu)函數(shù),其作用與構(gòu)造函數(shù)剛好相反,是用來(lái)清理內(nèi)存中無(wú)用的資源。只有當(dāng)一個(gè)對(duì)象的生命周期結(jié)束時(shí)才調(diào)用析構(gòu)函數(shù)。12/9/202236FAQ10如何理解析構(gòu)函數(shù)?析構(gòu)函數(shù),其作用與構(gòu)造函數(shù)剛好相沒(méi)有使用析構(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沒(méi)有使用析構(gòu)函數(shù)的程序的代碼如下:12/9/202237構(gòu)造函數(shù)和析構(gòu)函數(shù)的區(qū)別:每個(gè)類(lèi)可以有多個(gè)構(gòu)造函數(shù),但卻只能有一個(gè)析構(gòu)函數(shù)。可以自定義帶參數(shù)的構(gòu)造函數(shù),但是卻不允許為析構(gòu)函數(shù)傳遞參數(shù)。析構(gòu)函數(shù)的特點(diǎn)如下。析構(gòu)函數(shù)是成員函數(shù),函數(shù)體可以寫(xiě)在類(lèi)的內(nèi)部,也可以寫(xiě)在類(lèi)的外部。析構(gòu)函數(shù)是一個(gè)特殊函數(shù),其名稱與類(lèi)名相同,并在前面加“~”字符,用來(lái)與構(gòu)造函數(shù)加以區(qū)別。析構(gòu)函數(shù)不可以指定返回值類(lèi)型,也沒(méi)有參數(shù)。一個(gè)類(lèi)中只允許定義一個(gè)析構(gòu)函數(shù)。析構(gòu)函數(shù)可以手動(dòng)調(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++中的類(lèi)和對(duì)象

C++中的類(lèi)和對(duì)象42FAQ1如何理解類(lèi)和對(duì)象?在面向?qū)ο蟪绦蛟O(shè)計(jì)中,類(lèi)表示對(duì)現(xiàn)實(shí)世界中一類(lèi)具有共同特征的事物的抽象。類(lèi)的定義是由兩部分組成的,分別是聲明部分和實(shí)現(xiàn)部分。聲明部分用來(lái)聲明該類(lèi)的成員,包括數(shù)據(jù)成員及成員函數(shù)(數(shù)據(jù)成員即是屬性,成員函數(shù)即是方法),實(shí)現(xiàn)部分是成員函數(shù)的具體實(shí)現(xiàn)。12/9/202243FAQ1如何理解類(lèi)和對(duì)象?在面向?qū)ο蟪绦蛟O(shè)計(jì)中,類(lèi)表示對(duì)現(xiàn)實(shí)class類(lèi)名{ public: 公有數(shù)據(jù)成員或成員函數(shù)聲明; private: 私有數(shù)據(jù)成員或成員函數(shù)聲明; protected: 受保護(hù)數(shù)據(jù)成員或成員函數(shù)聲明;}12/9/202244class類(lèi)名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對(duì)象的定義方式:先定義類(lèi)再定義對(duì)象定義類(lèi)的同時(shí)定義對(duì)象#include“iostream.h”classStu{private: charname[20]; intage; charsex[10];public: voidstuinfo();};Stus1,s2;

//對(duì)象#include“iostream.h”classStu{private: charname[20]; intage; charsex[10];public: voidstuinfo();}s1,s2;

12/9/202247對(duì)象的定義方式:#include“iostream.h”#FAQ2如何理解對(duì)象的初始化?構(gòu)造函數(shù)用來(lái)對(duì)類(lèi)對(duì)象進(jìn)行初始化,它完成對(duì)內(nèi)存空間的申請(qǐng)、賦初值等工作。析構(gòu)函數(shù)主要是用來(lái)做清理工作的。12/9/202248FAQ2如何理解對(duì)象的初始化?構(gòu)造函數(shù)用來(lái)對(duì)類(lèi)對(duì)象進(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如何理解對(duì)象的生存周期?對(duì)象的生存周期是從對(duì)象創(chuàng)建到釋放的一段時(shí)間。對(duì)象可以按生存周期的不同分為4種,即局部對(duì)象,全局對(duì)象,靜態(tài)對(duì)象和動(dòng)態(tài)對(duì)象。局部對(duì)象的生存周期較短;靜態(tài)對(duì)象的生存周期較長(zhǎng);全局對(duì)象的生存周期最長(zhǎng);而動(dòng)態(tài)對(duì)象的生存周期取決于new運(yùn)算符和delete運(yùn)算符的之間的間隔。12/9/202253FAQ3如何理解對(duì)象的生存周期?對(duì)象的生存周期是從對(duì)象創(chuàng)建到#include<iostream.h>#include<string.h>classTest{ char*mp;public: Test(char*lp) //類(lèi)Test的構(gòu)造函數(shù) { mp=NULL; cout<<"Test::Test()"<<endl; intlen=strlen(lp)+1; //獲得lp指向內(nèi)容的長(zhǎng)度 mp=newchar[len]; //動(dòng)態(tài)分配len大小的內(nèi)存空間 memset(mp,0,len); //內(nèi)存設(shè)置 strncpy(mp,lp,len); //將len長(zhǎng)的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*類(lèi)型 { 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*類(lèi)型1FAQ4如何向函數(shù)傳遞對(duì)象?值傳遞地址傳遞12/9/202256FAQ4如何向函數(shù)傳遞對(duì)象?值傳遞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) //類(lèi)對(duì)象作為函數(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) //類(lèi)對(duì)象作為函數(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) //類(lèi)對(duì)象作為函數(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編寫(xiě)C++類(lèi)時(shí)需要注意哪些問(wèn)題?使用關(guān)鍵字class來(lái)定義C++類(lèi)時(shí),class必須是小寫(xiě),其后面緊跟著類(lèi)的名稱。類(lèi)以左大括號(hào)開(kāi)始,右大括號(hào)結(jié)束,大括號(hào)中的內(nèi)容都屬于該類(lèi)的成員。一般情況下,在類(lèi)體內(nèi)先說(shuō)明公有成員,然后說(shuō)明私有成員。在說(shuō)明成員時(shí),一般按照成員的類(lèi)型由小到大的順序說(shuō)明。類(lèi)中的數(shù)據(jù)成員的類(lèi)型可以是任意的,包含整型、浮點(diǎn)型、字符型、數(shù)組、指針和引用等,也可以是另一個(gè)類(lèi)的對(duì)象、自身類(lèi)的指針或引用,但是自身類(lèi)的對(duì)象是不可以的。在類(lèi)體中不允許對(duì)所定義的數(shù)據(jù)成員進(jìn)行初始化。可以將類(lèi)定義的說(shuō)明部分或者整個(gè)定義部分(包含實(shí)現(xiàn)部分)放到一個(gè)頭文件中。12/9/202260FAQ5編寫(xiě)C++類(lèi)時(shí)需要注意哪些問(wèn)題?使用關(guān)鍵字class聲明類(lèi)的靜態(tài)變量時(shí)必須在類(lèi)內(nèi)部和類(lèi)外部的全局內(nèi)存區(qū)中兩次聲明,但訪問(wèn)的方式與類(lèi)中的普通成員相同。靜態(tài)變量和函數(shù)可以在聲明實(shí)例之前就被訪問(wèn)。默認(rèn)的情況下,類(lèi)中的成員都被認(rèn)為是私有的,并且只能被類(lèi)中的其他成員函數(shù)訪問(wèn)。通常情況下如果沒(méi)有自定義構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)定義默認(rèn)且僅有的構(gòu)造函數(shù)和析構(gòu)函數(shù)。而且當(dāng)使用自定義構(gòu)造函數(shù)時(shí),要求構(gòu)造函數(shù)必須聲明為公有。在C++中,存在3種類(lèi)型的類(lèi),分別為類(lèi),結(jié)構(gòu)和聯(lián)合,三者使用不同的關(guān)鍵字來(lái)聲明,分別為class,struct和union。在類(lèi)的成員函數(shù)中調(diào)用非成員函數(shù),在非成員函數(shù)前必須加上“::”。12/9/202261聲明類(lèi)的靜態(tài)變量時(shí)必須在類(lèi)內(nèi)部和類(lèi)外部的全局內(nèi)存區(qū)中兩次聲明12/9/20226212/9/202221FAQ6如何理解構(gòu)造函數(shù)?構(gòu)造函數(shù)的主要功能是給對(duì)象分配空間,因?yàn)閷?duì)象在定義時(shí)都會(huì)默認(rèn)調(diào)用構(gòu)造函數(shù),以此進(jìn)行內(nèi)存空間的分配以及變量的初始化操作。12/9/202263FAQ6如何理解構(gòu)造函數(shù)?構(gòu)造函數(shù)的主要功能是給對(duì)象分配空間#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如果自己沒(méi)有定義構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)創(chuàng)建默認(rèn)的無(wú)參數(shù),空構(gòu)造函數(shù)。如果自定義了一個(gè)構(gòu)造函數(shù),系統(tǒng)則不會(huì)自動(dòng)創(chuàng)建默認(rèn)構(gòu)造函數(shù)。并且當(dāng)聲明類(lèi)的實(shí)例時(shí),需要使用自定義的構(gòu)造函數(shù)。構(gòu)造函數(shù)必須是公有的。構(gòu)造函數(shù)的名稱必須與類(lèi)名相同。構(gòu)造函數(shù)沒(méi)有返回值。構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可寫(xiě)在類(lèi)體內(nèi),也可定義在類(lèi)體外。構(gòu)造函數(shù)是一個(gè)特殊的函數(shù),該函數(shù)的名稱與類(lèi)名相同,不指定類(lèi)型說(shuō)明,有隱含的返回值,該值由系統(tǒng)內(nèi)部使用。程序中不能直接調(diào)用構(gòu)造函數(shù),在創(chuàng)建對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用構(gòu)造函數(shù)。構(gòu)造函數(shù)可以無(wú)參數(shù),可以有一個(gè)參數(shù),也可以有多個(gè)參數(shù)。構(gòu)造函數(shù)可以重載,即可以定義多個(gè)參數(shù)個(gè)數(shù)不同的構(gòu)造函數(shù)。12/9/202265如果自己沒(méi)有定義構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)創(chuàng)建默認(rèn)的無(wú)參數(shù),空構(gòu)造FAQ7默認(rèn)構(gòu)造函數(shù)是什么,它有什么特點(diǎn)?如果程序中沒(méi)有提供任何構(gòu)造函數(shù),則C++提供一個(gè)默認(rèn)的構(gòu)造函數(shù),該默認(rèn)構(gòu)造函數(shù)是無(wú)參構(gòu)造函數(shù),它僅負(fù)責(zé)創(chuàng)建對(duì)象,不做任何初始化的工作。默認(rèn)構(gòu)造函數(shù)的特點(diǎn)如下:在創(chuàng)建對(duì)象時(shí)編譯器自動(dòng)創(chuàng)建并調(diào)用。無(wú)參數(shù),函數(shù)體為空。僅當(dāng)沒(méi)有自定義構(gòu)造函數(shù)時(shí)編譯器才會(huì)自動(dòng)創(chuàng)建。12/9/202266FAQ7默認(rèn)構(gòu)造函數(shù)是什么,它有什么特點(diǎn)?如果程序中沒(méi)有提供#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何時(shí)調(diào)用拷貝構(gòu)造函數(shù)?拷貝構(gòu)造函數(shù)是由編譯器調(diào)用,用來(lái)完成一系列基于同一類(lèi)的其他對(duì)象的構(gòu)件及初始化,拷貝構(gòu)造函數(shù)的一般形式如下:

類(lèi)名(類(lèi)名&變量名) {

函數(shù)體; }12/9/202268FAQ8何時(shí)調(diào)用拷貝構(gòu)造函數(shù)?拷貝構(gòu)造函數(shù)是由編譯器調(diào)用,用對(duì)象以值傳遞的方式傳入函數(shù)體,即函數(shù)的返回值是對(duì)象,調(diào)用函數(shù)進(jìn)行形參和實(shí)參結(jié)合時(shí)。例如:classTest{…};copyfun(Testp) //函數(shù)的形參是類(lèi)的對(duì)象{…}intmain(){ Testt; copyfun(t);//當(dāng)調(diào)用函數(shù),函數(shù)的實(shí)參傳給形參,調(diào)用拷貝構(gòu)造函數(shù) …//省略}12/9/202269對(duì)象以值傳遞的方式傳入函數(shù)體,即函數(shù)的返回值是對(duì)象,調(diào)用函數(shù)對(duì)象以值傳遞的方式從函數(shù)返回,即函數(shù)的返回值是對(duì)象,函數(shù)返回值時(shí)。例如:classTest{…};Testcopyfun() //函數(shù)的返回值是類(lèi)的對(duì)象{ Testt(100); returnt; //函數(shù)返回的是對(duì)象intmain(){ Testt1; t1=copyfun(); //返回函數(shù)值時(shí),調(diào)用拷貝構(gòu)造函數(shù) …//省略}12/9/202270對(duì)象以值傳遞的方式從函數(shù)返回,即函數(shù)的返回值是對(duì)象,函數(shù)返回對(duì)象需要通過(guò)其他對(duì)象進(jìn)行初始化,即當(dāng)使用類(lèi)的一個(gè)對(duì)象去初始化該類(lèi)的另一個(gè)對(duì)象時(shí)。例如:classTest{…};intmain(){ Testt1; Testt2(t1); //使用t1初始化t2 …//省略}12/9/202271對(duì)象需要通過(guò)其他對(duì)象進(jìn)行初始化,即當(dāng)使用類(lèi)的一個(gè)對(duì)象去初始化#include<iostream.h>#include<string.h>//自定義類(lèi)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ù)實(shí)現(xiàn)部分Person::Person(char*pn){ cout<<"Personiscalled:"<<pn<<endl; //輸出pn里存儲(chǔ)的字符串 pname=newchar[strlen(pn)+1]; if(pname!=0) strcpy(pname,pn); //將pn的值賦給pname}72#include<iostream.h>31//拷貝構(gòu)造函數(shù)實(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ù)實(shí)現(xiàn)部分Person::~Person(){ cout<<"~Personiscalled:"<<pname<<endl;//輸出要析構(gòu)的Person對(duì)象的值 pname[0]='\0'; //將字符串賦空值 deletepname; //釋放pname所在的內(nèi)存空間}voidmain(){ Personp1("");//用構(gòu)造函數(shù)定義Person對(duì)象p1,為其字符串賦值 Personp2(p1); //用拷貝構(gòu)造函數(shù)定義Person對(duì)象p2,其字符串與p1相同}73//拷貝構(gòu)造函數(shù)實(shí)現(xiàn)部分

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論