第3章 類和對(duì)象_第1頁(yè)
第3章 類和對(duì)象_第2頁(yè)
第3章 類和對(duì)象_第3頁(yè)
第3章 類和對(duì)象_第4頁(yè)
第3章 類和對(duì)象_第5頁(yè)
已閱讀5頁(yè),還剩192頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章類和對(duì)象授課內(nèi)容3.1C++中的類和對(duì)象3.2構(gòu)造函數(shù)與析構(gòu)函數(shù)3.3數(shù)據(jù)成員的初始化3.4拷貝構(gòu)造函數(shù)3.5const對(duì)象和const成員3.6對(duì)象與函數(shù)3.7對(duì)象與指針3.8友元3.9內(nèi)嵌對(duì)象3.1C++中的類和對(duì)象面向?qū)ο蟪绦蛟O(shè)計(jì)方法面向?qū)ο笫且环N世界觀和方法論,是一種思想。面向?qū)ο蟪绦蛟O(shè)計(jì)(ObjectOrientedProgramming)OOP方法認(rèn)為,客觀世界是由各種各樣的實(shí)體組成的,這些實(shí)體就是OOP方法中的對(duì)象。每個(gè)對(duì)象由內(nèi)部屬性和它本身具有的行為(方法)組成,其內(nèi)部屬性就是數(shù)據(jù),它本身具有的行為(方法)由函數(shù)來實(shí)現(xiàn)。程序就由各種各樣的對(duì)象互相交互組成問題編寫程序接受用戶從鍵盤輸入的一串英文字符(輸入“!”表示輸入結(jié)束),最終把用戶的輸入打印出來。由于用戶在鍵盤上進(jìn)行輸入時(shí),不能保證不會(huì)出錯(cuò),所以我們?cè)试S用戶對(duì)他已經(jīng)輸入的內(nèi)容進(jìn)行修改。當(dāng)用戶發(fā)現(xiàn)剛剛鍵入的一個(gè)字符錯(cuò)了時(shí),可以鍵入一個(gè)“#”,以表示前一個(gè)字符無效當(dāng)用戶鍵入一個(gè)“#”之后,發(fā)現(xiàn)在“#”之前鍵入一個(gè)字符并沒有錯(cuò)時(shí),可以補(bǔ)進(jìn)一個(gè)“&”,以表示前面的“#”字符無效當(dāng)用戶發(fā)現(xiàn)當(dāng)前已經(jīng)鍵入的內(nèi)容差錯(cuò)較多,則可以鍵入一個(gè)符“@”,以表示當(dāng)當(dāng)前已經(jīng)鍵入的內(nèi)容均無效。面向?qū)ο蟪绦蛟O(shè)計(jì)方法輸入as#f@gg#&dd打印ggdd面向?qū)ο蟪绦蛟O(shè)計(jì)方法找兩個(gè)可以接受人的指令的容器,來存放用戶輸入的字符,1號(hào)容器和2號(hào)容器。當(dāng)用戶向容器發(fā)出“存儲(chǔ)某個(gè)字符”的指令的時(shí)候,容器會(huì)把該字符放到自己里面。當(dāng)用戶向容器發(fā)出“取字符”的指令的時(shí)候,容器會(huì)把最后存儲(chǔ)的字符送給用戶。1號(hào)容器2號(hào)容器as#f@gg#&dd1←存儲(chǔ)a1←存儲(chǔ)s1←取出字符2←存儲(chǔ)從1號(hào)容器取出的字符1←存儲(chǔ)f1←發(fā)出多個(gè)“取出字符”指令,直到1號(hào)容器為空1←存儲(chǔ)g1←存儲(chǔ)g1←取出字符2←存儲(chǔ)從1號(hào)容器取出的字符2←取出字符1←存儲(chǔ)從2號(hào)容器取出的字符1←存儲(chǔ)d1←存儲(chǔ)dasfgg定義1號(hào)容器;定義2號(hào)容器;charch;cin>>ch;while(ch!=‘!’){ if(ch==‘#’){

向1號(hào)容器發(fā)出“取出字符”的指令;向2號(hào)容器發(fā)出“存儲(chǔ)從1號(hào)容器取出的字符”的指令;}elseif(ch==‘&’){

向2號(hào)容器發(fā)出“取出字符”的指令;向1號(hào)容器發(fā)出“存儲(chǔ)從1號(hào)容器取出的字符”的指令;}

elseif(ch==‘@’){向1號(hào)容器發(fā)出多個(gè)“取出字符”指令,直到1號(hào)容器為空;}else{向1號(hào)容器發(fā)出發(fā)出“存儲(chǔ)ch”的指令;} cin>>ch;}面向?qū)ο蟪绦蛟O(shè)計(jì)方法1號(hào)容器2號(hào)容器數(shù)據(jù)(屬性):里面存儲(chǔ)的字符行為(方法):把某個(gè)字符放到自己里面把最后存儲(chǔ)的字符送給用戶數(shù)據(jù)(屬性):里面存儲(chǔ)的字符行為(方法):把某個(gè)字符放到自己里面把最后存儲(chǔ)的字符送給用戶面向?qū)ο蟪绦蛟O(shè)計(jì)方法對(duì)象從程序的角度看,對(duì)象是數(shù)據(jù)(屬性)和行為(方法)的封裝體。從設(shè)計(jì)者的角度,對(duì)象就是客觀世界中的事物,可以是具體事物,也可以是抽象事物。面向?qū)ο蟪绦蛟O(shè)計(jì)方法屬性圓心:(10,10)半徑:4方法:返回面積返回周長(zhǎng)屬性圓心:(20,30)半徑:8方法:返回面積返回周長(zhǎng)面向?qū)ο蟪绦蛟O(shè)計(jì)方法消息 就是要求對(duì)象進(jìn)行某種活動(dòng)(操作)的請(qǐng)求。在面向?qū)ο蟪绦蛑?,要求某?duì)象作某操作時(shí),就向該對(duì)象發(fā)送一個(gè)相應(yīng)的消息。消息的語(yǔ)法組成:目標(biāo)對(duì)象,請(qǐng)求的操作,參數(shù)。面向?qū)ο蟪绦蛟O(shè)計(jì)方法屬性圓心:(10,10)半徑:4方法:返回面積返回周長(zhǎng)屬性圓心:(20,30)半徑:8方法:返回面積返回周長(zhǎng)面向?qū)ο蟪绦蛟O(shè)計(jì)方法類類是一組具有相同特征和行為的對(duì)象的集合。類是用來描述其所屬集合中所有對(duì)象的屬性和方法,即對(duì)象的內(nèi)部結(jié)構(gòu)。類是對(duì)象的抽象,而對(duì)象是類的實(shí)例。面向?qū)ο蟪绦蛟O(shè)計(jì)方法屬性圓心:(10,10)半徑:4方法:返回面積返回周長(zhǎng)屬性圓心:(20,30)半徑:8方法:返回面積返回周長(zhǎng)屬性圓心坐標(biāo)、半徑行為:返回面積、返回周長(zhǎng)類:圓面向?qū)ο蟪绦蛟O(shè)計(jì)方法OOP方法認(rèn)為程序就由各種各樣的對(duì)象互相交互組成。如何定義對(duì)象?要定義對(duì)象首先要聲明類,然后通過類定義對(duì)象。面向?qū)ο蟪绦蛟O(shè)計(jì)方法1號(hào)容器2號(hào)容器數(shù)據(jù)(屬性):里面存儲(chǔ)的字符行為(方法):把某個(gè)字符放到自己里面把最后存儲(chǔ)的字符送給用戶數(shù)據(jù)(屬性):里面存儲(chǔ)的字符行為(方法):把某個(gè)字符放到自己里面把最后存儲(chǔ)的字符送給用戶classContainer{public: charm_Data[100]; intm_Index; Container() {m_Index=0;} voidpush(charch) {m_Data[m_Index]=ch;++m_Index;} charpop() {--m_Index;returnm_Data[m_Index];}};Containerc1,c2;//定義對(duì)象c1.push('a');//發(fā)送消息c1.push('b');chars=c1.pop();c2.push(s);#include<iostream>usingnamespacestd;intmain(){ Containerc1;Containerc2;charch;cin>>ch; while(ch!='!') { if(ch=='#'){charx=c1.pop();c2.push(x);} elseif(ch=='&'){charx=c2.pop();c1.push(x);} elseif(ch=='@') { while(c1.m_Index!=0){c1.pop();} } else{c1.push(ch)} cin>>ch; } for(inti=0;i<c1.m_Index;++i) {cout<<c1.m_Data[i];} return0;}類和對(duì)象的概念屬性圓心:(10,10)半徑:4行為:返回面積返回周長(zhǎng)屬性圓心:(20,30)半徑:8行為:返回面積返回周長(zhǎng)屬性圓心坐標(biāo)、半徑行為:顯示面積、顯示周長(zhǎng)類:圓類和對(duì)象的概念classCircle{ doublem_dX;

doublem_dY; doublem_dR;public: Circle(inta,intb,intc) {m_dX=a;m_dY=b;m_dR=c;} doubleGetArea(){return3.14*m_dR*m_dR;} doubleGetCir(){return2*3.14*m_dR;}};intmain(){Circlec1(10,10,4);

Circlec2(20,30,8);cout<<c1.GetArea();cout<<c2.GetCir();return0;}具有的行為具有的屬性類和對(duì)象的概念類類是一種數(shù)據(jù)類型,但不是一般的數(shù)據(jù)類型,而是由程序員抽象出來的數(shù)據(jù)類型,是自定義的數(shù)據(jù)類型。抽象通過從特定的實(shí)體中抽取共同的性質(zhì)以形成一般化的概念(類)的過程。成績(jī)管理系統(tǒng)張三、數(shù)學(xué)、李四、語(yǔ)文張三李四抽象類:學(xué)生屬性學(xué)號(hào)、姓名、班級(jí)行為:考試語(yǔ)文數(shù)學(xué)抽象類:課程抽象抽象包括數(shù)據(jù)抽象、代碼抽象數(shù)據(jù)抽象:定義了某類對(duì)象的屬性和狀態(tài)。代碼抽象:定義了某類對(duì)象的共同行為或具有的共同功能。抽象盡管問題域中的實(shí)體很復(fù)雜,但分析時(shí)并不需要了解和描述一個(gè)實(shí)體的全部?jī)?nèi)容,只需要分析研究其中與系統(tǒng)有關(guān)的實(shí)體以及該實(shí)體的本質(zhì)性特征。對(duì)于那些與系統(tǒng)目標(biāo)無關(guān)的特征和許多具體的細(xì)節(jié),應(yīng)當(dāng)舍棄。抽象某牛場(chǎng)中養(yǎng)的每頭牛的壽命是九年,每頭牛從第四年開始每年產(chǎn)下一頭小牛,第一年牛場(chǎng)中有一頭牛,問第二十年時(shí)牛場(chǎng)中共有多少牛?類:牛屬性(數(shù)據(jù)):年齡行為(方法、操作):生長(zhǎng):自身年齡加一生小牛:創(chuàng)建一個(gè)年齡為一歲新的牛對(duì)象,死亡:銷毀自身抽象1、遍歷老牛圈,然老牛圈中的牛都長(zhǎng)一歲。2、再次遍歷老牛圈,根據(jù)年齡,能生小牛的讓它生小牛放入新生牛圈,把要死亡的清除出老牛圈。3、把新生牛牛圈中的新生牛趕入老牛圈。4、進(jìn)入下一年。存放老牛的圈存放當(dāng)年新生牛的圈第n年抽象類:牛圈屬性(數(shù)據(jù)):牛的數(shù)量行為(方法、操作):添加牛清除牛類:牛屬性(數(shù)據(jù)):年齡行為(方法、操作):生長(zhǎng):自身年齡加一生小牛:創(chuàng)建一個(gè)年齡為一歲新的牛對(duì)象,死亡:銷毀自身C++中的類和對(duì)象面向?qū)ο蟪绦蛟O(shè)計(jì)方法認(rèn)為程序就由各種各樣的對(duì)象互相交互組成。要定義對(duì)象首先要定義類,然后通過類定義對(duì)象。C++中的類和對(duì)象classCircle{ doublem_dX;

doublem_dY; doublem_dR;public: Circle(doublea,doubleb,doublec) {m_dX=a;m_dY=b;m_dR=c;} doubleGetArea(){return3.14*m_dR*m_dR;} doubleGetCir(){return2*3.14*m_dR;} ~Circle(){}};普通成員函數(shù)數(shù)據(jù)成員定義類的關(guān)鍵字類的名字,首字母大寫構(gòu)造函數(shù)析構(gòu)函數(shù)C++中的類和對(duì)象類的結(jié)構(gòu)比較復(fù)雜,主要包含數(shù)據(jù)成員、成員函數(shù)。數(shù)據(jù)成員(成員變量)描述了屬于該類的對(duì)象所具有的屬性。成員函數(shù)(成員方法)構(gòu)造函數(shù):用于對(duì)象的初始化工作,當(dāng)一個(gè)對(duì)象被創(chuàng)建時(shí)會(huì)自動(dòng)調(diào)用。普通成員函數(shù):描述了屬于該類的對(duì)象所具有的行為(方法)。析構(gòu)函數(shù):將要釋放某個(gè)對(duì)象所占據(jù)的存儲(chǔ)空間之前,析構(gòu)函數(shù)會(huì)被自動(dòng)調(diào)用,來進(jìn)行一些清理工作。C++中的類和對(duì)象成員函數(shù)命名規(guī)則一般由多個(gè)英文單詞組成,每個(gè)單詞的第一個(gè)字母用大寫字母,其余用小寫,單詞減不加任何分隔。例:boolIsLeapYear();voidSetDate();數(shù)據(jù)成員名命名規(guī)則通常前面加前綴“m_”,以區(qū)別普通變量名,接著是一個(gè)或多個(gè)小寫字母,用來指明數(shù)據(jù)類型,最后是一個(gè)或多個(gè)首字母大寫的單詞,指明用途。 例:m_strName,m_nAge,C++中的類和對(duì)象classCircle{ doublem_dX;

doublem_dY; doublem_dR;public: Circle(doublea,doubleb,doublec) {m_dX=a;m_dY=b;m_dR=c;} doubleGetArea(){return3.14*m_dR*m_dR;} doubleGetCir(){return2*3.14*m_dR;} ~Circle(){}};intmain(){Circlec1(4.3,8.2,10.5);

cout<<c1.GetArea();return0;}C++中的類和對(duì)象程序中有類的時(shí)候,文件的一般組織方式把類的聲明放在一個(gè)頭文件(circle.h)中在用到該類的其他文件中包含該類的定義所在的頭文件(circle.h)。C++中的類和對(duì)象類的定義格式:class<類名>{private: <數(shù)據(jù)成員或成員函數(shù)>;public: <數(shù)據(jù)成員或成員函數(shù)>;protected:

<數(shù)據(jù)成員或成員函數(shù)>;};私有成員:只允許類中的成員函數(shù)訪問,在類的外面不可直接訪問。公有成員:允許任意訪問保護(hù)成員:對(duì)派生類是公有的,其它私有。C++中的類和對(duì)象classCircle{private: doublem_dX;

doublem_dY; doublem_dR;public: Circle(doublea,doubleb,doublec) {m_dX=a;m_dY=b;m_dR=c;} doubleGetArea(){return3.14*m_dR*m_dR;} doubleGetCir(){return2*3.14*m_dR;} ~Circle(){}};intmain(){Circlec1(4,8,10);

cout<<c1.GetArea();

c1.m_dR=20;return0;}錯(cuò)誤public:doublem_dR;正確C++中的類和對(duì)象注意:在類的定義中,private、public和protected的順序可以任意排列,可以出現(xiàn)多次。如果某個(gè)private關(guān)鍵字在最前面出現(xiàn),該private關(guān)鍵字可以省略;不是在最前面出現(xiàn)的private關(guān)鍵字不能省略。classCircle{private: doublem_dX;public: Circle(doublea,doubleb,doublec) {m_dX=a;m_dY=b;m_dR=c;} doubleGetArea(){return3.14*m_dR*m_dR;} doubleGetCir(){return2*3.14*m_dR;}private:

doublem_dY; doublem_dR;public: ~Circle(){}};C++中的類和對(duì)象抽象:通過從特定的實(shí)體中抽取共同的性質(zhì)以形成一般化的概念(類)的過程。屬性圓心坐標(biāo)、半徑行為:顯示面積、顯示周長(zhǎng)類:圓抽象classCircle{ //…};封裝(封藏)C++中的類和對(duì)象封裝:把屬性和行為(方法)通過class封藏起來。封裝考慮的主要問題是類的哪些屬性和行為對(duì)外是公開的,哪些屬性和行為對(duì)外是不公開的。把對(duì)外不公開的屬性和行為定義為私有成員。把對(duì)外公開的屬性和行為定義為公有成員。公有成員就成為外界和屬于該類的對(duì)象進(jìn)行交流的接口。封裝體現(xiàn)了信息隱藏。C++中的類和對(duì)象classCircle{ doublem_dX;

doublem_dY; doublem_dR;public: Circle(doublea,doubleb,doublec) {m_dX=a;m_dY=b;m_dR=c;} doubleGetArea(){return3.14*m_dR*m_dR;} doubleGetCir(){return2*3.14*m_dR;} ~Circle(){}};這樣可以阻止外界對(duì)數(shù)據(jù)成員的隨意訪問,成員函數(shù)成為外界和屬于該類的對(duì)象進(jìn)行交流的統(tǒng)一接口。

C++中的類和對(duì)象classCircle{ doublem_dX;

doublem_dY; doublem_dR;public: Circle(doublea,doubleb,doublec) {m_dX=a;m_dY=b;m_dR=c;} doubleGetArea(){return3.14*m_dR*m_dR;} doubleGetCir(){return2*3.14*m_dR;}

doubleGetR(){returnm_dR;}

viodSetR(doubler){m_dR=r;} ~Circle(){}};intmain(){Circlec1(4,8,10);

cout<<c1.GetArea();cout<<c1.GetR();c1.SetR(20);return0;}C++中的類和對(duì)象屬性底面圓半徑、高行為:返回體積、返回表面積類:圓柱classCylinder{private: doublem_dH;//高

doublem_dR;//底面圓半徑

doubleGetCircleArea(){return3.14*m_dR*m_dR;}

doubleGetCircleCir(){return2*3.14*m_dR;}public: Cylinder(doubleh,doubler){m_dH=h;m_dR=r;}

doubleGetVolume() {returnGetCircleArea()*m_dH;} doubleGetArea()

{return2*GetCircleArea()+GetCircleCir()*m_dH;} ~Cylinder(){}};Cylinder

c(4,10);cout<<c.GetArea();cout<<c.GetVolume();classCylinder{private: doublem_dH=20;//高

doublem_dR=30;//底面圓半徑

doubleGetCircleArea(){return3.14*m_nR*m_nR;}

doubleGetCircleCir(){return2*3.14*m_nR;}public: Cylinder(doubleh,doubler){m_dH=h;m_dR=r;} doubleGetVolume() {returnGetCircleArea()*m_dH;} doubleGetArea()

{return2*GetCircleArea()+GetCircleCir()*m_dH;} ~Cylinder(){}};不能在定義類時(shí)對(duì)數(shù)據(jù)成員初始化。成員函數(shù)的定義classCircle{ doublem_dX;

doublem_dY; doublem_dR;public: Circle(doublea,doubleb,doublec) {m_dX=a;m_dY=b;m_dR=c;} doubleGetArea(){return3.14*m_dR*m_dR;} doubleGetCir(){return2*3.14*m_dR;} ~Circle(){}};在聲明類時(shí):對(duì)成員函數(shù)的定義(函數(shù)體)已經(jīng)給出。classCircle{ doublem_dX;doublem_dY; doublem_dR;public: Circle(doublea,doubleb,doublec); doubleGetArea(); doubleGetCir(); ~Circle();};Circle::Circle(doublea,double

b,double

c){m_dX=a;m_dY=b;m_dR=c;}doubleCircle::GetArea(){return3.14*m_dR*m_dR;}doubleCircle::GetCir(){return2*3.14*m_dR;}Circle::~Circle(){}成員函數(shù)的定義可以在類體中只給出成員函數(shù)的原型,成員函數(shù)的函數(shù)定義(函數(shù)體)在類體外給出。格式<類型><類名>::<函數(shù)名>(<參數(shù)表>){<函數(shù)體>}舉例:doubleCircle::GetArea() {return3.14*m_dR*m_dR;}成員函數(shù)的定義程序中有類的時(shí)候,文件的一般組織方式把類的聲明放在一個(gè)頭文件(Circle.h文件)中在用到該類的其他文件中包含該類的聲明所在的頭文件。如果類的成員函數(shù)沒有定義在類體內(nèi),我們一般創(chuàng)建一個(gè)和類的定義所在的頭文件重名的cpp文件(Circle.cpp),在這個(gè)cpp文件中放置成員函數(shù)的定義。在Circle.cpp要包含Circle.h。//Cylinder.h的內(nèi)容classCylinder{private:

doublem_dH;//高

doublem_dR;//底面圓半徑

doubleGetCircleArea();

doubleGetCircleCir();public: Cylinder(doubleh,doubler); doubleGetVolume(); doubleGetArea(); ~Cylinder();};//Cylinder.cpp的內(nèi)容doubleCylinder::GetCircleArea(){return3.14*m_dR*m_dR;}doubleCylinder::GetCircleCir(){return2*3.14*m_dR;}Cylinder::Cylinder(doubleh,doubler){m_dH=h;m_dR=r;}doubleCylinder::GetVolume(){returnGetCircleArea()*m_dH;}doubleCylinder::GetArea(){return2*GetCircleArea()+GetCircleCir()*m_dH;}Cylinder::~Cylinder(){}成員函數(shù)的定義類中較簡(jiǎn)單的成員函數(shù)可以定義成內(nèi)聯(lián)函數(shù),以提高程序執(zhí)行的速度。格式1:inline<類型><類名>::<函數(shù)名>(<參數(shù)表>){<函數(shù)體>}舉例:inlinedoubleCircle::GetArea() {return3.14*m_dR*m_dR;}格式2:在類的聲明中直接定義的成員函數(shù)自動(dòng)成為內(nèi)聯(lián)函數(shù)classCircle{ doublem_dX;doublem_dY; doublem_dR;public: Circle(doublea,doubleb,doublec); doubleGetArea(); doubleGetCir(){return2*3.14*m_nR;} ~Circle();};Circle::Circle(doublea,doubleb,doublec);{m_dX=a;m_dY=b;m_dR=c;}inlinedoubleCircle::GetArea(){return3.14*m_dR*m_dR;}Circle::~Circle(){}Circle.hCircle.cpp成員函數(shù)的定義程序中有類的時(shí)候,文件的一般組織方式把類的聲明放在一個(gè)頭文件(Circle.h文件)中在用到該類的其他文件中包含該類的聲明所在的頭文件。如果類的成員函數(shù)沒有定義在類體內(nèi),我們一般創(chuàng)建一個(gè)和類的定義所在的頭文件重名的cpp文件(Circle.cpp),在這個(gè)cpp文件中放置成員函數(shù)的定義。在Circle.cpp中要包含Circle.h。如果成員函數(shù)是內(nèi)聯(lián)的,該成員函數(shù)的定義要放在頭文件中。//Circle.h的內(nèi)容classCircle{ doublem_dX;doublem_dY;doublem_dR;public: Circle(doublea,doubleb,doublec); doubleGetArea();//要內(nèi)聯(lián) doubleGetCir(){return2*3.14*m_dR;} ~Circle();};inlinedoubleCircle::GetArea(){return3.14*m_dR*m_dR;}//Circle.cpp的內(nèi)容Circle::Circle(

doublea,doubleb,doublec){ m_dX=a;m_dY=b;m_dR=c;}Circle::~Circle(){}成員函數(shù)的定義成員函數(shù)允許重載一個(gè)類中的成員函數(shù)可以重名。成員函數(shù)重載的條件是重載成員函數(shù)的形參列表不同。不能僅依賴成員函數(shù)的返回值不同來重載函數(shù)。成員函數(shù)的重載和普通函數(shù)的重載完全一樣。classTest{ intm_nA;intm_nB;public: Test(inta,intb) {m_nA=a;m_nB=b;}

voidSet() {m_nA=0;m_nB=0;}

voidSet(inta) {m_nA=a;m_nB=0;}

voidSet(inta,intb) {m_nA=a;m_nB=b;} ~Test(){}};intmain(){Testt1(4,8);t1.Set();t1.Set(3);t1.Set(6,7

);return0;}成員函數(shù)的定義調(diào)用重載函數(shù)會(huì)引起歧義例1:

voidf(inta){cout<<a;}

voidf(longa){cout<<a;}

intmain()

{ f(3.14); return0; }歧義成員函數(shù)的定義調(diào)用重載函數(shù)會(huì)引起歧義例2:

voidf(inta){cout<<a;}

voidf(int&a){cout<<a;}

intmain()

{ intb=100; f(b); f(3); return0; }歧義不歧義,調(diào)用f(int)成員函數(shù)的定義調(diào)用重載函數(shù)是會(huì)引起歧義例3:

voidf(inta){cout<<a;}

voidf(constint&a){cout<<a;}

intmain()

{ intb=100; f(b); f(3); return0; }歧義歧義成員函數(shù)的定義成員函數(shù)允許帶有默認(rèn)參數(shù)默認(rèn)參數(shù)的設(shè)置應(yīng)從參數(shù)表的最右邊開始設(shè)置,從右到左依次設(shè)置。classTest{ intm_nA;intm_nB;public: Test(inta,intb) {m_nA=a;m_nB=b;}

voidSet(inta=0,intb=0) {m_nA=a;m_nB=b;} ~Test(){}};intmain(){Testt1(4,8);t1.Set();t1.Set(3);t1.Set(6,7

);return0;}成員函數(shù)的定義調(diào)用重載函數(shù)會(huì)引起歧義例4:classTest{ intm_nA;intm_nB;public: Test(inta,intb) {m_nA=a;m_nB=b;}

voidSet(inta=0,intb=0) {m_nA=a;m_nB=b;}

voidSet() {m_nA=0;m_nB=0;} ~Test(){}};intmain(){Testt1(4,8);t1.Set();return0;}歧義C++中的類和對(duì)象日期2007年10月25日2008年9月15日屬性年、月、日行為:返回年、改變年返回月、改變?cè)路祷厝?、改變?nèi)沾蛴∪掌冢∣ctober,25,2007)類:日期//頭文件Date.h的內(nèi)容ClassDate{ intm_nYear;intm_nMonth;intm_nDay;public: Date(inty,intm,intd); intGetYear();//內(nèi)聯(lián) intGetMonth();//內(nèi)聯(lián) intGetDay();//內(nèi)聯(lián) voidSetYear(inty);//內(nèi)聯(lián) voidSetMonth(intm);

//內(nèi)聯(lián) voidSetDay(intd);//內(nèi)聯(lián) voidShow();};//頭文件Date.h的內(nèi)容inlineintDate::GetYear(){returnm_nYear;}inlineintDate::GetMonth(){returnm_nMonth;}inlineintDate::GetDay(){returnm_nDay;}inlinevoidDate::SetYear(inty){m_nYear=y;

}inlinevoidDate::SetMonth(intm){m_nMonth=y;}inlinevoidDate::SetDay(intd){m_nDay=d;

}//源文件Date.cpp的內(nèi)容#include"Date.h"#include<iostream>usingnamespacestd;Date::Date(inty,intm,intd){ m_nYear=y;m_nMonth=m;m_nDay=d;}voidDate::Show(){ swich(m_nMonth) { case1:cout<<"January";break;

case2:cout<<"February";break; //… } cout<<","<<m_nDay<<","<<m_nYear<<endl;}//源文件main.cpp的內(nèi)容#include"Date.h"intmain(){ Dated1(2007,1,22); d1.Show(); d1.SetMonth(2); d1.Show();

d1.SetMonth(-2);

d1.SetDay(56);

Dated2(-2007,16,45); return0;}3.2構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)概述構(gòu)造函數(shù)和析構(gòu)函數(shù)是比較特殊的成員函數(shù)構(gòu)造函數(shù):當(dāng)一個(gè)對(duì)象被創(chuàng)建時(shí)會(huì)自動(dòng)調(diào)用,用來對(duì)對(duì)象進(jìn)行初始化。析構(gòu)函數(shù):將要釋放某個(gè)對(duì)象所占據(jù)的存儲(chǔ)空間之前,析構(gòu)函數(shù)會(huì)被自動(dòng)調(diào)用,來進(jìn)行一些清理工作。classPoint{intm_nX;intm_nY;public:Point(intx,inty){m_nX=x;m_nY=y;cout<<"con"<<endl;}voidSetXY(inta,intb){m_nX=a;m_nY=b;}voidPrintXY(){cout<<m_nX<<","<<m_nY;}~Point(){cout<<"destroy"<<endl;}};p1m_nY:

m_nX:intmain(){Pointp1(10,20);Pointp2(13,15);

p1.SetXY(20,10);p2.PrintXY();return0;}1020p2m_nY:

m_nX:13152010concon13,15destroydestroy構(gòu)造函數(shù)聲明格式:<類名>(<參數(shù)表>);程序中不能直接調(diào)用構(gòu)造函數(shù),在創(chuàng)建對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)構(gòu)造函數(shù)注意點(diǎn)構(gòu)造函數(shù)與類同名沒有返回值,原型中也沒有void。構(gòu)造函數(shù)注意點(diǎn)構(gòu)造函數(shù)可以重載。classPoint{private: intm_nX; intm_nY;public:

Point(inta,intb){m_nX=a;m_nX=b;} voidSetXY(inta,intb){m_nX=a;m_nY=b;} voidPrintXY(){cout<<m_nX<<","<<m_nY;} ~Point(){}};Point(){m_nX=0;m_nX=0;}Pointp1;Pointp2(10,20);Pointp4(20);Pointp3();在創(chuàng)建對(duì)象時(shí),必須有可匹配的構(gòu)造函數(shù)被調(diào)用,如果無匹配的構(gòu)造函數(shù),則報(bào)錯(cuò)。構(gòu)造函數(shù)注意點(diǎn)構(gòu)造函數(shù)可以帶有默認(rèn)參數(shù)。classPoint{private: intm_nX; intm_nY;public:

Point(){m_nX=0;m_nX=0;} Point(inta,intb){m_nX=a;m_nX=b;} voidSetXY(inta,intb){m_nX=a;m_nY=b;} voidPrintXY(){cout<<m_nX<<","<<m_nY;} ~Point(){}};Point(inta=0,intb=0){m_nX=a;m_nX=b;}Pointp1;Pointp2(10,20);Pointp3(20);構(gòu)造函數(shù)注意點(diǎn)構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi)也可以寫在類體外。classPoint{private: intm_nX; intm_nY;public: Point(inta=0,intb=0); voidSetXY(inta,intb); voidPrintXY(); ~Point(){}};//point.cpp的內(nèi)容Point::Point(inta=0,intb=0){m_nX=a;m_nY=b;}voidPoint::SetXY(inta,intb){m_nX=a;m_nY=b;}voidPoint::PrintXY(){cout<<m_nX<<","<<m_nY;}(inta,intb)//point.h的內(nèi)容構(gòu)造函數(shù)注意點(diǎn)classPoint{private: intm_nX; intm_nY;public:

voidSetXY(inta,intb){m_nX=a;m_nY=b;} voidPrintXY(){cout<<m_nX<<","<<m_nY;} ~Point(){}};//系統(tǒng)為我們自動(dòng)產(chǎn)生的構(gòu)造函數(shù),我們看不見它

intmain(){ Pointp; p.PrintXY(); return0;}

Point(){}構(gòu)造函數(shù)注意點(diǎn)classPoint{private: intm_nX; intm_nY;public:

Point(inta,intb){m_nX=a;m_nX=b;} voidSetXY(inta,intb){m_nX=a;m_nY=b;} voidPrintXY(){cout<<m_nX<<","<<m_nY;} ~Point(){}};intmain(){ Pointp; p.PrintXY(); return0;}

構(gòu)造函數(shù)注意點(diǎn)如果一個(gè)類你沒有定義構(gòu)造函數(shù),那么系統(tǒng)會(huì)為你定義一個(gè)構(gòu)造函數(shù),該構(gòu)造函數(shù)的參數(shù)表和函數(shù)體為空;如果你定義了一個(gè)構(gòu)造函數(shù),則系統(tǒng)不會(huì)為你定義任何構(gòu)造函數(shù)。析構(gòu)函數(shù)作用:將要釋放某個(gè)對(duì)象所占據(jù)的存儲(chǔ)空間之前,該對(duì)象的析構(gòu)函數(shù)會(huì)被自動(dòng)調(diào)用,來進(jìn)行一些清理工作。聲明格式:~類名();析構(gòu)函數(shù)例子classArray{private: int*m_pArray; intm_nSize;public: Array(intn) { m_nSize=n; m_pArray=newint[n]; } ~Array(){}};intmain(){ Arraya(4);

return0;}0X1000am_nSize:

m_pArray:

0X10004析構(gòu)函數(shù)例子classArray{private: int*m_pArray; intm_nSize;public: Array(intn) { m_nSize=n; m_pArray=newint[n]; }};intmain(){ Arraya(4);

return0;}~Array(){delete[]m_pArray;}0X1000am_nSize:

m_pArray:

0X10004析構(gòu)函數(shù)注意點(diǎn)析構(gòu)函數(shù)與類同名,只是在前面添加了符號(hào)~。析構(gòu)函數(shù)沒有返回值,原型中也沒有void。析構(gòu)函數(shù)沒有參數(shù),一個(gè)類只能有一個(gè)析構(gòu)函數(shù),析構(gòu)函數(shù)不能被重載析構(gòu)函數(shù)的函數(shù)體可寫在類體內(nèi),也可寫在類體外。將要釋放某個(gè)對(duì)象所占據(jù)的存儲(chǔ)空間之前,系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)。析構(gòu)函數(shù)也可以被程序顯示調(diào)用。析構(gòu)函數(shù)classPoint{private: intm_nX; intm_nY;public: Point(inta=0,intb=0){m_nX=a;m_nY=b;} voidSetXY(inta,intb){m_nX=a;m_nY=b;} voidPrintXY(){cout<<m_nX<<","<<m_nY;}};對(duì)于一個(gè)類,如果沒有顯示定義析構(gòu)函數(shù),編譯器自動(dòng)產(chǎn)生一個(gè)函數(shù)體為空的析構(gòu)函數(shù)。構(gòu)造函數(shù)析構(gòu)函數(shù)注意點(diǎn)對(duì)于一個(gè)類,如果沒有顯示定義構(gòu)造函數(shù),編譯器自動(dòng)為該類產(chǎn)生一個(gè)構(gòu)造函數(shù)。對(duì)于一個(gè)類,如果沒有顯示定義析構(gòu)函數(shù),編譯器自動(dòng)產(chǎn)生為該類一個(gè)析構(gòu)函數(shù)。一個(gè)設(shè)計(jì)合理的類,一般至少要顯示定義一個(gè)構(gòu)造函數(shù)。至于是否要顯示定義析構(gòu)函數(shù),可根據(jù)需要確定,如果該類的對(duì)象占據(jù)的存儲(chǔ)空間釋放時(shí)不必要做什么清理工作,可以不必定義析構(gòu)函數(shù)。3.3數(shù)據(jù)成員的初始化數(shù)據(jù)成員的初始化在構(gòu)造函數(shù)的函數(shù)體中初始化classPoint{private: intm_nX;intm_nY;public: Point(inta=0,intb=0){m_nX=a;m_nY=b;} voidPrintXY(){cout<<m_nX<<","<<m_nY;}};p1m_nY:

m_nX:1020intmain(){ Pointp1(10,20); p1.PrintXY(); return0;}classCircle{public:

Circle(doublex,doubley,

doubler) {m_dX=x;m_dY=y;m_dR=r;}

doublegetArea(){return3.14*m_dR*m_dR;} doublem_dR;};思考:怎樣對(duì)m_dR賦予初值?Circle(doubler){m_dR=r;}數(shù)據(jù)成員的初始化constdoublem_dR;intmain(){ Circles(10.1); s.m_dr=20.1; return0;}數(shù)據(jù)成員的初始化在構(gòu)造函數(shù)頭部初始化classCircle{public: Circle(doubler):m_dR(r) {} doublegetArea(){return3.14*m_dR*m_dR;} constdoublem_dR;};Circlec1(4.6);Circlec2(5.6);數(shù)據(jù)成員的初始化在構(gòu)造函數(shù)頭部初始化格式:類名::構(gòu)造函數(shù)(參數(shù)表):m1(v1),m2(v2),…{函數(shù)體}初始化列表classPoint{private: intm_nX; intm_nY;public: Point(inta=0,intb=0) {m_nX=a;m_nY=b;} voidSetXY(inta,intb) {m_nX=a;m_nY=b;} voidPrintXY() {cout<<m_nX<<","<<m_nY;}};Point(inta=0,intb=0):m_nX(a),m_nY(b)

{}數(shù)據(jù)成員的初始化classPerson{private: charm_strName[20]; intm_nAge; boolm_nSex;public: Person(): m_strName("XXX"),m_nAge(

0),m_nSex(0) {}};Person():m_nAge(

0),m_nSex(0){strcpy(m_strName,"XXX");}規(guī)則:能在初始化列表中初始化的成員,盡量在初始化列表中初始化。示例編寫一函數(shù);原型為:intinverse(inta);功能是把一個(gè)整數(shù)轉(zhuǎn)化成逆向數(shù)。5348→8435示例5348→8435棧:屬性容量:intm_nSize=10存放棧元素的數(shù)組:intm_Elem[10]棧頂位置:intm_nTop;行為返回棧是否空:m_nTop==0為真返回棧是否滿滿:m_nTop==10(容量)為真出棧、壓棧//stack.h的內(nèi)容constintSIZE=10;classStack{ intm_Elem[SIZE]; intm_nTop;//棧頂位置 constintm_nSize;//容量public: Stack():m_nTop(0),m_nSize(SIZE){} boolIsEmpty(){returnm_nTop==0;}

boolIsFull(){returnm_nTop==m_nSize;}

boolPush(inte); boolPop(int&e);};//stack.cpp的內(nèi)容boolStack::Push(inte){ if(IsFull()){returnfalse;} else { m_Elem[m_nTop]=e; ++m_nTop; returntrue; }}boolStack::Pop(int&e){ if(IsEmpty()){returnfalse;} else { --m_nTop;e=m_Elem[m_nTop]; returntrue; }}intmain(){Stacks;s.push(10);

inta;s.pop(a);return0;}intinverse(inta){ Stacks;//容量為4的棧 intb,c=a; do{ b=c%10; s.Push(b); c=c/10; }while(c!=0); intresult=0;inti=1; while(s.Pop(b)==true) { result=result+b*i; i=i*10; } returnresult;}intmain(){intn;cin>>n;cout<<inverse(n);return0; }348if(s.push(b)==false){return-1;}32108

4312348classStack{ int*m_Elem; intm_nTop; constintm_nSize;public: Stack(intsize):m_nTop(0),m_nSize(size) {m_Elem=newint[size];} ~Stack(){delete[]m_Elem;} boolIsEmpty(){returnm_nTop==0;}

boolIsFull(){returnm_nTop==m_nSize;}

boolPush(inte); boolPop(int&e);};sm_nSize:5

m_Elem:

0X1000Stacks(5);m_nTop:00X1000boolStack::Push(inte){ if(IsFull()){returnfalse;} else { m_Elem[m_nTop]=e; ++m_nTop; returntrue; }}boolStack::Pop(int&e){ if(IsEmpty()){returnfalse;} else { --m_nTop; e=m_Elem[m_nTop]; returntrue; }}3.4拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)在創(chuàng)建對(duì)象時(shí),必須有一個(gè)匹配的構(gòu)造函數(shù)被調(diào)用,如果無匹配的構(gòu)造函數(shù),則報(bào)錯(cuò)。classPoint{private: intm_nX;intm_nY;};Pointp2;Pointp1(10,30);inta=5;intb(a);Pointp3(p1);public:Point(inta=0,intb=0):m_nX(a),m_nY(b){}classPoint{private: intm_nX;intm_nY;public: Point(inta=0,intb=0):m_nX(a),m_nY(b){} Point(constPoint&p) {m_nX=p.m_nX;m_nY=p.m_nY;}};Pointp1(10,30);Pointp2(p1);Pointp3=p1;等價(jià)于Pointp3(

p1);Point(constPoint&p):m_nX(p.m_nX),m_nY(p.m_nX){}拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參是本類對(duì)象的常引用。它的作用是用一個(gè)已經(jīng)存在的對(duì)象初始化一個(gè)新的同類對(duì)象。拷貝構(gòu)造函數(shù)格式:<類名>::<拷貝構(gòu)造函數(shù)名>(const<類名>&<引用名>)特點(diǎn):是一種構(gòu)造函數(shù)。參數(shù)為本類對(duì)象的常引用。類名拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)的調(diào)用:明確表示由另一個(gè)對(duì)象對(duì)要?jiǎng)?chuàng)建的對(duì)象進(jìn)行初始化時(shí)。Pointp2(p1);

Pointp3=p1;Pointp4; p4=p1;//調(diào)用構(gòu)造函數(shù)//不調(diào)用構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)classPoint{private: intm_nX;intm_nY;public: Point(inta=0,intb=0) {m_nX=a;m_nY=b;} voidShow() {cout<<m_nX<<m_nY;}};intmain(){ Pointp1(10,30);

Pointp2(p1);p2.Show();return0;}拷貝構(gòu)造函數(shù)每個(gè)類都必須有一個(gè)拷貝構(gòu)造函數(shù),如果沒有顯式定義拷貝構(gòu)造函數(shù),則編譯系統(tǒng)自動(dòng)生成一個(gè)拷貝構(gòu)造函數(shù),作為公有成員。系統(tǒng)自動(dòng)生成的拷貝構(gòu)造函數(shù)的函數(shù)體不為空,拷貝的策略是逐個(gè)成員依次拷貝。所以對(duì)一些簡(jiǎn)單的類我們沒有必要寫拷貝構(gòu)造函數(shù),系統(tǒng)自動(dòng)生成的拷貝構(gòu)造函數(shù)就可以以達(dá)到我們的目的。(前面的Point類)classArray{private: int*m_pArray; intm_nSize;public: Array(intn):m_nSize(n) { m_pArray=newint[n]; for(inti=0;i<n;++i) {m_pArray[i]=i;} } ~Array() {delete[]m_pArray;}};intmain(){ Arrayp1(4); Arrayp2(p1);

return0;}0X1000p1m_nSize:

m_pArray:p2m_nSize:

m_pArray:03124

0X10004

0X1000拷貝構(gòu)造函數(shù)p1到p2的淺拷貝拷貝構(gòu)造函數(shù)p1到p2的深拷貝拷貝構(gòu)造函數(shù)在系統(tǒng)自動(dòng)生成的拷貝構(gòu)造函數(shù)中,拷貝的策略是逐個(gè)成員依次拷貝。但是,當(dāng)一個(gè)類擁有資源(例如堆內(nèi)存)的時(shí)候,默認(rèn)拷貝構(gòu)造函數(shù)只能進(jìn)行淺拷貝,并不能拷貝資源。解決方法:定義自己的拷貝構(gòu)造函數(shù),不使用默認(rèn)拷貝構(gòu)造函數(shù),使之不但拷貝成員,也拷貝資源。classArray{private: int*m_pArray; intm_nSize;public: Array(intn):m_nSize(n) { m_pArray=newint[n]; for(inti=0;i<n;++i) {m_pArray[i]=i;} } Array(constArray&a):m_nSize(a.m_nSize) { m_pArray=newint[m_nSize]; for(inti=0;i<m_nSize;++i) {m_pArray[i]=a.m_pArray[i];} } ~Array(){delete[]m_pArray;}};intmain(){Arrayp1(4);Arrayp2(p1);return0;}p1m_nSize:

m_pArray:p2m_nSize:

m_pArray:4

0X10004

0X20000X100003120X20000312classStack{ int*m_Elem; intm_nTop; constintm_nSize;

public: Stack(intsize):m_nTop(0),m_nSize(size) {m_Elem=newint[size];} ~Stack(){delete[]m_Elem;} boolIsEmpty(){returnm_nTop==0;}

boolIsFull(){returnm_nTop==m_nSize;}

boolPush(inte); boolPop(int&e);};s1m_nSize:5

m_Elem:

0X1000Stacks1(5);m_nTop:00X1000Stacks2(s1);Stack(constSattic&s);3.5const對(duì)象與const成員const修飾符的用法格式1:普通常量const類型常量名=值;constdoublePI=3.1415;格式2:常引用const類型&引用名=變量名;說明:不能通過常引用修改所引用的對(duì)象。inti=0; constint&refi=i; i++;//

OK refi++;//Error!const修飾符的用法格式4:inta=6,b=7;constint*p=&a; *p=19; a=19; p=&b;格式3:inta=6,b=7;int*constp=&a; *p=19; a=19; p=&b;const修飾符的用法const修飾函數(shù)中的參數(shù) voidfun(constint&x);表示形參x的值在fun函數(shù)中不能被修改voidfun(constint*x);表示不能通過形參x改變x指向的內(nèi)容。const修飾符的用法voidfun(int&x){ ++x;}intmain(){ ints=100; fun(s); cout<<s; return0;}voidfun(constint&x)//錯(cuò)誤const修飾符的用法voidfun(int*x){ ++x; *x=4;}intmain(){ inta[3]={1,3,5}; fun(a

); return0;}voidfun(constint*x)//錯(cuò)誤const修飾符的用法當(dāng)引用作為函數(shù)的形參時(shí),如果在函數(shù)體里面沒有修改形參,最好在形參前面加const修飾。當(dāng)指針作為函數(shù)的形參時(shí),如果在函數(shù)體里面沒有修改指針指向的內(nèi)容,最好在形參前面加const修飾。voidprint(int*a,intn){ for(inti=0;i<n;++i) {cout<<a[i];}}const在類中使用const修飾符const成員函數(shù)(只讀成員函數(shù))const成員函數(shù)不能修改的數(shù)據(jù)成員的值。在類中使用const修飾符const成員函數(shù)(只讀成員函數(shù))//Person.h的內(nèi)容ClassPerson{ intm_nAge;public: voidSetAge(intage) {m_nAge=age;} intGetAge()

{returnm_nAge;}};constintGetAge()const;//Person.cpp的內(nèi)容intPerson::GetAge()const{returnm_nAge;}在類中使用const修飾符const成員函數(shù)(只讀成員函數(shù))當(dāng)一個(gè)類的某一成員函數(shù)肯定不會(huì)改變對(duì)象的數(shù)據(jù)成員值時(shí),最好把該成員函數(shù)定義成const成員函數(shù)。const加在函數(shù)原型后面,是函數(shù)原型的一個(gè)組成部分,因此函數(shù)實(shí)現(xiàn)部分也要帶const。在類中使用const修飾符const成員函數(shù)和同名的非const成員函數(shù)可以重載classM{ intm_nX;public: M(inta=0):m_nX(a){} intF() {++m_nX; return++m_nX; }

intF()const {returnm_nX;}};intmain(){

M

m1(10);cout<<m1.F()

return0;}在類中使用const修飾符const數(shù)據(jù)成員classPoint{ intm_nX;intm_nY;public: Point(intx,inty) :m_nX(x),m_nY(y) {} voidPrintXY()const

{cout<<m_nX<<m_nY;} voidSetX(intx){m_nX=x;} voidSetY(inty){m_nY=y;}};constintmain(){ Pointp1(10,30);p1.SetX(100);p1.SetY(200);

Pointp2(50,70);return0;}在類中使用const修飾符const數(shù)據(jù)成員任何成員函數(shù)都不能修改const數(shù)據(jù)成員的值。如果對(duì)象的某個(gè)屬性值一直保持不變,可以把該屬性抽象為const數(shù)據(jù)成員。人的出生日期。在類中使用const修飾符const對(duì)象const對(duì)象不能被修改,只能訪問const成員函數(shù)classM{ intm_nX;public: M(inta=0):m_nX(a){} voidSet(inta){m_nX=a;} intF() {++m_nX;returnm_nX;}

intF()const {returnm_nX;}voidShow(){cout<<m_nX;}};intmain(){constMm1(2);m1.Set(10);m1.F();Mm2(3);m2.Set(20);m2.F();m1.Show();m2.Show();return0;}××3.6對(duì)象與函數(shù)對(duì)象與函數(shù)對(duì)象作為函數(shù)的形參。classPoint{ intm_nX;intm_nY;public: Point(intx,inty) :m_nX(x),m_nY(y) {}

Point(constPoint&p):m_nX(p.m_nX),m_nY(p.m_nY) {cout<<"copy"<<endl;} voidPrintXY()const {cout<<m_nX<<","<<m_nY<<endl;}

voidSetXY(intx,inty)

{m_nX=x;m_nY=y;}};對(duì)象與函數(shù)voidf(Pointp){ p.SetXY(10,10);}intmain(){ Pointp1(20,20); f(p1); p1.PrintXY(); return0;}

p1m_nX:

m_nY:pm_nX:

m_nY:20

2020

20f()main()運(yùn)行狀態(tài)及返回地址//調(diào)用一次拷貝構(gòu)造函數(shù)10

10對(duì)象與函數(shù)voidf(Point&p){ p.SetXY(10,10);}intmain(){ Pointp1(20,20); f(p1); p1.PrintXY(); return0;}p1m_nX:

m_nY:20

20f()main()運(yùn)行狀態(tài)及返回地址//不調(diào)用拷貝構(gòu)造函數(shù)p10

10對(duì)象與函數(shù)在C++編程中我們一般讓對(duì)象的引用或常引用作為函數(shù)的形參,而不讓對(duì)象本身作為形參。voidf1(Point&p); voidf2(constPoint&P);少用下面形式 voidf3(PointP);對(duì)象與函數(shù)對(duì)象可以作為函數(shù)的返回值Pointf(){ Pointp(10,20); return

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論