![第8講子對(duì)象共用數(shù)據(jù)的保護(hù)_第1頁](http://file4.renrendoc.com/view/3a7f2549d0d801fdd289496ed8049164/3a7f2549d0d801fdd289496ed80491641.gif)
![第8講子對(duì)象共用數(shù)據(jù)的保護(hù)_第2頁](http://file4.renrendoc.com/view/3a7f2549d0d801fdd289496ed8049164/3a7f2549d0d801fdd289496ed80491642.gif)
![第8講子對(duì)象共用數(shù)據(jù)的保護(hù)_第3頁](http://file4.renrendoc.com/view/3a7f2549d0d801fdd289496ed8049164/3a7f2549d0d801fdd289496ed80491643.gif)
![第8講子對(duì)象共用數(shù)據(jù)的保護(hù)_第4頁](http://file4.renrendoc.com/view/3a7f2549d0d801fdd289496ed8049164/3a7f2549d0d801fdd289496ed80491644.gif)
![第8講子對(duì)象共用數(shù)據(jù)的保護(hù)_第5頁](http://file4.renrendoc.com/view/3a7f2549d0d801fdd289496ed8049164/3a7f2549d0d801fdd289496ed80491645.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
子對(duì)象的初始化、常數(shù)據(jù)成員、常指針、常引用、常成員函數(shù)C++程序設(shè)計(jì)第8講子對(duì)象、共用數(shù)據(jù)的保護(hù)在程序運(yùn)行過程中,根據(jù)需要可以隨時(shí)建立或刪除的對(duì)象;堆對(duì)象創(chuàng)建在一些空閑的存儲(chǔ)單元中,這些存儲(chǔ)單元稱為堆。1、堆對(duì)象堆內(nèi)存:C++支持動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),提供了指針這一特殊形式的數(shù)據(jù)類型,并在內(nèi)存中開辟了稱為堆的動(dòng)態(tài)存儲(chǔ)區(qū)。堆是程序共享的空間。棧內(nèi)存:每個(gè)函數(shù)都有自己的棧,棧用來在函數(shù)之間傳遞參數(shù)。函數(shù)中定義的變量保存在棧中,每個(gè)C++對(duì)象的數(shù)據(jù)成員也保存在棧中。??臻g不需要顯式的分配和釋放。復(fù)習(xí)運(yùn)算符new、delete復(fù)習(xí)運(yùn)算符new、delete(1)new運(yùn)算符動(dòng)態(tài)創(chuàng)建對(duì)象;new<類型說明符>(<初始值列表>)new運(yùn)算符返回一個(gè)與new所分配對(duì)象類型相匹配的指針;如果new運(yùn)算符不能分配到所需要的內(nèi)存,將返回0,這時(shí)為空指針;使用new運(yùn)算符創(chuàng)建對(duì)象時(shí),它可以根據(jù)其參數(shù)來選擇適當(dāng)?shù)臉?gòu)造函數(shù);在C++中的全局對(duì)象和局部對(duì)象的生存期是嚴(yán)格定義的,程序員不能以任何方式改變它們的生存期,但是可以創(chuàng)建一些生存期能被程序員控制的對(duì)象,它們的分配和釋放可以根據(jù)程序運(yùn)行中的操作來決定,可以動(dòng)態(tài)分配和釋放對(duì)象。new創(chuàng)建數(shù)組:(需要給出數(shù)組的結(jié)構(gòu)說明)new<類型名>[<算術(shù)表達(dá)式>]使用new創(chuàng)建對(duì)象數(shù)組或一般數(shù)組時(shí),不能為該數(shù)組指定初始值,其初始值為缺省值;例如:A*ptr;ptr=newA[5];使用new[]創(chuàng)建對(duì)象數(shù)組時(shí),類中必須說明缺省構(gòu)造函數(shù);功能:刪除用new創(chuàng)建的對(duì)象或一般類型的指針;delete<指針名>刪除對(duì)象數(shù)組delete[]<指針名>(2)delete運(yùn)算符例如:冒泡法排序#include<iostream.h>classPaixu{public: Paixu(); Paixu(intn); voidshuru(); voidmaopao(); voiddisp(); ~Paixu();private: intnumb; float*p;};Paixu::Paixu(){numb=0;p=NULL;}Paixu::Paixu(intn){numb=n;p=newfloat[n];}Paixu::~Paixu(){numb=0;delete[]p;}voidPaixu::shuru(){if(numb==0&&p==NULL){cout<<"請(qǐng)輸入數(shù)組元素的個(gè)數(shù):";cin>>numb;p=newfloat[numb];}for(inti=0;i<numb;i++) cin>>p[i];}voidPaixu::maopao(){inti,j;floatt;for(i=0;i<numb-1;i++)for(j=0;j<(numb-1)-i;j++) if(p[j]>p[j+1]) {t=p[j];p[j]=p[j+1];p[j+1]=t;}}voidPaixu::disp(){inti;for(i=0;i<numb;i++) cout<<p[i]<<"";cout<<endl;}intmain(){ Paixushuzu;shuzu.shuru(); shuzu.maopao(); shuzu.disp(); return0;}復(fù)習(xí)數(shù)據(jù)類型數(shù)據(jù)類型
——布爾型數(shù)據(jù)布爾型變量的說明:
例:boolflag;布爾型數(shù)據(jù)的取值:
只有false和true兩個(gè)值bool型數(shù)據(jù)占據(jù)1字節(jié)內(nèi)存。string是一種自定義的類型,可以方便地執(zhí)行C-串所不能直接執(zhí)行的一切操作。它處理空間占用問題是自動(dòng)的,需要多少,用多少。例如:#include<iostream.h>#include<string.h>intmain(){stringstr1(“one”,str2(“tow”);cout<<“交換前的串:\nstr1”<<str1<<“str2”<<str2;str1.swap(str2);cout<<“交換后的串:\nstr1”<<str1<<“str2”<<str2<<endl;Return0;}再?gòu)?qiáng)調(diào)定義類時(shí)的注意事項(xiàng)1、類中的數(shù)據(jù)成員的類型可以是任意的;包含整型、浮點(diǎn)型、字符型、數(shù)組、指針和引用等;2、另一個(gè)類的對(duì)象(子對(duì)象),可以作該類的成員;自身類的對(duì)象不可以作該類的成員;一、子對(duì)象classN;classM{public:…...private:Nn;M*s;};classN{public:voidf(Mm);……};提前說明類N3、自身類的指針或引用,可以作該類的成員;4、當(dāng)另一個(gè)類的對(duì)象作為該類的成員時(shí),如果另一個(gè)類的定義在后,需要提前說明;n是N類的對(duì)象m是M類的對(duì)象classNode{public: Studentstud; //節(jié)點(diǎn)數(shù)據(jù)信息(INFO) stringsName; //節(jié)點(diǎn)標(biāo)示名稱 Node*NEXT; //指向下一節(jié)點(diǎn)的節(jié)點(diǎn)指針(NEXT) Node(stringsName,Node*NEXT=NULL):stud(sName) { this->sName=sName; this->NEXT=NEXT; } Node(stringsName,stringsAddree,stringsPhone,stringsMobile,stringsEmail):stud(sName,sAddree,sPhone,sMobile,sEmail) { //空語句體,用來從文件讀數(shù)據(jù)信息 }};classList //定義一個(gè)List類{private: Node* Start; //表頭指針,固定在表頭 Node* Curr; //當(dāng)前遍歷位置指針 Node* Prev; //當(dāng)前位置的前節(jié)點(diǎn)指針 Node* End; //表尾指針,固定在表尾 int iPosition; //當(dāng)前節(jié)點(diǎn)在表中的位置序號(hào)public: List() //構(gòu)造函數(shù) { Start=Curr=Prev=End=NULL; iPosition=1; }一、子對(duì)象子對(duì)象即對(duì)象成員;當(dāng)類中出現(xiàn)了子對(duì)象(對(duì)象成員)時(shí),該類的構(gòu)造函數(shù)要包含對(duì)子對(duì)象的初始化,通常采用成員初始化列表的方法來初始化子對(duì)象;子對(duì)象:當(dāng)一個(gè)類的成員是另一個(gè)類的對(duì)象時(shí),該對(duì)象就為子對(duì)象;子對(duì)象(續(xù))例:分析下列程序的輸出結(jié)果。#include<iostream.h>classA{public:A(inti,intj){a1=i;a2=j;}voidPrint(){cout<<a1<<","<<a2<<endl;}private:inta1,a2;};classB{private:
Aa;intb;子對(duì)象a子對(duì)象(續(xù))public:B(inti,intj,intk):a(i,j),b(k){}
voidPrint();};voidB::Print(){
a.Print();cout<<b<<endl;}voidmain(){Bb(6,7,8);b.Print();}對(duì)子對(duì)象成員函數(shù)的調(diào)用輸出:6,78成員初始化列表a是A類對(duì)象,是B類的子對(duì)象子對(duì)象(續(xù))例:分析下列程序的輸出結(jié)果。//part.hclassPart{public:Part();Part(inti);~Part();voidPrint();private:
intval;};子對(duì)象(續(xù))//part.cpp#include<iostream.h>#include"part.h"Part::Part(){val=0;cout<<"DefaultConstructorofPart."<<endl;}Part::Part(inti){val=i;cout<<"ConstructorofPart"<<val<<endl;}Part::~Part(){子對(duì)象(續(xù))
cout<<"DestructorofPart"<<val<<endl;}voidPart::Print(){cout<<val<<endl;}//whole.h#include"part.h"classWhole{public:Whole();子對(duì)象(續(xù))
Whole(inti,intj,intk);~Whole();voidPrint();private:
Partone;Parttwo;
intdate;};//whole.cpp#include<iostream.h>#include"whole.h"Whole::Whole(){子對(duì)象one、two子對(duì)象(續(xù))
date=0;cout<<"DefaultconstructorofWhole."<<endl;}Whole::Whole(inti,intj,intk):two(i),one(j){
date=k;cout<<"ConstructorofWhole."<<endl;}Whole::~Whole(){cout<<"DestructorofWhole."<<endl;}voidWhole::Print(){
one.Print();two.Print();成員初始化列表構(gòu)造函數(shù)體子對(duì)象(續(xù))
cout<<date<<endl;}//ex613.cpp#include"whole.h"voidmain(){WholeanObject(5,6,10);anObject.Print();}輸出:ConstructorofPart6ConstructorofPart5ConstructorofWhole.6510DestructorofWhole.DestructorofPart5DestructorofPart6子對(duì)象(續(xù))
#include"whole.h"voidmain(){WholeanObject;anObject.Print();}輸出:DefaultconstructorofPart.DefaultconstructorofPart.DefaultconstructorofWhole.000DestructorofWhole.DestructorofPart0DestructorofPart0子對(duì)象(續(xù))子對(duì)象必須在成員初始化列表中初始化;說明:建立一個(gè)對(duì)象時(shí),它的所有子對(duì)象一起建立;先執(zhí)行子對(duì)象構(gòu)造函數(shù),再執(zhí)行對(duì)象的構(gòu)造函數(shù)體;析構(gòu)函數(shù)的執(zhí)行順序與構(gòu)造函數(shù)的執(zhí)行順序嚴(yán)格相反;構(gòu)造函數(shù)的調(diào)用順序僅與子對(duì)象在類中聲明的順序有關(guān),而與成員初始化列表中給出的對(duì)構(gòu)造函數(shù)的調(diào)用順序無關(guān);構(gòu)造函數(shù)的成員初始化列表中未給出對(duì)子對(duì)象的調(diào)用,則表示使用子對(duì)象的缺省構(gòu)造函數(shù);二、(9.6)共用數(shù)據(jù)的保護(hù)程序中有些數(shù)據(jù)是共享的,例如實(shí)參與形參,變量與其引用,數(shù)據(jù)及其指針等。有時(shí)在無意之中的誤操作會(huì)改變有關(guān)數(shù)據(jù),因此有時(shí)需要對(duì)數(shù)據(jù)進(jìn)行保護(hù),這時(shí)可以使用const?;仡櫼话愠A浚ê?jiǎn)單類型的常量)
<類型說明符>const<常量名>或const
<類型說明符><常量名>intconstx=2;或constintx=2;intconsta[3]={1,2,3};
或
constinta[3]={1,2,3};數(shù)組元素的值是常量,不能更新;(一)常對(duì)象常對(duì)象希望數(shù)據(jù)成員不被改變的對(duì)象,可以聲明為常對(duì)象<類名>const<對(duì)象名>classA{public:A(inti,intj){x=i;y=j;}private:intx,y;};constAa1(3,4);或A
const
a1(3,4);常對(duì)象a1注意:常對(duì)象中的數(shù)據(jù)成員為常變量且必須有初值。對(duì)象a1中的所有數(shù)據(jù)成員都不能被修改??梢詫?duì)象的成員聲明為const,包括常數(shù)據(jù)成員和常成員函數(shù)。常數(shù)據(jù)成員的作用和用法與一般常變量相似,用關(guān)鍵字const來聲明常數(shù)據(jù)成員。常數(shù)據(jù)成員的值是不能改變的。1、常數(shù)據(jù)成員常數(shù)據(jù)成員只能通過成員初始化列表的方法進(jìn)行初始化;常數(shù)據(jù)成員不能被賦值。二、常對(duì)象成員注意:
例:分析下列程序的輸出結(jié)果。#include<iostream>usingnamespacestd;classA{public:A(inti);voidPrint();private:
constinta;staticconstintb;constint&r;
intc;};constintA::b=10;A::A(inti):a(i),r(a){c=8;}私有成員,常引用r私有成員,常量a私有常靜態(tài)數(shù)據(jù)成員b成員初始化列表,常成員(除常靜態(tài)成員外)在此初始化私有常靜態(tài)數(shù)據(jù)成員b初始化voidA::Print(){cout<<a<<":"<<b<<":"<<r<<":"<<c<<endl;}intmain(){Aa1(100),a2(0);a1.Print();a2.Print();return0;}輸出100:10:100:80:10:02、常成員函數(shù)使用const關(guān)鍵字進(jìn)行說明的成員函數(shù);<類型說明符><函數(shù)名>(<參數(shù)表>)const;const是函數(shù)類型的一個(gè)組成部分,在函數(shù)實(shí)現(xiàn)部分必須帶有const關(guān)鍵字;說明:只有常成員函數(shù)才能操作常對(duì)象;表成員函數(shù)與對(duì)象之間的操作關(guān)系常成員函數(shù)(續(xù))例:分析下列程序是否正確。#include<iostream.h>classM{public:M(intx,inty){X=x;Y=y;}
voidMove(intx,inty){X=x;Y=y;}
voidPrint()const{cout<<X<<","<<Y<<endl;}private:intX,Y;};一般成員函數(shù)常成員函數(shù)常成員函數(shù)(續(xù))voidmain(){
constMm1(1,2);m1.Move(3,3);m1.Print();Mm2(3,4);m2.Move(3,3);m2.Print();}常對(duì)象m1一般對(duì)象m2錯(cuò)誤,一般成員函數(shù)不能操作常對(duì)象正確,常成員函數(shù)可以操作常對(duì)象常成員函數(shù)(續(xù))例:分析下列程序的輸出結(jié)果。#include<iostream.h>classR{public:R(intr1,intr2){R1=r1;R2=r2;}voidPrint(){cout<<R1<<":"<<R2<<endl;}voidPrint()const{cout<<R1<<";"<<R2<<endl;}private:intR1,R2;};voidmain(){
Ra(5,4);常成員函數(shù)(續(xù))
a.Print();
constRb(20,52);b.Print();}輸出
5:420;52對(duì)重載條件的補(bǔ)充:voidPrint();voidPrint()const;可重載;常對(duì)象調(diào)用常成員函數(shù),一般對(duì)象調(diào)用一般成員函數(shù)成員函數(shù)引用數(shù)據(jù)成員的操作關(guān)系數(shù)據(jù)成員非const成員函數(shù)const成員函數(shù)非const數(shù)據(jù)成員可以使用,也可以改變值可以使用,但不可以改變值const數(shù)據(jù)成員可以使用,但不可以改變值可以使用,但不可以改變值const對(duì)象的數(shù)據(jù)成員不允許使用和改變值可以使用,但不可以改變值三、常指針和常引用
1、常指針char*constptr1=strptr1;ptr1是一個(gè)常量指針;ptr1=strptr2;*ptr1="m";ptr1不可以更新ptr1所指向的變量可以更新;注意const的位置constchar*ptr2=strptr1;ptr2是一個(gè)指向字符常量的指針;ptr2=strptr2;*ptr2="m";ptr2可以更新ptr2所指向的字符串不可以更新;錯(cuò)誤正確正確錯(cuò)誤(1)指向?qū)ο蟮某V羔樁x指向?qū)ο蟮某V羔樀男问剑侯惷?const指針變量名=對(duì)象地址;例如:Pointt1;Point*constptr1;ptr1=&t1;錯(cuò),常指針不能被賦值常指針往往作為函數(shù)的形參,目的是不允許在函數(shù)執(zhí)行過程中改變指針變量的值,使其始終指向原來的對(duì)象。(2)指向常對(duì)象的指針變量定義指向常對(duì)象的指針變量的形式:const類名*指針變量名;說明:a、如果一個(gè)變量已被聲明為常量,只能用指向常變量的指針變量指向它,而不能用一般的指針去指向它。例如:constcharc[]=“Boy”,constchar*p1;p1=c;char*p2=c;錯(cuò),p2不是指向常變量的指針例如:constPointp1(10,12);constPoint*p;p=&p1;Point*p2;p2=&p1;
錯(cuò)b、指向常變量的指針變量除了可以指向常變量外,還可以指向未被聲明為const的變量。此時(shí)不能通過此指針變量改變?cè)撟兞康闹?。例如:charc1=‘a(chǎn)’;constchar*p;p=&c1;*p=‘b’;c1=‘b’;錯(cuò),不能通過p改變變量c1的值例如:設(shè)Point類的數(shù)據(jù)成員x訪問權(quán)限是公有的Pointp1(10,12);constPoint*p=&p1;p1.x=18;(*p).x=18;
錯(cuò)c、如果函數(shù)的形參是指向非const型變量的指針,實(shí)參只能用指向非const變量的指針,而不能用指向const變量的指針,這樣,可以在執(zhí)行函數(shù)的過程中可以改變形參指針變量所指向的變量(實(shí)參指針變量所指向的變量)的值。如果函數(shù)的形參是指向const型變量的指針,在執(zhí)行函數(shù)的過程中不能改變指針變量所指向的變量的值。因此允許實(shí)參是指向const變量的指針,或指向非const變量的指針。例如:constcharstr[]=“boy”;voidfun(char*ptr);fun(str);Str是const型數(shù)組函數(shù)fun的形參是指向非const型變量的指針調(diào)用fun函數(shù),實(shí)參是const變量的地址,因此錯(cuò)。例如:voidfun(constPoint*p);Pointp1(10,12);fun(&p1);指向常對(duì)象的指針最常用于函數(shù)的形參,目的是保護(hù)形參指針?biāo)傅膶?duì)象,使它在函數(shù)執(zhí)行過程中不被修改。形參實(shí)參合法否改變指針?biāo)傅淖兞康闹抵赶蚍莄onst型變量的指針非const變量的地址合法改變指針?biāo)赶虻淖兞康闹抵赶蚍莄onst型變量的指針const變量的地址非法/指向const型變量的指針const變量的地址合法不可以指向const型變量的指針非const變量的地址合法不可以2、常引用(不能通過引用,更新被引用的對(duì)象)const<類型說明符>&<引用名>doublex=1.2;constdouble&v=x;則:v=12.3錯(cuò)誤。3、常指針與常引用的作用
使用常參數(shù)表明該函數(shù)不會(huì)更新某個(gè)參數(shù)所指向或所引用的對(duì)象,并使該函數(shù)具有更大的適應(yīng)性;例:分析下列程序的輸出結(jié)果。#include<iostream.h>constintN=6;voidprint(constint*p,intn);voidmain(){intarray[N];for(inti=0;i<N;i++)cin>>array[i];
print(array,N);}voidprint(constint*p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 酒店餐飲部年終總結(jié)
- 助理個(gè)人工作計(jì)劃書
- 天然氣施工合作協(xié)議
- 小產(chǎn)權(quán)房贈(zèng)與協(xié)議書范本
- 餐飲公司股東出資協(xié)議書范本
- 小學(xué)英語聽評(píng)課記錄表格
- 礦山開發(fā)爆破方案
- 江蘇省連云港市七年級(jí)地理上冊(cè) 1.2 地球的運(yùn)動(dòng)說課稿 新人教版
- 鐵路道口欄門施工方案
- 教育研究之路
- 健康管理-理論知識(shí)復(fù)習(xí)測(cè)試卷含答案
- 成人腦室外引流護(hù)理-中華護(hù)理學(xué)會(huì)團(tuán)體 標(biāo)準(zhǔn)
- 崩漏?。ó惓W訉m出血)中西醫(yī)診療方案
- JGJ106-建筑基樁檢測(cè)技術(shù)規(guī)范
- 挪威云杉葉提取物在油性皮膚護(hù)理中的應(yīng)用研究
- 京東快遞工作合同模板
- 2024年內(nèi)蒙古政府采購(gòu)云平臺(tái)題庫
- 山東德州市寧津縣2023-2024學(xué)年五年級(jí)下學(xué)期期末考試語文試題
- 安全生產(chǎn)專項(xiàng)整治三年行動(dòng)全套臺(tái)賬、表格
- 高技能公共實(shí)訓(xùn)基地建設(shè)方案
- 市第一人民醫(yī)院“十四五”發(fā)展規(guī)劃(2020-2025)
評(píng)論
0/150
提交評(píng)論