怎樣使用類和對象課件_第1頁
怎樣使用類和對象課件_第2頁
怎樣使用類和對象課件_第3頁
怎樣使用類和對象課件_第4頁
怎樣使用類和對象課件_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第3章怎樣使用類和對象第3章怎樣使用類和對象授課內容3.1利用構造函數(shù)對對象進行初始化3.2利用析構函數(shù)進行清理工作3.3調用構造函數(shù)和析構函數(shù)的順序3.4對象數(shù)組3.5對象指針3.6公用數(shù)據(jù)的保護3.7對象的動態(tài)創(chuàng)建和釋放3.8對象的賦值和復制2.9靜態(tài)成員3.10友元3.11類模板授課內容3.1利用構造函數(shù)對對象進行初始化3.1利用構造函數(shù)對對象進行初始化3.1利用構造函數(shù)對對象進行初始化3.1利用構造函數(shù)對對象進行初始化作用構造函數(shù):當一個對象被定義時會自動調用,用來對對象進行初始化。3.1利用構造函數(shù)對對象進行初始化作用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;}};p1m_nY:

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

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

m_nX:13152010classPointp1m_nY:m_nX:intma3.1利用構造函數(shù)對對象進行初始化聲明格式:<類名>(<參數(shù)表>);程序中不能直接調用構造函數(shù),在定義對象時,系統(tǒng)會自動調用構造函數(shù)3.1利用構造函數(shù)對對象進行初始化聲明格式:3.1利用構造函數(shù)對對象進行初始化構造函數(shù)與類同名沒有返回值,原型中也沒有void。3.1利用構造函數(shù)對對象進行初始化構造函數(shù)與類同名3.1利用構造函數(shù)對對象進行初始化構造函數(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)建對象時,必須有可匹配的構造函數(shù)被調用,如果無匹配的構造函數(shù),則報錯。3.1利用構造函數(shù)對對象進行初始化構造函數(shù)可以重載。Poi3.1利用構造函數(shù)對對象進行初始化構造函數(shù)可以帶有默認參數(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);3.1利用構造函數(shù)對對象進行初始化構造函數(shù)可以帶有默認參數(shù)3.1利用構造函數(shù)對對象進行初始化構造函數(shù)是成員函數(shù),函數(shù)體可寫在類體內也可以寫在類體外。classPoint{private: intm_nX; intm_nY;public: Point(inta=0,intb=0); voidSetXY(inta,intb); voidPrintXY(); ~Point(){}};//point.cpp的內容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的內容3.1利用構造函數(shù)對對象進行初始化構造函數(shù)是成員函數(shù),函數(shù)3.1利用構造函數(shù)對對象進行初始化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)為我們自動產生的構造函數(shù),我們看不見它

intmain(){ Pointp; p.PrintXY(); return0;}Point(){}3.1利用構造函數(shù)對對象進行初始化classPoint/3.1利用構造函數(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(){}};intmain(){ Pointp; p.PrintXY(); return0;}3.1利用構造函數(shù)對對象進行初始化classPointi3.1利用構造函數(shù)對對象進行初始化如果一個類你沒有定義構造函數(shù),那么系統(tǒng)會為你定義一個構造函數(shù),該構造函數(shù)的參數(shù)表和函數(shù)體為空;如果你定義了一個構造函數(shù),則系統(tǒng)不會為你定義任何構造函數(shù)。3.1利用構造函數(shù)對對象進行初始化如果一個類你沒有定義構造數(shù)據(jù)成員的初始化在構造函數(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;}數(shù)據(jù)成員的初始化在構造函數(shù)的函數(shù)體中初始化p1m_nY:m數(shù)據(jù)成員的初始化在構造函數(shù)頭部初始化格式:類名::構造函數(shù)(參數(shù)表):m1(v1),m2(v2),…{函數(shù)體}初始化列表數(shù)據(jù)成員的初始化在構造函數(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)

{}classPointPoint(inta=0,i數(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ù)據(jù)成員的初始化classPersonPerson()3.2利用析構函數(shù)進行清理工作3.2利用析構函數(shù)進行清理工作3.2利用析構函數(shù)進行清理工作作用:將要釋放某個對象所占據(jù)的存儲空間之前,該對象的析構函數(shù)會被自動調用,來進行一些清理工作。聲明格式:~類名();3.2利用析構函數(shù)進行清理工作作用: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,15destroydestroyclassPointp1m_nY:m_nX:intma3.2利用析構函數(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:

0X100043.2利用析構函數(shù)進行清理工作classArrayint3.2利用析構函數(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:

0X100043.2利用析構函數(shù)進行清理工作classArrayint3.2利用析構函數(shù)進行清理工作析構函數(shù)與類同名,只是在前面添加了符號~。析構函數(shù)沒有返回值,原型中也沒有void。析構函數(shù)沒有參數(shù),一個類只能有一個析構函數(shù),析構函數(shù)不能被重載析構函數(shù)的函數(shù)體可寫在類體內,也可寫在類體外。將要釋放某個對象所占據(jù)的存儲空間之前,系統(tǒng)自動調用析構函數(shù)。析構函數(shù)也可以被程序顯示調用。3.2利用析構函數(shù)進行清理工作析構函數(shù)與類同名,只是在前面析構函數(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;}};對于一個類,如果沒有顯示定義析構函數(shù),編譯器自動產生一個函數(shù)體為空的析構函數(shù)。析構函數(shù)classPoint3.2利用析構函數(shù)進行清理工作對于一個類,如果沒有顯示定義構造函數(shù),編譯器自動為該類產生一個構造函數(shù)。對于一個類,如果沒有顯示定義析構函數(shù),編譯器自動產生為該類一個析構函數(shù)。一個設計合理的類,一般至少要顯示定義一個構造函數(shù)。至于是否要顯示定義析構函數(shù),可根據(jù)需要確定,如果該類的對象占據(jù)的存儲空間釋放時不必要做什么清理工作,可以不必定義析構函數(shù)。3.2利用析構函數(shù)進行清理工作對于一個類,如果沒有顯示定義3.8對象的賦值與復制3.8對象的賦值與復制拷貝構造函數(shù)在創(chuàng)建對象時,必須有一個匹配的構造函數(shù)被調用,如果無匹配的構造函數(shù),則報錯。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){}拷貝構造函數(shù)在創(chuàng)建對象時,必須有一個匹配的構造函數(shù)被調用,如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;等價于Pointp3(

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

Pointp3=p1;Pointp4; p4=p1;//調用構造函數(shù)//不調用構造函數(shù)拷貝構造函數(shù)拷貝構造函數(shù)的調用://調用構造函數(shù)//不調用構拷貝構造函數(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;}拷貝構造函數(shù)classPointintmain()拷貝構造函數(shù)每個類都必須有一個拷貝構造函數(shù),如果沒有顯式定義拷貝構造函數(shù),則編譯系統(tǒng)自動生成一個拷貝構造函數(shù),作為公有成員。系統(tǒng)自動生成的拷貝構造函數(shù)的函數(shù)體不為空,拷貝的策略是逐個成員依次拷貝。所以對一些簡單的類我們沒有必要寫拷貝構造函數(shù),系統(tǒng)自動生成的拷貝構造函數(shù)就可以以達到我們的目的。(前面的Point類)拷貝構造函數(shù)每個類都必須有一個拷貝構造函數(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() {delete[]m_pArray;}};intmain(){ Arrayp1(4); Arrayp2(p1);

return0;}0X1000p1m_nSize:

m_pArray:p2m_nSize:

m_pArray:03124

0X10004

0X1000classArrayintmain()0X1000p1m拷貝構造函數(shù)p1到p2的淺拷貝拷貝構造函數(shù)p1到p2的淺拷貝拷貝構造函數(shù)p1到p2的深拷貝拷貝構造函數(shù)p1到p2的深拷貝拷貝構造函數(shù)在系統(tǒng)自動生成的拷貝構造函數(shù)中,拷貝的策略是逐個成員依次拷貝。但是,當一個類擁有資源(例如堆內存)的時候,默認拷貝構造函數(shù)只能進行淺拷貝,并不能拷貝資源。解決方法:定義自己的拷貝構造函數(shù),不使用默認拷貝構造函數(shù),使之不但拷貝成員,也拷貝資源??截悩嬙旌瘮?shù)在系統(tǒng)自動生成的拷貝構造函數(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

0X20000X100003120X20000312classArrayintmain()p1m_nSizeclassStack{ 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);classStacks1m_nSize:5m_Elem:3.9靜態(tài)成員3.9靜態(tài)成員靜態(tài)數(shù)據(jù)成員//test.h的內容classTest{public: inta; intb; Test(intx,inty);};//test.cpp的內容#include"test.h"Test::Test(intx,inty) :a(x),b(y){}//main.cpp的內容#include"test.h"intmain(){Testt1(1,2),t2(3,4);cout<<t1.a<<t2.a;cout<<t1.b<<t2.b;return0;}staticintb;Test(intx);Test::Test(intx) :a(x){}

b(10)t1a(1)t2a(3)Testt1(1),t2(3);cout<<Test::b;intTest::b=10;//必需靜態(tài)數(shù)據(jù)成員//test.h的內容//test.cpp的內容靜態(tài)數(shù)據(jù)成員使用靜態(tài)數(shù)據(jù)成員可以實現(xiàn)多個對象之間的數(shù)據(jù)共享。使用靜態(tài)數(shù)據(jù)成員可以節(jié)省內存,對多個對象來說,靜態(tài)數(shù)據(jù)成員只存儲一處,供所有對象使用。使用靜態(tài)數(shù)據(jù)成員還不會破壞封裝性的原則,保證了安全性。如果靜態(tài)數(shù)據(jù)成員是公有的,在類外面可以通過類名::靜態(tài)數(shù)據(jù)成員名直接訪問。靜態(tài)數(shù)據(jù)成員的值對每個對象都是一樣的,但它的值是可以更新的。靜態(tài)數(shù)據(jù)成員使用靜態(tài)數(shù)據(jù)成員可以實現(xiàn)多個對象之間的數(shù)據(jù)共享。靜態(tài)數(shù)據(jù)成員classAcount//帳戶{ doubleamount;};ClassCurrentAcount:publicAcount//活期{ staticdoubleinterest;};ClassTimeAcount:publicAcount//定期{ staticdoubleinterest;};doubleCurrentAcount::interest=0.3;doubleTimeAcount::interest=0.7;靜態(tài)數(shù)據(jù)成員classAcount//帳戶classMyclass{ inta,b; staticintsum;public: Myclass(intx,inty); voidGet();};intMyclass::Sum=0;Myclass::Myclass(intx,inty):a(x),b(y){sum+=a+b;}voidMyclass::Get(){cout<<a<<b<<sum<<endl;}intmain(){MyclassM(1,2);MyclassN(7,8); M.Get();N.Get();return0;}classMyclass靜態(tài)成員函數(shù)在成員函數(shù)原形前面加上static,就為靜態(tài)成員函數(shù)。非靜態(tài)成員函數(shù)和靜態(tài)成員函數(shù)的區(qū)別:非靜態(tài)成員函數(shù)里有this指針,既可以訪問非靜態(tài)數(shù)據(jù)成員,又可以訪問靜態(tài)數(shù)據(jù)成員。靜態(tài)成員函數(shù)里無this指針,只可以訪問靜態(tài)數(shù)據(jù)成員。靜態(tài)成員函數(shù)在成員函數(shù)原形前面加上static,就為靜態(tài)成員靜態(tài)成員函數(shù)//test.h的內容classTest{prvate: inta staticintb;public: Test(intx);

};//main.cpp的內容intmain(){Testt1(1);cout<<t1.a;//錯

cout<<t1.b;//錯

return0;}//test.cpp的內容#include"test.h"intTest::b=10;//必需Test::Test(intx):a(x){}intGetA();staticintGetB();intTest::GetA(){returna;}cout<<t1.GetA();cout<<t1.GetB();cout<<Test::GetB();cout<<Test::GetA();intTest::GetB(){returnb;}returna+b;}returna+b;}錯誤靜態(tài)成員函數(shù)//test.h的內容//main.cpp的內容靜態(tài)成員函數(shù)當一個類里有靜態(tài)數(shù)據(jù)成員時,一般會定義相應的訪問該靜態(tài)數(shù)據(jù)成員的靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)當一個類里有靜態(tài)數(shù)據(jù)成員時,一般會定義相應的訪問靜態(tài)成員靜態(tài)數(shù)據(jù)成員對于非靜態(tài)數(shù)據(jù)成員,類的每個對象都擁有自己的拷貝,而對于靜態(tài)數(shù)據(jù)成員,整個類只有一個拷貝,該拷貝為類的所有對象共享。靜態(tài)數(shù)據(jù)成員的唯一性:獨立于類的任何對象而存在的惟一實例靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)沒有this指針,靜態(tài)成員函數(shù)只能訪問靜態(tài)數(shù)據(jù)成員。當一個類有靜態(tài)數(shù)據(jù)成員時,一般會定義相應的訪問該靜態(tài)數(shù)據(jù)成員的靜態(tài)成員函數(shù)靜態(tài)成員靜態(tài)數(shù)據(jù)成員靜態(tài)成員為一個類設置一個計數(shù)器,用以記錄當前已經(jīng)存在的該類的對象個數(shù)。靜態(tài)成員為一個類設置一個計數(shù)器,用以記錄當前已經(jīng)存在的該類的靜態(tài)成員classM{ inta; staticintcount;public: M(intx):a(x) {++count;} M(constM&m):a(m.a) {++count;} ~M(){--count;} staticintGetCount()

{returncount;

}};intM::count=0;intmain(){Mm1(1),m2(m1);M*m3=newM(3);cout<<M::GetCount();deletem3;cout<<M::GetCount();return0;}靜態(tài)成員intM::count=0;靜態(tài)成員單件模式意圖:保證一個類僅有一個實例,并提供一個訪問該實例的全局訪問點?!对O計模式——可復用面向對象軟件的基礎》靜態(tài)成員單件模式《設計模式——可復用面向對象軟件的基礎》靜態(tài)成員classM{ inta;public: M(intx):a(x) {}};intmain(){Mm1(1),m2(2);return0;}classM{

inta; M(intx):a(x) {}public:};M*M::p=0;staticM*p;staticM*GetInstance(){if(p==0){p=newM(3);}returnp;}M*s1=M::GetInstance();M*s2=M::GetInstance();return0;靜態(tài)成員classMintmain()classMM*3.3調用構造函數(shù)和析構函數(shù)的順序3.3調用構造函數(shù)和析構函數(shù)的順序調用構造函數(shù)和析構函數(shù)的順序在一般情況下,調用析構函數(shù)的次序與調用構造函數(shù)的次序恰好相反:最先調用構造函數(shù)的對象,最后調用析構函數(shù)。而最后調用構造函數(shù)的對象,最先調用析構函數(shù)??珊営洖椋合葮嬙斓暮笪鰳嫞髽嬙斓南任鰳?,它相當一個棧,后進先出。調用構造函數(shù)和析構函數(shù)的順序在一般情況下,調用析構函數(shù)的次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"<<m_nX<<","<<m_nY<<endl;}};intmain(){Pointp1(10,20);Pointp2(13,15);

p1.SetXY(20,10);p2.PrintXY();return0;}intmain()3.4對象數(shù)組3.4對象數(shù)組對象數(shù)組可以定義對象的數(shù)組。定義一個長度為n的對象數(shù)組會創(chuàng)建n個對象,這n個對象占據(jù)連續(xù)的存儲空間。定義一個長度為n的對象數(shù)組會調用n次構造函數(shù)。對象數(shù)組的使用方式和普通數(shù)組一樣。對象數(shù)組可以定義對象的數(shù)組。classPoint{ intm_nX;intm_nY;public: Point():m_nX(0),m_nY(0) {} Point(intx,inty=0):m_nX(x),m_nY(y) {}};Pointa1[5];Pointa2[2]={Point(10,20),Point(30,40)

};Pointa2[3]={Point(10,20)};Pointa2[3]={Point(10),Point(30),Point(40)};Point*p=newPoint[4];//創(chuàng)建5個對象,調用5次默認構造函數(shù)classPoint//創(chuàng)建5個對象,調用5次默認構造函數(shù)3.5對象與指針3.5對象與指針對象與指針創(chuàng)建一對象后,對象要占據(jù)一定的存儲空間,所以對象也有地址,對象的地址就是對象所占據(jù)存儲空間的首地址??梢远x指針變量來存儲對象的地址。對象與指針創(chuàng)建一對象后,對象要占據(jù)一定的存儲空間,所以對象也對象與指針classPoint{ intm_nX;intm_nY;public: Point(intx,inty) :m_nX(x),m_nY(y) {}

voidPrintXY()const {cout<<m_nX<<","<<m_nY<<endl;}

voidSetXY(intx,inty)

{m_nX=x;m_nY=y;}};對象與指針classPoint對象與指針intmain(){ Pointp(10,20); p.PrintXY(); Point*ptr=&p; ptr->PrinXY(); return0; }對象與指針intmain()對象與指針可以用new運算符在堆空間中創(chuàng)建對象intmain(){ Pointp(10,20); p.PrintXY(); Point*ptr=newPoint(20,40); ptr->PrinXY(); deleteptr; return0; }Point*ptr=newPoint;//編譯錯誤對象與指針可以用new運算符在堆空間中創(chuàng)建對象Point*對象與指針可以讓對象的地址作為函數(shù)的參數(shù)voidf(Point*p){ p->SetXY(10,10);}intmain(){ Pointp1(20,20); f(&p1); p1.PrintXY(); return0;}對象與指針可以讓對象的地址作為函數(shù)的參數(shù)對象與指針this指針每個非static成員函數(shù)都被包含一個this指針,指向調用這個成員函數(shù)的對象。classX{ inta;public: voidset(intb){a=b;}};Xx1;x1.set(3);Xx2;x2.set(4);{this->a=b;}對象與指針this指針{this->a=b;}對象與指針雙向鏈表classNode{ intvalue; Node*pre; Node*suc;public: voidappend(Node*p) {p->suc=suc; p->pre=this; suc->pre=p; suc=p;}};^476^9p1p2p2->append(p1);對象與指針雙向鏈表^476^9p1p2p2->append(3.6const對象與const成員3.6const對象與const成員const修飾符的用法格式1:修飾普通常量const類型常量名=值;constdoublePI=3.1415;格式2:修飾引用const類型&引用名=變量名;說明:不能通過常引用修改所引用的對象。inti=0; constint&refi=i; i++;//

OK refi++;//Error!const修飾符的用法格式1:修飾普通常量const修飾符的用法格式3:

修飾指針變量,放在類型前面const類型*指針變量;inta=6,b=7;constint*p=&a //表示不能通過p改變p指向的內存的內容*p=19a=19; p=&b;

//錯誤//正確//正確const修飾符的用法格式3:修飾指針變量,放在類型前面/const修飾符的用法格式4:

修飾指針變量,放在指針變量前面類型*const指針變量;inta=6,b=7;int*constp=&a //表明指針變量p是一常變量*p=19a=19; p=&b;

//正確//正確//錯誤const修飾符的用法格式4:修飾指針變量,放在指針變量前const修飾符的用法const修飾函數(shù)中的參數(shù) voidfun(constint&x);表示形參x的值在fun函數(shù)中不能被修改voidfun(constint*x);表示不能通過形參x改變x指向的內容。const修飾符的用法const修飾函數(shù)中的參數(shù)const修飾符的用法voidfun(int&x){ ++x;}intmain(){ ints=100; fun(s); cout<<s; return0;}voidfun(constint&x)//錯誤const修飾符的用法voidfun(int&x)vconst修飾符的用法voidfun(int*x){ ++x; *x=4;}intmain(){ inta[3]={1,3,5}; fun(a

); return0;}voidfun(constint*x)//錯誤const修飾符的用法voidfun(int*x)vconst修飾符的用法當引用作為函數(shù)的形參時,如果在函數(shù)體里面沒有修改形參,最好在形參前面加const修飾。當指針作為函數(shù)的形參時,如果在函數(shù)體里面沒有修改指針指向的內容,最好在形參前面加const修飾。voidprint(int*a,intn){ for(inti=0;i<n;++i) {cout<<a[i];}}constconst修飾符的用法當引用作為函數(shù)的形參時,如果在函數(shù)體里在類中使用const修飾符const成員函數(shù)(只讀成員函數(shù))const成員函數(shù)不能

溫馨提示

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

評論

0/150

提交評論