關(guān)于類和對象的進(jìn)一步討論課件_第1頁
關(guān)于類和對象的進(jìn)一步討論課件_第2頁
關(guān)于類和對象的進(jìn)一步討論課件_第3頁
關(guān)于類和對象的進(jìn)一步討論課件_第4頁
關(guān)于類和對象的進(jìn)一步討論課件_第5頁
已閱讀5頁,還剩147頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C+程序設(shè)計基礎(chǔ)東軟IT人才實訓(xùn)中心Copyright 2009-2010 By Neusoft Group. All rights reserved總 目 錄內(nèi)容總計:48學(xué)時第1章 C+的初步知識1 第2章 數(shù)據(jù)類型與表達(dá)式1第3章 程序設(shè)計初步3第4章 函數(shù)與預(yù)處理2第5章 數(shù)組2第6章 指針4第7章 自定義數(shù)據(jù)類型3第8章 類和對象6第9章 關(guān)于類和對象的進(jìn)一步討論4第10章 運算符重載4第11章 繼承與派生5第12章 多態(tài)性與虛函數(shù)4第13章 輸入輸出流5第14章 C+工具4第9章 關(guān)于類和對象的進(jìn)一步討論本章主要在向?qū)W員介紹:1 構(gòu)造函數(shù)2 析構(gòu)函數(shù)3 調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序

2、4 對象數(shù)組5 對象指針6 共用數(shù)據(jù)的保護(hù)7 對象的動態(tài)建立和釋放8 對象的賦值和復(fù)制9 靜態(tài)成員10 友元11 類模板時間:6 學(xué)時教學(xué)方法:PPT+練習(xí) 9.1 構(gòu)造函數(shù)9.1.1 對象的初始化9.1.2 構(gòu)造函數(shù)的作用9.1.3 帶參數(shù)的構(gòu)造函數(shù)9.1.4 用參數(shù)初始化表初始化成員9.1.5 構(gòu)造函數(shù)的重載9.1.6 使用默認(rèn)參數(shù)的構(gòu)造函數(shù)9.1.1 對象的初始化(續(xù))如果一個類中所有的成員都是公用的,則可以在定義對象時對數(shù)據(jù)成員進(jìn)行初始化。如class Timepublic: /聲明為公用成員 hour; minute; sec;Time t1=14,56,30; /將t1初始化為14

3、:56:30這種情況和結(jié)構(gòu)體變量的初始化是差不多的,在一個花括號內(nèi)順序列出各公用數(shù)據(jù)成員的值,兩個值之間用逗號分隔。但是,如果數(shù)據(jù)成員是私有的,或者類中有private或protected的成員,就不能用這種方法初始化。9.1.1 對象的初始化(續(xù))在第8章的幾個例子中,是用成員函數(shù)來對對象中的數(shù)據(jù)成員賦初值的(例如例8.3中的set_time函數(shù))。從例8.3中可以看到,用戶在主函數(shù)中調(diào)用set_time函數(shù)來為數(shù)據(jù)成員賦值。如果對一個類定義了多個對象,而且類中的數(shù)據(jù)成員比較多,那么,程序就顯得非常臃腫煩瑣。9.1.2 構(gòu)造函數(shù)的作用(續(xù))例9.1 在例8.3基礎(chǔ)上定義構(gòu)造成員函數(shù)。#inc

4、lude using namespace std;class Timepublic: Time( ) /定義構(gòu)造成員函數(shù),函數(shù)名與類名相同 hour=0; /利用構(gòu)造函數(shù)對對象中的數(shù)據(jù)成員賦初值 minute=0; sec=0; 9.1.2 構(gòu)造函數(shù)的作用(續(xù)) void set_time( ); /函數(shù)聲明 void show_time( ); /函數(shù)聲明private: int hour; /私有數(shù)據(jù)成員 int minute; int sec;void Time:set_time( ) /定義成員函數(shù),向數(shù)據(jù)成員賦值 cinhour; cinminute; cinsec;9.1.2 構(gòu)造

5、函數(shù)的作用(續(xù))void Time:show_time( ) /定義成員函數(shù),輸出數(shù)據(jù)成員的值 couthour:minute:secendl;int main( ) Time t1; /建立對象t1,同時調(diào)用構(gòu)造函數(shù)t1.Time( ) t1.set_time( ); /對t1的數(shù)據(jù)成員賦值 t1.show_time( ); /顯示t1的數(shù)據(jù)成員的值 Time t2; /建立對象t2,同時調(diào)用構(gòu)造函數(shù)t2.Time( ) t2.show_time( ); /顯示t2的數(shù)據(jù)成員的值 return 0;9.1.2 構(gòu)造函數(shù)的作用(續(xù))程序運行的情況為: 10 25 54 (從鍵盤輸入新值賦給t1

6、的數(shù)據(jù)成員)10:25:54 (輸出t1的時、分、秒值)0:0:0 (輸出t2的時、分、秒值)上面是在類內(nèi)定義構(gòu)造函數(shù)的,也可以只在類內(nèi)對構(gòu)造函數(shù)進(jìn)行聲明而在類外定義構(gòu)造函數(shù)。將程序中的第47行改為下面一行: Time( ); /對構(gòu)造函數(shù)進(jìn)行聲明在類外定義構(gòu)造函數(shù):Time:Time( ) /在類外定義構(gòu)造成員函數(shù),要加上類名Time和域限定符“:”hour=0; minute=0;sec=0;9.1.2 構(gòu)造函數(shù)的作用(續(xù))有關(guān)構(gòu)造函數(shù)的使用,有以下說明: (1) 在類對象進(jìn)入其作用域時調(diào)用構(gòu)造函數(shù)。(2) 構(gòu)造函數(shù)沒有返回值,因此也不需要在定義構(gòu)造函數(shù)時聲明類型,這是它和一般函數(shù)的一個重

7、要的不同之點。(3) 構(gòu)造函數(shù)不需用戶調(diào)用,也不能被用戶調(diào)用。(4) 在構(gòu)造函數(shù)的函數(shù)體中不僅可以對數(shù)據(jù)成員賦初值,而且可以包含其他語句。但是一般不提倡在構(gòu)造函數(shù)中加入與初始化無關(guān)的內(nèi)容,以保持程序的清晰。(5) 如果用戶自己沒有定義構(gòu)造函數(shù),則C+系統(tǒng)會自動生成一個構(gòu)造函數(shù),只是這個構(gòu)造函數(shù)的函數(shù)體是空的,也沒有參數(shù),不執(zhí)行初始化操作。9.1.3 帶參數(shù)的構(gòu)造函數(shù)在例9.1中構(gòu)造函數(shù)不帶參數(shù),在函數(shù)體中對數(shù)據(jù)成員賦初值。這種方式使該類的每一個對象都得到同一組初值(例如例9.1中各數(shù)據(jù)成員的初值均為0)。但是有時用戶希望對不同的對象賦予不同的初值。可以采用帶參數(shù)的構(gòu)造函數(shù),在調(diào)用不同對象的構(gòu)造

8、函數(shù)時,從外面將不同的數(shù)據(jù)傳遞給構(gòu)造函數(shù),以實現(xiàn)不同的初始化。構(gòu)造函數(shù)首部的一般格式為構(gòu)造函數(shù)名(類型 1 形參1,類型2 形參2,)前面已說明: 用戶是不能調(diào)用構(gòu)造函數(shù)的,因此無法采用常規(guī)的調(diào)用函數(shù)的方法給出實參。實參是在定義對象時給出的。定義對象的一般格式為 類名 對象名(實參1,實參2,);9.1.3 帶參數(shù)的構(gòu)造函數(shù)(續(xù)) int width; int length;Box:Box(int h,int w,int len) /在類外定義帶參數(shù)的構(gòu)造函數(shù) height=h; width=w; length=len;int Box:volume( ) /定義計算體積的函數(shù)return(he

9、ight*width*length);int main( ) /建立對象box1,并指定box1長、寬、高的值 Box box1(12,25,30);9.1.3 帶參數(shù)的構(gòu)造函數(shù)(續(xù)) coutThe volume of box1 is box1.volume( )endl; /建立對象box2,并指定box2長、寬、高的值 Box box2(15,30,21); coutThe volume of box2 is box2.volume( )endl; return 0;程序運行結(jié)果如下: The volume of box1 is 9000The volume of box2 is 945

10、0可以知道: (1) 帶參數(shù)的構(gòu)造函數(shù)中的形參,其對應(yīng)的實參在定義對象時給定。(2) 用這種方法可以方便地實現(xiàn)對不同的對象進(jìn)行不同的初始化。9.1.5 構(gòu)造函數(shù)的重載在一個類中可以定義多個構(gòu)造函數(shù),以便對類對象提供不同的初始化的方法,供用戶選用。這些構(gòu)造函數(shù)具有相同的名字,而參數(shù)的個數(shù)或參數(shù)的類型不相同。這稱為構(gòu)造函數(shù)的重載。在第4章第4.6節(jié)中所介紹的函數(shù)重載的知識也適用于構(gòu)造函數(shù)。通過下面的例子可以了解怎樣應(yīng)用構(gòu)造函數(shù)的重載。9.1.5 構(gòu)造函數(shù)的重載(續(xù))例9.3 在例9.2的基礎(chǔ)上,定義兩個構(gòu)造函數(shù),其中一個無參數(shù),一個有參數(shù)。#include using namespace std;

11、class Boxpublic: Box( ); /聲明一個無參的構(gòu)造函數(shù) Box(int h,int w,int len):height(h),width(w),length(len) /聲明一個有參的構(gòu)造函數(shù),用參數(shù)的初始化表對數(shù)據(jù)成員初始化 int volume( );private: int height;9.1.5 構(gòu)造函數(shù)的重載(續(xù)) int width; int length;Box:Box( ) /定義一個無參的構(gòu)造函數(shù) height=10; width=10; length=10;int Box:volume( ) return(height*width*length);in

12、t main( ) Box box1; /建立對象box1,不指定實參9.1.5 構(gòu)造函數(shù)的重載(續(xù)) coutThe volume of box1 is box1.volume( )endl; Box box2(15,30,25); /建立對象box2,指定3個實參 coutThe volume of box2 is box2.volume( )endl; return 0; 在本程序中定義了兩個重載的構(gòu)造函數(shù),其實還可以定義其他重載構(gòu)造函數(shù),其原型聲明可以為Box:Box(int h); /有1個參數(shù)的構(gòu)造函數(shù)Box:Box(int h,int w); /有兩個參數(shù)的構(gòu)造函數(shù)在建立對象時分

13、別給定1個參數(shù)和2個參數(shù)。9.1.5 構(gòu)造函數(shù)的重載(續(xù))說明: (1) 調(diào)用構(gòu)造函數(shù)時不必給出實參的構(gòu)造函數(shù),稱為默認(rèn)構(gòu)造函數(shù)(default constructor)。顯然,無參的構(gòu)造函數(shù)屬于默認(rèn)構(gòu)造函數(shù)。一個類只能有一個默認(rèn)構(gòu)造函數(shù)。(2) 如果在建立對象時選用的是無參構(gòu)造函數(shù),應(yīng)注意正確書寫定義對象的語句。(3) 盡管在一個類中可以包含多個構(gòu)造函數(shù),但是對于每一個對象來說,建立對象時只執(zhí)行其中一個構(gòu)造函數(shù),并非每個構(gòu)造函數(shù)都被執(zhí)行。9.1.6 使用默認(rèn)參數(shù)的構(gòu)造函數(shù)構(gòu)造函數(shù)中參數(shù)的值既可以通過實參傳遞,也可以指定為某些默認(rèn)值,即如果用戶不指定實參值,編譯系統(tǒng)就使形參取默認(rèn)值。在第4章第

14、4.8節(jié)中介紹過在函數(shù)中可以使用有默認(rèn)值的參數(shù)。在構(gòu)造函數(shù)中也可以采用這樣的方法來實現(xiàn)初始化。例9.3的問題也可以使用包含默認(rèn)參數(shù)的構(gòu)造函數(shù)來處理。 例9.4 將例9.3程序中的構(gòu)造函數(shù)改用含默認(rèn)值的參數(shù),長、寬、高的默認(rèn)值均為10。在例9.3程序的基礎(chǔ)上改寫如下: #include using namespace std;class Boxpublic: / 在聲明構(gòu)造函數(shù)時指定默認(rèn)參數(shù) Box(int h=10,int w=10,int len=10); 9.1.6 使用默認(rèn)參數(shù)的構(gòu)造函數(shù)(續(xù))int main( ) Box box1; /沒有給實參 coutThe volume of b

15、ox1 is box1.volume( )endl; Box box2(15); /只給定一個實參 coutThe volume of box2 is box2.volume( )endl; Box box3(15,30); /只給定2個實參 coutThe volume of box3 is box3.volume( )endl; Box box4(15,30,20); /給定3個實參 coutThe volume of box4 is box4.volume( )endl; return 0;9.1.6 使用默認(rèn)參數(shù)的構(gòu)造函數(shù)(續(xù))程序運行結(jié)果為The volume of box1 is

16、1000The volume of box2 is 1500The volume of box3 is 4500The volume of box4 is 9000程序中對構(gòu)造函數(shù)的定義(第1216行)也可以改寫成參數(shù)初始化表的形式: Box:Box(int h,int w,int len):height(h),width(w),length(len) 可以看到: 在構(gòu)造函數(shù)中使用默認(rèn)參數(shù)是方便而有效的,它提供了建立對象時的多種選擇,它的作用相當(dāng)于好幾個重載的構(gòu)造函數(shù)。它的好處是: 即使在調(diào)用構(gòu)造函數(shù)時沒有提供實參值,不僅不會出錯,而且還確保按照默認(rèn)的參數(shù)值對對象進(jìn)行初始化。尤其在希望對9.2

17、 析構(gòu)函數(shù)析構(gòu)函數(shù)(destructor)也是一個特殊的成員函數(shù),它的作用與構(gòu)造函數(shù)相反,它的名字是類名的前面加一個“”符號。在C+中“”是位取反運算符,從這點也可以想到: 析構(gòu)函數(shù)是與構(gòu)造函數(shù)作用相反的函數(shù)。當(dāng)對象的生命期結(jié)束時,會自動執(zhí)行析構(gòu)函數(shù)。具體地說如果出現(xiàn)以下幾種情況,程序就會執(zhí)行析構(gòu)函數(shù): 如果在一個函數(shù)中定義了一個對象(它是自動局部對象),當(dāng)這個函數(shù)被調(diào)用結(jié)束時,對象應(yīng)該釋放,在對象釋放前自動執(zhí)行析構(gòu)函數(shù)。9.2 析構(gòu)函數(shù)(續(xù))static局部對象在函數(shù)調(diào)用結(jié)束時對象并不釋放,因此也不調(diào)用析構(gòu)函數(shù),只在main函數(shù)結(jié)束或調(diào)用exit函數(shù)結(jié)束程序時,才調(diào)用static局部對象的析

18、構(gòu)函數(shù)。如果定義了一個全局對象,則在程序的流程離開其作用域時(如main函數(shù)結(jié)束或調(diào)用exit函數(shù)) 時,調(diào)用該全局對象的析構(gòu)函數(shù)。如果用new運算符動態(tài)地建立了一個對象,當(dāng)用delete運算符釋放該對象時,先調(diào)用該對象的析構(gòu)函數(shù)。析構(gòu)函數(shù)的作用并不是刪除對象,而是在撤銷對象占用的內(nèi)存之前完成一些清理工作,使這部分內(nèi)存可以被程序分配給新對象使用。程序設(shè)計者事先設(shè)計好析構(gòu)函數(shù),以完成所需的功能,只要對象的生命期結(jié)束,程序就自動執(zhí)行析構(gòu)函數(shù)來完成這些工作。9.2 析構(gòu)函數(shù)(續(xù))析構(gòu)函數(shù)不返回任何值,沒有函數(shù)類型,也沒有函數(shù)參數(shù)。因此它不能被重載。一個類可以有多個構(gòu)造函數(shù),但只能有一個析構(gòu)函數(shù)。實際

19、上,析構(gòu)函數(shù)的作用并不僅限于釋放資源方面,它還可以被用來執(zhí)行“用戶希望在最后一次使用對象之后所執(zhí)行的任何操作”,例如輸出有關(guān)的信息。這里說的用戶是指類的設(shè)計者,因為,析構(gòu)函數(shù)是在聲明類的時候定義的。也就是說,析構(gòu)函數(shù)可以完成類的設(shè)計者所指定的任何操作。一般情況下,類的設(shè)計者應(yīng)當(dāng)在聲明類的同時定義析構(gòu)函數(shù),以指定如何完成“清理”的工作。如果用戶沒有定義析構(gòu)函數(shù),C+編譯系統(tǒng)會自動生成一個析構(gòu)函數(shù),但它只是徒有析構(gòu)函數(shù)的名稱和形式,實際上什么操作都不進(jìn)行。想讓析構(gòu)函數(shù)完成任何工作,都必須在定義的析構(gòu)函數(shù)中指定。9.2 析構(gòu)函數(shù)(續(xù))例9.5 包含構(gòu)造函數(shù)和析構(gòu)函數(shù)的C+程序。#include#in

20、cludeusing namespace std;class Student /聲明Student類public: student(int n,string nam,char s ) /定義構(gòu)造函數(shù) num=n; name=nam; sex=s; coutConstructor called.endl; /輸出有關(guān)信息 9.2 析構(gòu)函數(shù)(續(xù)) Student( ) /定義析構(gòu)函數(shù) coutDestructor called.endl; /輸出有關(guān)信息 void display( ) /定義成員函數(shù) coutnum: numendl; coutname: nameendl; coutsex: s

21、exendlendl; private: int num; char name10; char sex;9.2 析構(gòu)函數(shù)(續(xù))int main( ) Student stud1(10010,Wang_li,f); /建立對象stud1 stud1.display( ); /輸出學(xué)生1的數(shù)據(jù) Student stud2(10011,Zhang_fun,m); /定義對象stud2 stud2.display( ); /輸出學(xué)生2的數(shù)據(jù) return 0;程序運行結(jié)果如下: Constructor called. (執(zhí)行stud1的構(gòu)造函數(shù))num: 10010 (執(zhí)行stud1的display函

22、數(shù))name:Wang_lisex: f9.2 析構(gòu)函數(shù)(續(xù))Constructor called. (執(zhí)行stud2的構(gòu)造函數(shù))num: 10011 (執(zhí)行stud2的display函數(shù))name:Zhang_funsex:mDestructor called. (執(zhí)行stud2的析構(gòu)函數(shù))Destructor called. (執(zhí)行stud1的析構(gòu)函數(shù))9.3 調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)順序在使用構(gòu)造函數(shù)和析構(gòu)函數(shù)時,需要特別注意對它們的調(diào)用時間和調(diào)用順序。在一般情況下,調(diào)用析構(gòu)函數(shù)的次序正好與調(diào)用構(gòu)造函數(shù)的次序相反: 最先被調(diào)用的構(gòu)造函數(shù),其對應(yīng)的(同一對象中的)析構(gòu)函數(shù)最后被調(diào)用,而最后被

23、調(diào)用的構(gòu)造函數(shù),其對應(yīng)的析構(gòu)函數(shù)最先被調(diào)用。如圖9.1示意。9.3 調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)順序(續(xù))圖9.19.3 調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)順序(續(xù))但是,并不是在任何情況下都是按這一原則處理的。在第4章第4.11和4.12節(jié)中曾介紹過作用域和存儲類別的概念,這些概念對于對象也是適用的。對象可以在不同的作用域中定義,可以有不同的存儲類別。這些會影響調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的時機(jī)。下面歸納一下什么時候調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù): (1) 在全局范圍中定義的對象(即在所有函數(shù)之外定義的對象),它的構(gòu)造函數(shù)在文件中的所有函數(shù)(包括main函數(shù))執(zhí)行之前調(diào)用。但如果一個程序中有多個文件,而不同的文件中都定義了

24、全局對象,則這些對象的構(gòu)造函數(shù)的執(zhí)行順序是不確定的。當(dāng)main函數(shù)執(zhí)行完畢或調(diào)用exit函數(shù)時(此時程序終止),調(diào)用析構(gòu)函數(shù)。9.3 調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)順序(續(xù))(2) 如果定義的是局部自動對象(例如在函數(shù)中定義對象),則在建立對象時調(diào)用其構(gòu)造函數(shù)。如果函數(shù)被多次調(diào)用,則在每次建立對象時都要調(diào)用構(gòu)造函數(shù)。在函數(shù)調(diào)用結(jié)束、對象釋放時先調(diào)用析構(gòu)函數(shù)。(3) 如果在函數(shù)中定義靜態(tài)(static)局部對象,則只在程序第一次調(diào)用此函數(shù)建立對象時調(diào)用構(gòu)造函數(shù)一次,在調(diào)用結(jié)束時對象并不釋放,因此也不調(diào)用析構(gòu)函數(shù),只在main函數(shù)結(jié)束或調(diào)用exit函數(shù)結(jié)束程序時,才調(diào)用析構(gòu)函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)在面向?qū)?/p>

25、象的程序設(shè)計中是相當(dāng)重要的。以上介紹了最基本的、使用最多的普通構(gòu)造函數(shù),在本章第9.8節(jié)中將會介紹復(fù)制構(gòu)造函數(shù),在第10章第10.7節(jié)中還要介紹轉(zhuǎn)換構(gòu)造函數(shù)。9.4 對象數(shù)組數(shù)組不僅可以由簡單變量組成(例如整型數(shù)組的每一個元素都是整型變量),也可以由對象組成(對象數(shù)組的每一個元素都是同類的對象)。在日常生活中,有許多實體的屬性是共同的,只是屬性的具體內(nèi)容不同。例如一個班有50個學(xué)生,每個學(xué)生的屬性包括姓名、性別、年齡、成績等。如果為每一個學(xué)生建立一個對象,需要分別取50個對象名。用程序處理很不方便。這時可以定義一個“學(xué)生類”對象數(shù)組,每一個數(shù)組元素是一個“學(xué)生類”對象。例如 Student s

26、tud50; /假設(shè)已聲明了Student類,定義stud數(shù)組,有50個元素9.4 對象數(shù)組(續(xù))在建立數(shù)組時,同樣要調(diào)用構(gòu)造函數(shù)。如果有50個元素,需要調(diào)用50次構(gòu)造函數(shù)。在需要時可以在定義數(shù)組時提供實參以實現(xiàn)初始化。如果構(gòu)造函數(shù)只有一個參數(shù),在定義數(shù)組時可以直接在等號后面的花括號內(nèi)提供實參。如/合法,3個實參分別傳遞給3個數(shù)組元素的構(gòu)造函數(shù)Student stud3=60,70,78; 如果構(gòu)造函數(shù)有多個參數(shù),則不能用在定義數(shù)組時直接提供所有實參的方法,因為一個數(shù)組有多個元素,對每個元素要提供多個實參,如果再考慮到構(gòu)造函數(shù)有默認(rèn)參數(shù)的情況,很容易造成實參與形參的對應(yīng)關(guān)系不清晰,出現(xiàn)歧義性。

27、例如,類Student的構(gòu)造函數(shù)有多個參數(shù),且為默認(rèn)參數(shù): /定義構(gòu)造函數(shù),有多個參數(shù),且為默認(rèn)參數(shù)Student: Student(int=1001,int=18,int=60); 9.4 對象數(shù)組(續(xù))如果定義對象數(shù)組的語句為Student stud3=1005,60,70;在程序中最好不要采用這種容易引起歧義性的方法。編譯系統(tǒng)只為每個對象元素的構(gòu)造函數(shù)傳遞一個實參,所以在定義數(shù)組時提供的實參個數(shù)不能超過數(shù)組元素個數(shù),如 /不合法,實參個數(shù)超過對象數(shù)組元素個數(shù)Student stud3=60,70,78,45; 那么,如果構(gòu)造函數(shù)有多個參數(shù),在定義對象數(shù)組時應(yīng)當(dāng)怎樣實現(xiàn)初始化呢?回答是:

28、在花括號中分別寫出構(gòu)造函數(shù)并指定實參。如果構(gòu)造函數(shù)有3個參數(shù),分別代表學(xué)號、年齡、成績。則可以這樣定義對象數(shù)組: Student Stud3= /定義對象數(shù)組/調(diào)用第1個元素的構(gòu)造函數(shù),為它提供3個實參Student(1001,18,87),9.4 對象數(shù)組(續(xù))/調(diào)用第2個元素的構(gòu)造函數(shù),為它提供3個實參Student(1002,19,76), /調(diào)用第3個元素的構(gòu)造函數(shù),為它提供3個實參Student(1003,18,72);在建立對象數(shù)組時,分別調(diào)用構(gòu)造函數(shù),對每個元素初始化。每一個元素的實參分別用括號包起來,對應(yīng)構(gòu)造函數(shù)的一組形參,不會混淆。例9.6 對象數(shù)組的使用方法。#includ

29、e using namespace std;class Box9.4 對象數(shù)組(續(xù))public: Box(int h=10,int w=12,int len=15): height(h),width(w),length(len) /聲明有默認(rèn)參數(shù)的構(gòu)造函數(shù),用參數(shù)初始化表對數(shù)據(jù)成員初始化 int volume( );private: int height; int width; int length;int Box:volume( )return(height*width*length);9.4 對象數(shù)組(續(xù))int main( ) Box a3= /定義對象數(shù)組 Box(10,12,15)

30、, /調(diào)用構(gòu)造函數(shù)Box,提供第1個元素的實參 Box(15,18,20), /調(diào)用構(gòu)造函數(shù)Box,提供第2個元素的實參 Box(16,20,26) /調(diào)用構(gòu)造函數(shù)Box,提供第3個元素的實參 ; /調(diào)用a0的volume函數(shù) coutvolume of a0 is a0.volume( )endl; /調(diào)用a1 的volume函數(shù) coutvolume of a1 is a1.volume( )endl; /調(diào)用a2 的volume函數(shù) coutvolume of a2 is a2.volume( )endl; 9.4 對象數(shù)組(續(xù))運行結(jié)果如下: volume of a0 is 1800v

31、olume of a1 is 5400volume of a2 is 83209.5 對象指針9.5.1 指向?qū)ο蟮闹羔?.5.2 指向?qū)ο蟪蓡T的指針9.5.3 this 指針9.5.1 指向?qū)ο蟮闹羔樤诮ο髸r,編譯系統(tǒng)會為每一個對象分配一定的存儲空間,以存放其成員。對象空間的起始地址就是對象的指針。可以定義一個指針變量,用來存放對象的指針。如果有一個類:class Timepublic: int hour; int minute; int sec; void get_time( );9.5.1 指向?qū)ο蟮闹羔?續(xù))void Time:get_time( ) couthour:minute

32、:sechour/調(diào)用pt所指向的對象中的get_time函數(shù),即t1.get_time(*pt).get_time ( )/調(diào)用pt所指向的對象中的get_time函數(shù),即t1.get_timept-get_time ( )9.5.2 指向?qū)ο蟪蓡T的指針對象有地址,存放對象初始地址的指針變量就是指向?qū)ο蟮闹羔樧兞?。對象中的成員也有地址,存放對象成員地址的指針變量就是指向?qū)ο蟪蓡T的指針變量。9.5.2 指向?qū)ο蟪蓡T的指針(續(xù))1. 指向?qū)ο髷?shù)據(jù)成員的指針定義指向?qū)ο髷?shù)據(jù)成員的指針變量的方法和定義指向普通變量的指針變量方法相同。例如int *p1; /定義指向整型數(shù)據(jù)的指針變量定義指向?qū)ο髷?shù)據(jù)成

33、員的指針變量的一般形式為數(shù)據(jù)類型名 *指針變量名;如果Time類的數(shù)據(jù)成員hour為公用的整型數(shù)據(jù),則可以在類外通過指向?qū)ο髷?shù)據(jù)成員的指針變量訪問對象數(shù)據(jù)成員hour。/將對象t1的數(shù)據(jù)成員hour的地址賦給p1,p1指向t1.hourp1=&t1.hour; cout*p1endl; /輸出t1.hour的值9.5.2 指向?qū)ο蟪蓡T的指針(續(xù))2. 指向?qū)ο蟪蓡T函數(shù)的指針需要提醒讀者注意: 定義指向?qū)ο蟪蓡T函數(shù)的指針變量的方法和定義指向普通函數(shù)的指針變量方法有所不同。成員函數(shù)與普通函數(shù)有一個最根本的區(qū)別: 它是類中的一個成員。編譯系統(tǒng)要求在上面的賦值語句中,指針變量的類型必須與賦值號右側(cè)函數(shù)

34、的類型相匹配,要求在以下3方面都要匹配: 函數(shù)參數(shù)的類型和參數(shù)個數(shù);函數(shù)返回值的類型;所屬的類。定義指向成員函數(shù)的指針變量應(yīng)該采用下面的形式: /定義p2為指向Time類中公用成員函數(shù)的指針變量void (Time:*p2)( ); 9.5.2 指向?qū)ο蟪蓡T的指針(續(xù))定義指向公用成員函數(shù)的指針變量的一般形式為 數(shù)據(jù)類型名 (類名:*指針變量名)(參數(shù)表列);可以讓它指向一個公用成員函數(shù),只需把公用成員函數(shù)的入口地址賦給一個指向公用成員函數(shù)的指針變量即可。如 p2=&Time:get_time;使指針變量指向一個公用成員函數(shù)的一般形式為 指針變量名=&類名:成員函數(shù)名;例9.7 有關(guān)對象指針的

35、使用方法。#include using namespace std;class Time9.5.2 指向?qū)ο蟪蓡T的指針(續(xù))public: Time(int,int,int); int hour; int minute; int sec; void get_time( ); /聲明公有成員函數(shù);void Time:get_time( ) /定義公有成員函數(shù)couthour:minute: secendl;int main( ) 9.5.2 指向?qū)ο蟪蓡T的指針(續(xù)) Time t1(10,13,56); /定義Time類對象t1 /定義指向整型數(shù)據(jù)的指針變量p1,并使p1指向t1.hour in

36、t *p1=&t1.hour; cout*p1get_time( ); /調(diào)用p2所指向?qū)ο?即t1)的get_time函數(shù) void (Time:*p3)( ); /定義指向Time類公用成員函數(shù)的指針變量p3 p3=&Time:get_time; /使p3指向Time類公用成員函數(shù)get_time (t1.*p3)( ); /調(diào)用對象t1中p3所指的成員函數(shù)(即t1.get_time( )9.5.2 指向?qū)ο蟪蓡T的指針(續(xù))程序運行結(jié)果為10 (main函數(shù)第4行的輸出)10:13:56 (main函數(shù)第5行的輸出)10:13:56 (main函數(shù)第7行的輸出)10:13:56 (main

37、函數(shù)第10行的輸出)可以看到為了輸出t1中hour,minute和sec的值,可以采用3種不同的方法。說明: (1) 從main函數(shù)第9行可以看出: 成員函數(shù)的入口地址的正確寫法是: &類名:成員函數(shù)名。(2) main函數(shù)第8、9兩行可以合寫為一行: /定義指針變量時指定其指向void (Time:*p3)( )=&Time:get_time; 9.5.3 this 指針在第8章中曾經(jīng)提到過: 每個對象中的數(shù)據(jù)成員都分別占有存儲空間,如果對同一個類定義了n個對象,則有n組同樣大小的空間以存放n個對象中的數(shù)據(jù)成員。但是,不同對象都調(diào)用同一個函數(shù)代碼段。那么,當(dāng)不同對象的成員函數(shù)引用數(shù)據(jù)成員時,

38、怎么能保證引用的是所指定的對象的數(shù)據(jù)成員呢?假如,對于例9.6程序中定義的Box類,定義了3個同類對象a,b,c。如果有a.volume( ),應(yīng)該是引用對象a中的height,width和length,計算出長方體a的體積。如果有b.volume( ),應(yīng)該是引用對象b中的height,width和length,計算出長方體b的體積。而現(xiàn)在都用同一個函數(shù)段,系統(tǒng)怎樣使它分別引用a或b中的數(shù)據(jù)成員呢?9.5.3 this 指針(續(xù))在每一個成員函數(shù)中都包含一個特殊的指針,這個指針的名字是固定的,稱為this。它是指向本類對象的指針,它的值是當(dāng)前被調(diào)用的成員函數(shù)所在的對象的起始地址。例如,當(dāng)調(diào)用

39、成員函數(shù)a.volume時,編譯系統(tǒng)就把對象a的起始地址賦給this指針,于是在成員函數(shù)引用數(shù)據(jù)成員時,就按照this的指向找到對象a的數(shù)據(jù)成員。例如volume函數(shù)要計算height*width*length的值,實際上是執(zhí)行: (this-height)*(this-width)*(this-length)由于當(dāng)前this指向a,因此相當(dāng)于執(zhí)行: (a.height)*(a.width)*(a.length)這就計算出長方體a的體積。同樣如果有b.volume( ),編譯系統(tǒng)就把對象b的起始地址賦給成員函數(shù)volume的this指針,顯然計算出來的是長方體b的體積。9.5.3 this 指

40、針(續(xù))this指針是隱式使用的,它是作為參數(shù)被傳遞給成員函數(shù)的。本來,成員函數(shù)volume的定義如下: int Box:volume( )return (height*width*length); C+把它處理為int Box:volume(Box *this)return(this-height * this-width * this-length); 即在成員函數(shù)的形參表列中增加一個this指針。在調(diào)用該成員函數(shù)時,實際上是用以下方式調(diào)用的: a.volume(&a);將對象a的地址傳給形參this指針。然后按this的指向去引用其他成員。9.5.3 this 指針(續(xù))需要說明: 這些

41、都是編譯系統(tǒng)自動實現(xiàn)的,編程序者不必人為地在形參中增加this指針,也不必將對象a的地址傳給this指針。在需要時也可以顯式地使用this指針。例如在Box類的volume函數(shù)中,下面兩種表示方法都是合法的、相互等價的。return(height * width * length); /隱含使用this指針return(this-height * this-width * this-length); /顯式使用this指針 可以用*this表示被調(diào)用的成員函數(shù)所在的對象,*this就是this所指向的對象,即當(dāng)前的對象。例如在成員函數(shù)a.volume( )的函數(shù)體中,如果出現(xiàn)*this,它就是

42、本對象a。上面的return語句也可寫成 return(*this).height * (*this).width * (*this).length);9.5.3 this 指針(續(xù))注意*this兩側(cè)的括號不能省略,不能寫成*this.height。所謂“調(diào)用對象a的成員函數(shù)f”,實際上是在調(diào)用成員函數(shù)f時使this指針指向?qū)ο骯,從而訪問對象a的成員。在使用“調(diào)用對象a的成員函數(shù)f”時,應(yīng)當(dāng)對它的含義有正確的理解。9.6 共用數(shù)據(jù)的保護(hù)C+雖然采取了不少有效的措施(如設(shè)private保護(hù))以增加數(shù)據(jù)的安全性,但是有些數(shù)據(jù)卻往往是共享的,人們可以在不同的場合通過不同的途徑訪問同一個數(shù)據(jù)對象。

43、有時在無意之中的誤操作會改變有關(guān)數(shù)據(jù)的狀況,而這是人們所不希望出現(xiàn)的。既要使數(shù)據(jù)能在一定范圍內(nèi)共享,又要保證它不被任意修改,這時可以使用const,即把有關(guān)的數(shù)據(jù)定義為常量。9.6.1 常對象在定義對象時指定對象為常對象。常對象必須要有初值,如Time const t1(12,34,46); /t1是常對象這樣,在所有的場合中,對象t1中的所有成員的值都不能被修改。凡希望保證數(shù)據(jù)成員不被改變的對象,可以聲明為常對象。定義常對象的一般形式為類名 const 對象名(實參表列);也可以把const寫在最左面: const 類名 對象名(實參表列);二者等價。9.6.1 常對象(續(xù))如果一個對象被聲

44、明為常對象,則不能調(diào)用該對象的非const型的成員函數(shù)(除了由系統(tǒng)自動調(diào)用的隱式的構(gòu)造函數(shù)和析構(gòu)函數(shù))。例如,對于例9.7中已定義的Time類,如果有const Time t1(10,15,36); /定義常對象t1t1.get_time( ); /企圖調(diào)用常對象t1中的非const型成員函數(shù),非法這是為了防止這些函數(shù)會修改常對象中數(shù)據(jù)成員的值。不能僅依靠編程者的細(xì)心來保證程序不出錯,編譯系統(tǒng)充分考慮到可能出現(xiàn)的情況,對不安全的因素予以攔截?,F(xiàn)在,編譯系統(tǒng)只檢查函數(shù)的聲明,只要發(fā)現(xiàn)調(diào)用了常對象的成員函數(shù),而且該函數(shù)未被聲明為const,就報錯,提請編程者注意。引用常對象中的數(shù)據(jù)成員很簡單,只需

45、將該成員函數(shù)聲明為const即可。如 9.6.1 常對象(續(xù))void get_time( ) const; /將函數(shù)聲明為const這表示get_time是一個const型函數(shù),即常成員函數(shù)。常成員函數(shù)可以訪問常對象中的數(shù)據(jù)成員,但仍然不允許修改常對象中數(shù)據(jù)成員的值。有時在編程時有要求,一定要修改常對象中的某個數(shù)據(jù)成員的值,ANSI C+考慮到實際編程時的需要,對此作了特殊的處理,對該數(shù)據(jù)成員聲明為mutable,如 mutable int count;把count聲明為可變的數(shù)據(jù)成員,這樣就可以用聲明為const的成員函數(shù)來修改它的值。9.6.2 常對象成員可以將對象的成員聲明為const

46、,包括常數(shù)據(jù)成員和常成員函數(shù)。9.6.2 常對象成員(續(xù))1. 常數(shù)據(jù)成員其作用和用法與一般常變量相似,用關(guān)鍵字const來聲明常數(shù)據(jù)成員。常數(shù)據(jù)成員的值是不能改變的。有一點要注意: 只能通過構(gòu)造函數(shù)的參數(shù)初始化表對常數(shù)據(jù)成員進(jìn)行初始化。如在類體中定義了常數(shù)據(jù)成員hour:const int hour; /聲明hour為常數(shù)據(jù)成員不能采用在構(gòu)造函數(shù)中對常數(shù)據(jù)成員賦初值的方法。在類外定義構(gòu)造函數(shù),應(yīng)寫成以下形式: /通過參數(shù)初始化表對常數(shù)據(jù)成員hour初始化Time:Time(int h):hour(h)常對象的數(shù)據(jù)成員都是常數(shù)據(jù)成員,因此常對象的構(gòu)造函數(shù)只能用參數(shù)初始化表對常數(shù)據(jù)成員進(jìn)行初始化

47、。9.6.2 常對象成員(續(xù))2. 常成員函數(shù) 前面已提到: 一般的成員函數(shù)可以引用本類中的非const數(shù)據(jù)成員,也可以修改它們。如果將成員函數(shù)聲明為常成員函數(shù),則只能引用本類中的數(shù)據(jù)成員,而不能修改它們,例如只用于輸出數(shù)據(jù)等。如 void get_time( ) const; /注意const的位置在函數(shù)名和括號之后const是函數(shù)類型的一部分,在聲明函數(shù)和定義函數(shù)時都要有const關(guān)鍵字,在調(diào)用時不必加const。常成員函數(shù)可以引用const數(shù)據(jù)成員,也可以引用非const的數(shù)據(jù)成員。const數(shù)據(jù)成員可以被const成員函數(shù)引用,也可以被非const的成員函數(shù)引用。具體情況可以用書中表9

48、.1表示。怎樣利用常成員函數(shù)呢?9.6.2 常對象成員(續(xù))(1) 如果在一個類中,有些數(shù)據(jù)成員的值允許改變,另一些數(shù)據(jù)成員的值不允許改變,則可以將一部分?jǐn)?shù)據(jù)成員聲明為const,以保證其值不被改變,可以用非const的成員函數(shù)引用這些數(shù)據(jù)成員的值,并修改非const數(shù)據(jù)成員的值。(2) 如果要求所有的數(shù)據(jù)成員的值都不允許改變,則可以將所有的數(shù)據(jù)成員聲明為const,或?qū)ο舐暶鳛閏onst(常對象),然后用const成員函數(shù)引用數(shù)據(jù)成員,這樣起到“雙保險”的作用,切實保證了數(shù)據(jù)成員不被修改。9.6.2 常對象成員(續(xù))(3) 如果已定義了一個常對象,只能調(diào)用其中的const成員函數(shù),而不能調(diào)

49、用非const成員函數(shù)(不論這些函數(shù)是否會修改對象中的數(shù)據(jù))。這是為了保證數(shù)據(jù)的安全。如果需要訪問對象中的數(shù)據(jù)成員,可將常對象中所有成員函數(shù)都聲明為const成員函數(shù),但應(yīng)確保在函數(shù)中不修改對象中的數(shù)據(jù)成員。不要誤認(rèn)為常對象中的成員函數(shù)都是常成員函數(shù)。常對象只保證其數(shù)據(jù)成員是常數(shù)據(jù)成員,其值不被修改。如果在常對象中的成員函數(shù)未加const聲明,編譯系統(tǒng)把它作為非const成員函數(shù)處理。還有一點要指出: 常成員函數(shù)不能調(diào)用另一個非const成員函數(shù)。9.6.3 指向?qū)ο蟮某V羔槍⒅羔樧兞柯暶鳛閏onst型,這樣指針值始終保持為其初值,不能改變。如Time t1(10,12,15),t2; /定義

50、對象/const位置在指針變量名前面,規(guī)定ptr1的值是常值Time * const ptr1; ptr1=&t1; /ptr1指向?qū)ο髏1,此后不能再改變指向ptr1=&t2; /錯誤,ptr1不能改變指向定義指向?qū)ο蟮某V羔樀囊话阈问綖轭惷?* const 指針變量名;也可以在定義指針變量時使之初始化,如將上面第2,3行合并為Time * const ptr1=&t1; /指定ptr1指向t19.6.3 指向?qū)ο蟮某V羔?續(xù))請注意: 指向?qū)ο蟮某V羔樧兞康闹挡荒芨淖儯词冀K指向同一個對象,但可以改變其所指向?qū)ο?如t1)的值。如果想將一個指針變量固定地與一個對象相聯(lián)系(即該指針變量始終指

51、向一個對象),可以將它指定為const型指針變量。往往用常指針作為函數(shù)的形參,目的是不允許在函數(shù)執(zhí)行過程中改變指針變量的值,使其始終指向原來的對象。9.6.4 指向常對象的指針變量為了更容易理解指向常對象的指針變量的概念和使用,首先了解指向常變量的指針變量,然后再進(jìn)一步研究指向常對象的指針變量。下面定義了一個指向常變量的指針變量ptr: const char *ptr;注意const的位置在最左側(cè),它與類型名char緊連,表示指針變量ptr指向的char變量是常變量,不能通過ptr來改變其值的。定義指向常變量的指針變量的一般形式為const 類型名 *指針變量名;9.6.4 指向常對象的指針變

52、量(續(xù))說明: (1) 如果一個變量已被聲明為常變量,只能用指向常變量的指針變量指向它,而不能用一般的(指向非const型變量的)指針變量去指向它。(2) 指向常變量的指針變量除了可以指向常變量外,還可以指向未被聲明為const的變量。此時不能通過此指針變量改變該變量的值。如果希望在任何情況下都不能改變c1的值,則應(yīng)把它定義為const型。(3) 如果函數(shù)的形參是指向非const型變量的指針,實參只能用指向非const變量的指針,而不能用指向const變量的指針,這樣,在執(zhí)行函數(shù)的過程中可以改變形參指針變量所指向的變量(也就是實參指針?biāo)赶虻淖兞?的值。9.6.4 指向常對象的指針變量(續(xù))如

53、果函數(shù)的形參是指向const型變量的指針,在執(zhí)行函數(shù)過程中顯然不能改變指針變量所指向的變量的值,因此允許實參是指向const變量的指針,或指向非const變量的指針。使用形參和實參的對應(yīng)關(guān)系見書中表9.2。以上的對應(yīng)關(guān)系與在(2)中所介紹的指針變量和其所指向的變量的關(guān)系是一致的: 指向常變量的指針變量可以指向const和非const型的變量,而指向非const型變量的指針變量只能指向非const的變量。以上介紹的是指向常變量的指針變量,指向常對象的指針變量的概念和使用是與此類似的,只要將“變量”換成“對象”即可。9.6.4 指向常對象的指針變量(續(xù))(1) 如果一個對象已被聲明為常對象,只能用

54、指向常對象的指針變量指向它,而不能用一般的(指向非const型對象的)指針變量去指向它。(2) 如果定義了一個指向常對象的指針變量,并使它指向一個非const的對象,則其指向的對象是不能通過指針來改變的。如果希望在任何情況下t1的值都不能改變,則應(yīng)把它定義為const型。(3) 指向常對象的指針最常用于函數(shù)的形參,目的是在保護(hù)形參指針?biāo)赶虻膶ο?,使它在函?shù)執(zhí)行過程中不被修改。9.6.4 指向常對象的指針變量(續(xù))請記住這樣一條規(guī)則: 當(dāng)希望在調(diào)用函數(shù)時對象的值不被修改,就應(yīng)當(dāng)把形參定義為指向常對象的指針變量,同時用對象的地址作實參(對象可以是const或非const型)。如果要求該對象不僅在

55、調(diào)用函數(shù)過程中不被改變,而且要求它在程序執(zhí)行過程中都不改變,則應(yīng)把它定義為const型。(4) 如果定義了一個指向常對象的指針變量,是不能通過它改變所指向的對象的值的,但是指針變量本身的值是可以改變的。9.6.5 對象的常引用過去曾介紹: 一個變量的引用就是變量的別名。實質(zhì)上,變量名和引用名都指向同一段內(nèi)存單元。如果形參為變量的引用名,實參為變量名,則在調(diào)用函數(shù)進(jìn)行虛實結(jié)合時,并不是為形參另外開辟一個存儲空間(常稱為建立實參的一個拷貝),而是把實參變量的地址傳給形參(引用名),這樣引用名也指向?qū)崊⒆兞俊?.6.5 對象的常引用(續(xù))例9.8 對象的常引用。#include using name

56、space std;class Timepublic: Time(int,int,int); int hour; int minute; int sec;Time:Time(int h,int m,int s) /定義構(gòu)造函數(shù)9.6.5 對象的常引用(續(xù)) hour=h; minute=m; sec=s;void fun(Time &t) /形參t是Time類對象的引用 t.hour=18;int main( ) Time t1(10,13,56); / t1是Time類對象 /實參是Time類對象,可以通過引用來修改實參t1的值 fun(t1); coutt1.hourendl; /輸出t1

57、.hour的值為18 return 0;9.6.5 對象的常引用(續(xù))如果不希望在函數(shù)中修改實參t1的值,可以把引用變量t聲明為const(常引用),函數(shù)原型為 void fun(const Time &t);則在函數(shù)中不能改變t的值,也就是不能改變其對應(yīng)的實參t1的值。在C+面向?qū)ο蟪绦蛟O(shè)計中,經(jīng)常用常指針和常引用作函數(shù)參數(shù)。這樣既能保證數(shù)據(jù)安全,使數(shù)據(jù)不能被隨意修改,在調(diào)用函數(shù)時又不必建立實參的拷貝。用常指針和常引用作函數(shù)參數(shù),可以提高程序運行效率。9.6.6 const型數(shù)據(jù)的小結(jié)表9.3形式含義Time const t1; t1是常對象,其值在任何情況下都不能改變void Time:f

58、un( )constfun是Time類中的常成員函數(shù),可以引用,但不能修改本類中的數(shù)據(jù)成員Time * const p;p是指向Time對象的常指針,p的值(即p的指向)不能改變const Time *p;p是指向Time類常對象的指針,其指向的類對象的值不能通過指針來改變Time &t1=t;t1是Time類對象t的引用,二者指向同一段內(nèi)存空間9.7 對象的動態(tài)建立和釋放用前面介紹的方法定義的對象是靜態(tài)的,在程序運行過程中,對象所占的空間是不能隨時釋放的。但有時人們希望在需要用到對象時才建立對象,在不需要用該對象時就撤銷它,釋放它所占的內(nèi)存空間以供別的數(shù)據(jù)使用。這樣可提高內(nèi)存空間的利用率。在

59、第7章7.1.7節(jié)中介紹了用new運算符動態(tài)地分配內(nèi)存,用delete運算符釋放這些內(nèi)存空間。這也適用于對象,可以用new運算符動態(tài)建立對象,用delete運算符撤銷對象。如果已經(jīng)定義了一個Box類,可以用下面的方法動態(tài)地建立一個對象: 9.7 對象的動態(tài)建立和釋放(續(xù))new Box;編譯系統(tǒng)開辟了一段內(nèi)存空間,并在此內(nèi)存空間中存放一個Box類對象,同時調(diào)用該類的構(gòu)造函數(shù),以使該對象初始化(如果已對構(gòu)造函數(shù)賦予此功能的話)。但是此時用戶還無法訪問這個對象,因為這個對象既沒有對象名,用戶也不知道它的地址。這種對象稱為無名對象,它確實是存在的,但它沒有名字。用new運算符動態(tài)地分配內(nèi)存后,將返回

60、一個指向新對象的指針的值,即所分配的內(nèi)存空間的起始地址。用戶可以獲得這個地址,并通過這個地址來訪問這個對象。需要定義一個指向本類的對象的指針變量來存放該地址。如Box *pt; /定義一個指向Box類對象的指針變量ptpt=new Box; /在pt中存放了新建對象的起始地址9.7 對象的動態(tài)建立和釋放(續(xù))在程序中就可以通過pt訪問這個新建的對象。如 coutheight; /輸出該對象的height成員/調(diào)用該對象的volume函數(shù),計算并輸出體積coutvolume( ); C+還允許在執(zhí)行new時,對新建立的對象進(jìn)行初始化。如 Box *pt=new Box(12,15,18);這種寫

溫馨提示

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

評論

0/150

提交評論