12.面向對象程序設計_第1頁
12.面向對象程序設計_第2頁
12.面向對象程序設計_第3頁
12.面向對象程序設計_第4頁
12.面向對象程序設計_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、l C+提供特殊的操作符new delete能方便的使用空閑存儲空間。l 這些特殊的操作符使用了較底層的例程例如 malloc和free或其它操作系統(tǒng)提供的過程來管理空閑內(nèi)存。l 然而,內(nèi)置操作對某個應用程序來說可能是不適當?shù)幕虻仔实?。l譬如:有時希望使用某種特殊的動態(tài)內(nèi)存分配方法。(對一些分配子程序,它們能在堆耗盡時,自動開始把一個磁盤文件當作虛存使用,或用戶希望控制某一片存儲空間等)l 這時,需要對new和delete進行重載。l 重載函數(shù)new和delete的框架如下:l void * operator new(size_t size)l /進行分配 l return 被分配內(nèi)存空間的

2、地址 ll void operator delete(void *p)l ./釋放由p指向的存儲空間ll說明:類型size_t是一個包含在stddef.h中的typedef,它是由C+定義為能容納可分配的單一的存儲塊的最大值。它往往是個整型類型。l一 局部重載new和delete l 要重載一個與類相關的new和delete函數(shù),只需要使重載運算符函數(shù)成為該類的成員函數(shù)。l 例:class vector2Dl int x,y; l public:l vector2D(int a,int b);l vector2D( );l void *operator new(size_t size);l v

3、oid operator delete(void *p);l ;l vector2D:vector2D(int a,int b)l x=a;y=b;l cout“constructing”endl; l l vector2D:vector2D( )l cout“destructing”endl;l void * vector2D:operator new(size_t size)l cout“new vector2D”endl;l return malloc(size);l l void vector2D:operator delete(void *p)l cout“vector2D dele

4、te”endl;l free(p);l l main( )l vector2D *p;l p=new vector2D(1,2);l int *q;l q=new int;l delete p;l delete q;ll問題1. 構造函數(shù),析構函數(shù),重載new以 l 及delete的執(zhí)行順序l 2.重載new以及delete是靜態(tài)函數(shù)還是依附于l 它的宿主對象的普通成員函數(shù)。l注意:new int 和delete q使用的是全局版本。 new vector2Dconstructing destructing vector2D deletel 二 全局重載new和deletel 可以在任何類說明

5、之外重載new和delete,使它們成為全局的。當new和delete被全局重載時,C+原來的new和delete被忽略,并且重載運算符用于所有的分配要求。l例:void *operator new(size_t size)l cout“constructing”endl;l malloc(size);.l void operator delete(void *p)l cout“destructing”endl;l free(p); l main( )l vector2D *p;l p=new vector2D(1,2);l delete p;l int *q;l q=new int;l de

6、lete q;ll考慮輸出? constructing constructing destructing destructing constructing destructingl 重載new和delete的功能為用戶提供了使用存儲區(qū)的靈活性。l 注意:重載全局的new和delete是一個危險的措施。在應用程序中,一般采用控制某些對象動態(tài)的分配方法即局部重載。l 類型轉換就是將一種類型的值轉換為另一種類型的值。C+語言允許的類型轉換有4種:l 標準類型標準類型l 標準類型類類型l 類類型標準類型l 類類型類類型l 類被視為用戶定義的類型,可以象系統(tǒng)預定義類型一樣進行類型轉換。l 對于標準類型,

7、C+提供了兩種類型轉換:l 1 隱式類型轉換l 2 顯式類型轉換l隱式類型轉換發(fā)生在下述情況:l 混合運算:級別低的向級別高的轉換;l 將表達式的值賦給變量:表達式的值向變 l 量類型的值轉換。l 實參向形參傳值:實參的值向形參的值轉換。l 函數(shù)返回結果:返回的值向函數(shù)返回類型的l 值進行轉換。l 2 顯式類型轉換l (類型名)表達式l 或 (類型名)(表達式)l 或函數(shù)法 : 類型名(表達式)l 例如: int i=int(1.3); l float f=1.2;l int k=int(f);l int a=1;l int *p=&a;l char *q;l q=(char *)p;

8、l char short int long float double 低 高 l 標準類型轉換為類類型l 可以通過自定義的重載賦值號“=”的函數(shù)和構造函數(shù)實現(xiàn)標準類型類類型;它們都需要有標準類型的參數(shù)。l class Xl public:l X(int );l X(const char*,int=0);l l void f(X arg)l l X b=“abcdef”;l X a=3;l l 其中 構造函數(shù)X(int)將整數(shù)類型轉換為類類型X;構造函數(shù)X(const char *,int=0)將字符串轉換為類類型Xl 注意:當X的構造函數(shù)不進行這個轉換時,該轉換失敗。l 例如:class X

9、class Yl public: public:l X(int); Y(X);l ; ;l void f( )l X objX=1; / intXl Y objY=objX; / XYl Y obj=1; /?l l 類Y沒有構造函數(shù)Y(int),因此不進行轉換 l 考慮: 如何保證不發(fā)生并不期望的隱式轉換?l class vector vector(int k); public: static vector make(int s) vector v=s; return v; friend vector fmake(int s) vector v=s; return v; l void f(

10、)l vector v1=vector:make(1);l vector v2=fmake(2);l v1=5; /?l v1=vector:make(10);l 構造函數(shù)vector(int )屬于私有段,在公有段設置一個statice函數(shù)或設置一個友元函數(shù)來調用這個構造函數(shù)。這樣,構造函數(shù)是私有的,避免了不期望的隱式轉換。l 類類型轉換函數(shù)類類型轉換函數(shù)l 帶一個參數(shù)的構造函數(shù)可以進行類型轉換,但是轉換功能很受限制。若我們要把一個類轉換為基本類型,采用這種方式就辦不到。因此,需要引入一種特殊的成員函數(shù):類型轉換函數(shù),它在類對象之間提供一種類似顯示類型轉換的機制。l X:operator t

11、ype( )l .l return type 類型的實例;l l 這個函數(shù)沒有參數(shù),沒有返回類型,但這個函數(shù)體內(nèi)必須有一條返回語句,返回一個type類型的實例。類型轉換函數(shù)的功能是將類型為X的對象轉換為type的實例。l例如:class Xl int x;l public:l operator int( )l return x;l ;l void f(X a)l int i=int(a);l i=(int)a;l i=a;l 三種情況,所賦的值都是由X:operator int( )來進行轉換。均是執(zhí)行a.operator int( );l 至此,我們知道l 類類型標準類型 使用類型轉換函數(shù)l 標準類型類類型 使用構造函數(shù)l 我們考慮,若一個類既有用于轉換的構造函數(shù),又有類型轉換函數(shù):l X(int);l operator int( );l 語句 a=a+i是否合法?如何解釋?l l 我們可以將a+i這樣解釋嗎?l a.operator int( )+il 將a轉換得到一個整數(shù)與i相加后得到一個整型結果,再用X(int)

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論