簡略講授C++的外部和內部函數和宏的界說。本站提示廣大學習愛好者:(簡略講授C++的外部和內部函數和宏的界說)文章只能為提供參考,不一定能成為您想要的結果。以下是簡略講授C++的外部和內部函數和宏的界說正文
C++對象的常援用
我們曉得,一個變量的援用就是變量的別號。本質上,變量名和援用名都指向統一段內存單位。
假如形參為變量的援用名,實參為變量名,則在挪用函數停止真假聯合時,其實不是為形參別的開拓一個存儲空間(常稱為樹立實參的一個拷貝), 而是把實參變量的地址傳給形參(援用名),如許援用名也指向實參變量。
[例] 對象的常援用。
#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) //界說結構函數 { 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; }
假如不願望在函數中修正實參t1的值,可以把援用變量t聲明為const(常援用),函數原型為
void fun(const Time &t);
則在函數中不克不及轉變t的值,也就是不克不及轉變其對應的實參t1的值。
在C++面向對象法式設計中,常常用常指針和常援用作函數參數。如許既能包管數據平安,使數據不克不及被隨便修正,在挪用函數時又不用樹立實參的拷貝。
每次挪用函數樹立實參的拷貝時,都要挪用復制結構函數,要有時光開支。用常指針和常援用作函數參數,可以進步法式運轉效力。
C++對象的靜態樹立和釋放
應用類名界說的對象都是靜態的,在法式運轉進程中,對象所占的空間是不克不及隨時釋放的。但有時人們願望在須要用到對象時才樹立對象,在不須要用該對象時就撤消它,釋放它所占的內存空間以供其余數據應用。如許可進步內存空間的應用率。
在C++中,可使用new運算符靜態地分派內存,用delete運算符釋放這些內存空間。這也實用於對象,可以用new運算符靜態樹立對象,用delete運算符撤消對象。
假如曾經界說了一個Box類,可以用上面的辦法靜態地樹立一個對象:
new Box;
編譯體系開拓了一段內存空間,並在此內存空間中寄存一個Box類對象,同時挪用該類的結構函數,以使該對象初始化(假如已對結構函數付與此功效的話)。
然則此時用戶還沒法拜訪這個對象,由於這個對象既沒有對象名,用戶也不曉得它的地址。這類對象稱為無名對象,它確切是存在的,但它沒著名字。
用new運算符靜態地分派內存後,將前往一個指向新對象的指針的值,即所分派的內存空間的肇端地址。用戶可以取得這個地址,並經由過程這個地址來拜訪這個對象。須要界說一個指向本類的對象的指針變量來寄存該地址。如
Box *pt; //界說一個指向Box類對象的指針變量pt pt=new Box; //在pt中寄存了新建對象的肇端地址
在法式中便可以經由過程pt拜訪這個新建的對象。如
cout<<pt->height; //輸入該對象的height成員 cout<<pt->volume( ); //挪用該對象的volume函數,盤算並輸入體積
C++還許可在履行new時,對新樹立的對象停止初始化。如
Box *pt=new Box(12,15,18);
這類寫法是把下面兩個語句(界說指針變量和用new樹立新對象)歸並為一個語句,並指定初值。如許更精華精辟。
新對象中的height,width和length分離取得初值12,15,18。挪用對象既可以經由過程對象名,也能夠經由過程指針。
用new樹立的靜態對象普通是不消對象名的,是經由過程指針拜訪的,它重要運用於靜態的數據構造,如鏈表。拜訪鏈表中的結點,其實不須要經由過程對象名,而是在上一個結點中寄存下一個結點的地址,從而由上一個結點找到下一個結點,組成鏈接的關系。
在履行new運算時,假如內存量缺乏,沒法開拓所需的內存空間,今朝年夜多半C++編譯體系都使new前往一個0指針值。只需檢測前往值能否為0,便可斷定分派內存能否勝利。
ANSI C++尺度提出,在履行new湧現毛病時,就“拋出”一個“異常”,用戶可依據異常停止有關處置。但C++尺度依然許可在湧現new毛病時前往0指針值。以後,分歧的編譯體系對new毛病的處置辦法是分歧的。
在不再須要應用由new樹立的對象時,可以用delete運算符予以釋放。如
delete pt; //釋放pt指向的內存空間
這就撤消了pt指向的對象。爾後法式不克不及再應用該對象。
假如用一個指針變量pt前後指向分歧的靜態對象,應留意指針變量確當前指向,以避免刪錯了對象。在履行delete運算符時,在釋放內存空間之前,主動挪用析構函數,完成有關善後清算任務。