乙個例子記住C 物件的生存週期

2021-09-30 19:12:01 字數 1840 閱讀 5357

**說明:

類a,含建構函式和析構函式

普通函式fun,函式體裡新建了類a的區域性自動物件funobj和區域性靜態物件instaobj

main方法新建了類a的區域性自動物件mainobj,呼叫fun方法

外面新建了a的的外部靜態物件exstaobj和外部物件gblobj

#include

#include

using namespace std;

class a {

char string[50];

public :

a(char * st);

~a( );

a::a(char * st)

strcpy(string, st);

cout << string << "被建立時呼叫建構函式 ! " << endl;

a::~a( )

cout << string <<

"被撤消時呼叫析構函式 ! " << endl;

void fun( )

cout << "在fun( )函式體內 : \n" << endl;

a funobj("fun( )函式體內的自動物件funobj");

static a instaobj("內部靜態物件instaobj");

int main( )

a mainobj("主函式體內的自動物件mainobj");

cout<

fun( );

cout << "\n主函式體內,呼叫fun()函式後:\n";

return 0;

static a exstaobj("外部靜態物件exstaobj");

a gblobj("外部物件gblobj");

輸出:

外部靜態物件exstaobj被建立時呼叫建構函式 !

外部物件gblobj被建立時呼叫建構函式 !

主函式體內的自動物件mainobj被建立時呼叫建構函式 !

主函式體內,呼叫fun()函式前:

在fun( )函式體內 :

fun( )函式體內的自動物件funobj被建立時呼叫建構函式 !

內部靜態物件instaobj被建立時呼叫建構函式 !

fun( )函式體內的自動物件funobj被撤消時呼叫析構函式 !

主函式體內,呼叫fun()函式後:

主函式體內的自動物件mainobj被撤消時呼叫析構函式 !

內部靜態物件instaobj被撤消時呼叫析構函式 !

外部物件gblobj被撤消時呼叫析構函式 !

外部靜態物件exstaobj被撤消時呼叫析構函式 !

若將a gblobj("外部物件gblobj"); 寫在static a exstaobj("外部靜態物件exstaobj");前面,則輸出時兩者順序也顛倒。

(1)建立順序

外部靜態物件or外部物件優先於main函式

(2)銷毀順序

和建立順序相反,注意靜態物件會在main函式執行完才會銷毀

(1)從靜態儲存區分配:此時的內存在程式編譯的時候已經分配好,並且在程式的整個執行期間都存在。全域性變數,static變數等在此儲存

(2)在棧區分配:相關**執行時建立,執行結束時被自動釋放。區域性變數在此儲存。棧記憶體分配運算內置於處理器的指令集中,效率高,但容量有限

(3)在堆區分配:動態分配記憶體。用new/malloc時開闢,delete/free時釋放。生存期由使用者指定,靈活。但有記憶體洩露等問題

乙個例子記住C 物件的生存週期

標籤 c examples 說明 include include using namespace std class a a a char st a a void fun int main static a exstaobj 外部靜態物件exstaobj a gblobj 外部物件gblobj 輸出...

php 物件導向的乙個例子

複製 如下 php class person 下面是人的成員方法 function say 這個人可以說話的方法 function run 這個人可以走路的方法 這是乙個析構函adhctbj數,在物件銷毀前呼叫 function destruct 通過構造方法建立3個物件 p1,分別傳入三個不同的實...

C 多型的乙個例子

class a virtual void f2 static void f3 virtual void f4 class b virtual void f2 static void f3 virtual void f4 int main 執行結果 a f1 b f1 a f3 b f2 分析 類的成...