C++中對象的常引用、動態(tài)建立和釋放相關(guān)知識講解
C++對象的常引用
我們知道,一個變量的引用就是變量的別名。實質(zhì)上,變量名和引用名都指向同一段內(nèi)存單元。
如果形參為變量的引用名,實參為變量名,則在調(diào)用函數(shù)進行虛實結(jié)合時,并不是為形參另外開辟一個存儲空間(常稱為建立實參的一個拷貝), 而是把實參變量的地址傳給形參(引用名),這樣引用名也指向?qū)崊⒆兞俊?/p>
[例] 對象的常引用。
#include <iostream> using namespace std; class Time { public: Time(int,int,int); int hour; int minute; int sec; }; Time::Time(int h,int m,int s) //定義構(gòu)造函數(shù) { hour=h; minute=m; sec=s; } void fun(Time &t) { t.hour=18; } int main( ) { Time t1(10,13,56); fun(t1); cout<<t1.hour<<endl; return 0; }
如果不希望在函數(shù)中修改實參t1的值,可以把引用變量t聲明為const(常引用),函數(shù)原型為
void fun(const Time &t);
則在函數(shù)中不能改變t的值,也就是不能改變其對應的實參t1的值。
在C++面向?qū)ο蟪绦蛟O(shè)計中,經(jīng)常用常指針和常引用作函數(shù)參數(shù)。這樣既能保證數(shù)據(jù)安全,使數(shù)據(jù)不能被隨意修改,在調(diào)用函數(shù)時又不必建立實參的拷貝。
每次調(diào)用函數(shù)建立實參的拷貝時,都要調(diào)用復制構(gòu)造函數(shù),要有時間開銷。用常指針和常引用作函數(shù)參數(shù),可以提高程序運行效率。
C++對象的動態(tài)建立和釋放
使用類名定義的對象都是靜態(tài)的,在程序運行過程中,對象所占的空間是不能隨時釋放的。但有時人們希望在需要用到對象時才建立對象,在不需要用該對象時就撤銷它,釋放它所占的內(nèi)存空間以供別的數(shù)據(jù)使用。這樣可提高內(nèi)存空間的利用率。
在C++中,可以使用new運算符動態(tài)地分配內(nèi)存,用delete運算符釋放這些內(nèi)存空間。這也適用于對象,可以用new運算符動態(tài)建立對象,用delete運算符撤銷對象。
如果已經(jīng)定義了一個Box類,可以用下面的方法動態(tài)地建立一個對象:
new Box;
編譯系統(tǒng)開辟了一段內(nèi)存空間,并在此內(nèi)存空間中存放一個Box類對象,同時調(diào)用該類的構(gòu)造函數(shù),以使該對象初始化(如果已對構(gòu)造函數(shù)賦予此功能的話)。
但是此時用戶還無法訪問這個對象,因為這個對象既沒有對象名,用戶也不知道它的地址。這種對象稱為無名對象,它確實是存在的,但它沒有名字。
用new運算符動態(tài)地分配內(nèi)存后,將返回一個指向新對象的指針的值,即所分配的內(nèi)存空間的起始地址。用戶可以獲得這個地址,并通過這個地址來訪問這個對象。需要定義一個指向本類的對象的指針變量來存放該地址。如
Box *pt; //定義一個指向Box類對象的指針變量pt pt=new Box; //在pt中存放了新建對象的起始地址
在程序中就可以通過pt訪問這個新建的對象。如
cout<<pt->height; //輸出該對象的height成員 cout<<pt->volume( ); //調(diào)用該對象的volume函數(shù),計算并輸出體積
C++還允許在執(zhí)行new時,對新建立的對象進行初始化。如
Box *pt=new Box(12,15,18);
這種寫法是把上面兩個語句(定義指針變量和用new建立新對象)合并為一個語句,并指定初值。這樣更精煉。
新對象中的height,width和length分別獲得初值12,15,18。調(diào)用對象既可以通過對象名,也可以通過指針。
用new建立的動態(tài)對象一般是不用對象名的,是通過指針訪問的,它主要應用于動態(tài)的數(shù)據(jù)結(jié)構(gòu),如鏈表。訪問鏈表中的結(jié)點,并不需要通過對象名,而是在上一個結(jié)點中存放下一個結(jié)點的地址,從而由上一個結(jié)點找到下一個結(jié)點,構(gòu)成鏈接的關(guān)系。
在執(zhí)行new運算時,如果內(nèi)存量不足,無法開辟所需的內(nèi)存空間,目前大多數(shù)C++編譯系統(tǒng)都使new返回一個0指針值。只要檢測返回值是否為0,就可判斷分配內(nèi)存是否成功。
ANSI C++標準提出,在執(zhí)行new出現(xiàn)故障時,就“拋出”一個“異?!?,用戶可根據(jù)異常進行有關(guān)處理。但C++標準仍然允許在出現(xiàn)new故障時返回0指針值。當前,不同的編譯系統(tǒng)對new故障的處理方法是不同的。
在不再需要使用由new建立的對象時,可以用delete運算符予以釋放。如
delete pt; //釋放pt指向的內(nèi)存空間
這就撤銷了pt指向的對象。此后程序不能再使用該對象。
如果用一個指針變量pt先后指向不同的動態(tài)對象,應注意指針變量的當前指向,以免刪錯了對象。在執(zhí)行delete運算符時,在釋放內(nèi)存空間之前,自動調(diào)用析構(gòu)函數(shù),完成有關(guān)善后清理工作。
相關(guān)文章
C語言string庫strcpy、strcmp、strcat函數(shù)的使用
這篇文章主要介紹了C語言string庫strcpy、strcmp、strcat函數(shù)的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02