版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
子對象的初始化、常數(shù)據(jù)成員、常指針、常引用、常成員函數(shù)C++程序設計第8講子對象、共用數(shù)據(jù)的保護在程序運行過程中,根據(jù)需要可以隨時建立或刪除的對象;堆對象創(chuàng)建在一些空閑的存儲單元中,這些存儲單元稱為堆。1、堆對象堆內(nèi)存:C++支持動態(tài)數(shù)據(jù)結構,提供了指針這一特殊形式的數(shù)據(jù)類型,并在內(nèi)存中開辟了稱為堆的動態(tài)存儲區(qū)。堆是程序共享的空間。棧內(nèi)存:每個函數(shù)都有自己的棧,棧用來在函數(shù)之間傳遞參數(shù)。函數(shù)中定義的變量保存在棧中,每個C++對象的數(shù)據(jù)成員也保存在棧中。棧空間不需要顯式的分配和釋放。復習運算符new、delete復習運算符new、delete(1)new運算符動態(tài)創(chuàng)建對象;new<類型說明符>(<初始值列表>)new運算符返回一個與new所分配對象類型相匹配的指針;如果new運算符不能分配到所需要的內(nèi)存,將返回0,這時為空指針;使用new運算符創(chuàng)建對象時,它可以根據(jù)其參數(shù)來選擇適當?shù)臉嬙旌瘮?shù);在C++中的全局對象和局部對象的生存期是嚴格定義的,程序員不能以任何方式改變它們的生存期,但是可以創(chuàng)建一些生存期能被程序員控制的對象,它們的分配和釋放可以根據(jù)程序運行中的操作來決定,可以動態(tài)分配和釋放對象。new創(chuàng)建數(shù)組:(需要給出數(shù)組的結構說明)new<類型名>[<算術表達式>]使用new創(chuàng)建對象數(shù)組或一般數(shù)組時,不能為該數(shù)組指定初始值,其初始值為缺省值;例如:A*ptr;ptr=newA[5];使用new[]創(chuàng)建對象數(shù)組時,類中必須說明缺省構造函數(shù);功能:刪除用new創(chuàng)建的對象或一般類型的指針;delete<指針名>刪除對象數(shù)組delete[]<指針名>(2)delete運算符例如:冒泡法排序#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<<"請輸入數(shù)組元素的個數(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;}復習數(shù)據(jù)類型數(shù)據(jù)類型
——布爾型數(shù)據(jù)布爾型變量的說明:
例:boolflag;布爾型數(shù)據(jù)的取值:
只有false和true兩個值bool型數(shù)據(jù)占據(jù)1字節(jié)內(nèi)存。string是一種自定義的類型,可以方便地執(zhí)行C-串所不能直接執(zhí)行的一切操作。它處理空間占用問題是自動的,需要多少,用多少。例如:#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;}再強調(diào)定義類時的注意事項1、類中的數(shù)據(jù)成員的類型可以是任意的;包含整型、浮點型、字符型、數(shù)組、指針和引用等;2、另一個類的對象(子對象),可以作該類的成員;自身類的對象不可以作該類的成員;一、子對象classN;classM{public:…...private:Nn;M*s;};classN{public:voidf(Mm);……};提前說明類N3、自身類的指針或引用,可以作該類的成員;4、當另一個類的對象作為該類的成員時,如果另一個類的定義在后,需要提前說明;n是N類的對象m是M類的對象classNode{public: Studentstud; //節(jié)點數(shù)據(jù)信息(INFO) stringsName; //節(jié)點標示名稱 Node*NEXT; //指向下一節(jié)點的節(jié)點指針(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 //定義一個List類{private: Node* Start; //表頭指針,固定在表頭 Node* Curr; //當前遍歷位置指針 Node* Prev; //當前位置的前節(jié)點指針 Node* End; //表尾指針,固定在表尾 int iPosition; //當前節(jié)點在表中的位置序號public: List() //構造函數(shù) { Start=Curr=Prev=End=NULL; iPosition=1; }一、子對象子對象即對象成員;當類中出現(xiàn)了子對象(對象成員)時,該類的構造函數(shù)要包含對子對象的初始化,通常采用成員初始化列表的方法來初始化子對象;子對象:當一個類的成員是另一個類的對象時,該對象就為子對象;子對象(續(xù))例:分析下列程序的輸出結果。#include<iostream.h>classA{public:A(inti,intj){a1=i;a2=j;}voidPrint(){cout<<a1<<","<<a2<<endl;}private:inta1,a2;};classB{private:
Aa;intb;子對象a子對象(續(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();}對子對象成員函數(shù)的調(diào)用輸出:6,78成員初始化列表a是A類對象,是B類的子對象子對象(續(xù))例:分析下列程序的輸出結果。//part.hclassPart{public:Part();Part(inti);~Part();voidPrint();private:
intval;};子對象(續(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(){子對象(續(xù))
cout<<"DestructorofPart"<<val<<endl;}voidPart::Print(){cout<<val<<endl;}//whole.h#include"part.h"classWhole{public:Whole();子對象(續(xù))
Whole(inti,intj,intk);~Whole();voidPrint();private:
Partone;Parttwo;
intdate;};//whole.cpp#include<iostream.h>#include"whole.h"Whole::Whole(){子對象one、two子對象(續(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();成員初始化列表構造函數(shù)體子對象(續(xù))
cout<<date<<endl;}//ex613.cpp#include"whole.h"voidmain(){WholeanObject(5,6,10);anObject.Print();}輸出:ConstructorofPart6ConstructorofPart5ConstructorofWhole.6510DestructorofWhole.DestructorofPart5DestructorofPart6子對象(續(xù))
#include"whole.h"voidmain(){WholeanObject;anObject.Print();}輸出:DefaultconstructorofPart.DefaultconstructorofPart.DefaultconstructorofWhole.000DestructorofWhole.DestructorofPart0DestructorofPart0子對象(續(xù))子對象必須在成員初始化列表中初始化;說明:建立一個對象時,它的所有子對象一起建立;先執(zhí)行子對象構造函數(shù),再執(zhí)行對象的構造函數(shù)體;析構函數(shù)的執(zhí)行順序與構造函數(shù)的執(zhí)行順序嚴格相反;構造函數(shù)的調(diào)用順序僅與子對象在類中聲明的順序有關,而與成員初始化列表中給出的對構造函數(shù)的調(diào)用順序無關;構造函數(shù)的成員初始化列表中未給出對子對象的調(diào)用,則表示使用子對象的缺省構造函數(shù);二、(9.6)共用數(shù)據(jù)的保護程序中有些數(shù)據(jù)是共享的,例如實參與形參,變量與其引用,數(shù)據(jù)及其指針等。有時在無意之中的誤操作會改變有關數(shù)據(jù),因此有時需要對數(shù)據(jù)進行保護,這時可以使用const?;仡櫼话愠A浚ê唵晤愋偷某A浚?/p>
<類型說明符>const<常量名>或const
<類型說明符><常量名>intconstx=2;或constintx=2;intconsta[3]={1,2,3};
或
constinta[3]={1,2,3};數(shù)組元素的值是常量,不能更新;(一)常對象常對象希望數(shù)據(jù)成員不被改變的對象,可以聲明為常對象<類名>const<對象名>classA{public:A(inti,intj){x=i;y=j;}private:intx,y;};constAa1(3,4);或A
const
a1(3,4);常對象a1注意:常對象中的數(shù)據(jù)成員為常變量且必須有初值。對象a1中的所有數(shù)據(jù)成員都不能被修改??梢詫ο蟮某蓡T聲明為const,包括常數(shù)據(jù)成員和常成員函數(shù)。常數(shù)據(jù)成員的作用和用法與一般常變量相似,用關鍵字const來聲明常數(shù)據(jù)成員。常數(shù)據(jù)成員的值是不能改變的。1、常數(shù)據(jù)成員常數(shù)據(jù)成員只能通過成員初始化列表的方法進行初始化;常數(shù)據(jù)成員不能被賦值。二、常對象成員注意:
例:分析下列程序的輸出結果。#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關鍵字進行說明的成員函數(shù);<類型說明符><函數(shù)名>(<參數(shù)表>)const;const是函數(shù)類型的一個組成部分,在函數(shù)實現(xiàn)部分必須帶有const關鍵字;說明:只有常成員函數(shù)才能操作常對象;表成員函數(shù)與對象之間的操作關系常成員函數(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();}常對象m1一般對象m2錯誤,一般成員函數(shù)不能操作常對象正確,常成員函數(shù)可以操作常對象常成員函數(shù)(續(xù))例:分析下列程序的輸出結果。#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對重載條件的補充:voidPrint();voidPrint()const;可重載;常對象調(diào)用常成員函數(shù),一般對象調(diào)用一般成員函數(shù)成員函數(shù)引用數(shù)據(jù)成員的操作關系數(shù)據(jù)成員非const成員函數(shù)const成員函數(shù)非const數(shù)據(jù)成員可以使用,也可以改變值可以使用,但不可以改變值const數(shù)據(jù)成員可以使用,但不可以改變值可以使用,但不可以改變值const對象的數(shù)據(jù)成員不允許使用和改變值可以使用,但不可以改變值三、常指針和常引用
1、常指針char*constptr1=strptr1;ptr1是一個常量指針;ptr1=strptr2;*ptr1="m";ptr1不可以更新ptr1所指向的變量可以更新;注意const的位置constchar*ptr2=strptr1;ptr2是一個指向字符常量的指針;ptr2=strptr2;*ptr2="m";ptr2可以更新ptr2所指向的字符串不可以更新;錯誤正確正確錯誤(1)指向?qū)ο蟮某V羔樁x指向?qū)ο蟮某V羔樀男问剑侯惷?const指針變量名=對象地址;例如:Pointt1;Point*constptr1;ptr1=&t1;錯,常指針不能被賦值常指針往往作為函數(shù)的形參,目的是不允許在函數(shù)執(zhí)行過程中改變指針變量的值,使其始終指向原來的對象。(2)指向常對象的指針變量定義指向常對象的指針變量的形式:const類名*指針變量名;說明:a、如果一個變量已被聲明為常量,只能用指向常變量的指針變量指向它,而不能用一般的指針去指向它。例如:constcharc[]=“Boy”,constchar*p1;p1=c;char*p2=c;錯,p2不是指向常變量的指針例如:constPointp1(10,12);constPoint*p;p=&p1;Point*p2;p2=&p1;
錯b、指向常變量的指針變量除了可以指向常變量外,還可以指向未被聲明為const的變量。此時不能通過此指針變量改變該變量的值。例如:charc1=‘a(chǎn)’;constchar*p;p=&c1;*p=‘b’;c1=‘b’;錯,不能通過p改變變量c1的值例如:設Point類的數(shù)據(jù)成員x訪問權限是公有的Pointp1(10,12);constPoint*p=&p1;p1.x=18;(*p).x=18;
錯c、如果函數(shù)的形參是指向非const型變量的指針,實參只能用指向非const變量的指針,而不能用指向const變量的指針,這樣,可以在執(zhí)行函數(shù)的過程中可以改變形參指針變量所指向的變量(實參指針變量所指向的變量)的值。如果函數(shù)的形參是指向const型變量的指針,在執(zhí)行函數(shù)的過程中不能改變指針變量所指向的變量的值。因此允許實參是指向const變量的指針,或指向非const變量的指針。例如:constcharstr[]=“boy”;voidfun(char*ptr);fun(str);Str是const型數(shù)組函數(shù)fun的形參是指向非const型變量的指針調(diào)用fun函數(shù),實參是const變量的地址,因此錯。例如:voidfun(constPoint*p);Pointp1(10,12);fun(&p1);指向常對象的指針最常用于函數(shù)的形參,目的是保護形參指針所指的對象,使它在函數(shù)執(zhí)行過程中不被修改。形參實參合法否改變指針所指的變量的值指向非const型變量的指針非const變量的地址合法改變指針所指向的變量的值指向非const型變量的指針const變量的地址非法/指向const型變量的指針const變量的地址合法不可以指向const型變量的指針非const變量的地址合法不可以2、常引用(不能通過引用,更新被引用的對象)const<類型說明符>&<引用名>doublex=1.2;constdouble&v=x;則:v=12.3錯誤。3、常指針與常引用的作用
使用常參數(shù)表明該函數(shù)不會更新某個參數(shù)所指向或所引用的對象,并使該函數(shù)具有更大的適應性;例:分析下列程序的輸出結果。#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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 酒店管理晉升路徑
- 酒店管理工作目標
- All Touch移動信息化管理平臺介紹課件
- 2025-2030全球動畫工作室行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國超細玻璃棉行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球機器人電子皮膚行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國光伏增效膜行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國近紅外(NIR)超透鏡行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國3D感知數(shù)智化解決方案行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球數(shù)字布局軟件行業(yè)調(diào)研及趨勢分析報告
- 2025年新能源汽車銷售傭金返點合同范本6篇
- 2025-2030年中國配電變壓器市場未來發(fā)展趨勢及前景調(diào)研分析報告
- GB/T 45120-2024道路車輛48 V供電電壓電氣要求及試驗
- 2025年上海市嘉定區(qū)中考英語一模試卷
- 潤滑油、潤滑脂培訓課件
- 2025年中核財務有限責任公司招聘筆試參考題庫含答案解析
- 華中師大一附中2024-2025學年度上學期高三年級第二次考試數(shù)學試題(含解析)
- ADA糖尿病醫(yī)學診療標準指南修訂要點解讀(2025)課件
- 健康管理-理論知識復習測試卷含答案
- 成人腦室外引流護理-中華護理學會團體 標準
- JGJ106-建筑基樁檢測技術規(guī)范
評論
0/150
提交評論