C 類(二) 建構函式和析構函式

2022-07-06 16:54:10 字數 3155 閱讀 5052

int years = 2001

;struct

thing

;thing amabob = ; //

valid intialization

stock hot = ; //

no! compiler error

c++ 不能像初始化 years, amabob一樣,初始化hot。原因是資料隱藏:資料部分的訪問是私有的。因此,c++提供了一類特殊的成員函式-類建構函式,專門用於構造新物件,將值賦給它們的資料成員。

1. 宣告和定義建構函式

建構函式的原型和函式名稱與類名相同,雖然沒有返回值,但沒有宣告為void型別。實際上,建構函式沒有宣告型別。

1

//construct definition

2 stock::stock(const

string &co, long n, double

pr)3

10else

11 shares =n;

12 share_val =pr;

13set_tot();

14 }

程式宣告物件時,將自動呼叫建構函式。

2. 使用建構函式

(1)顯式建構函式

1 stock food = stock("

word cabbage

", 250, 1.25);

(2)隱式建構函式

1 stock garment("

furry mason

", 50, 2.5);

(3)new 動態分配記憶體,建立物件

1 stock *pstock = new stock("

electroshock games

", 18, 19.0);

這條語句建立乙個stock物件,將其初始化為引數提供的值,並將該物件的位址賦給 pstock 指標。在這種情況下,物件沒有名稱,但可以使用指標來管理該物件。

3. 預設建構函式

預設建構函式是在未提供顯示初始值時,用來建立物件的建構函式。也就是說,它是用於下面這種宣告的建構函式

stock fluffy_the_cat;  //

uses the default constructor

這條語句合法的原因在於,如果沒有提供任何建構函式,c++將提供預設建構函式。它是預設建構函式的隱式版本,不做任何工作。對於stock類來說,預設建構函式可能如下:

1 stock::stock(){}

【注】當且僅當沒有定義任何建構函式時,編譯器才會提供建構函式。為類定義類建構函式,程式設計師必須為它提供預設建構函式。如果提供類非預設建構函式(如 stock::stock(const char *co, int n, double pr)), 但沒有提供預設建構函式,則下面的宣告將出錯

class

stock

;// 編譯器報錯

stock::stock(

const

char* co, int n, double

pr)

下面是正確的

1

class

stock2;

8 stock(const

char* co, int n, double

pr);9};

1011

stock::stock(){}

12 stock::stock(const

char* co, int n, double

pr)13

4. 析構函式

~加上類名為析構函式,如

1 stock::~stock(){}

【注】(1)如果建立的物件是static型別的,則其西溝函式將在程式結束時自動被呼叫

(2)如果物件是通過new建立的,則它將駐留在棧記憶體或自由儲存區中,當使用 delete來釋放記憶體時,其析構函式將自動被呼叫。如果建構函式使用了 new, 則必須提供使用 delete的函式。

(3)如果物件是臨時建立的,程式將在結束時自動呼叫其析構函式

5. const 成員函式

1

-- stock class declaration with constructors, destructor added

2#ifndef stock10_h_

3#define stock10_h_

4class

stock512

public:13

//two constructors

14 stock(); //

default constructor

15 stock(const std::string &co, long n = 0, double pr = 0.0

);16 ~stock();

17void buy(long num, double

price);

18void sell(long num, double

price);

19void update(long num, double

price);

20void

show();

21};

22#endif

以上為stock類的原始宣告, 以下**將會發生編譯器報錯

1

const stock land = stock("

kludgehorn properties");

2 land.show(); //

編譯器報錯

line2的**將會發生編譯器報錯,因為stock類的原始宣告(stock10.h中的line 20)的show() **不能確保呼叫物件不被修改

【解決方案】以下列方式成名和定義的類函式被稱為 const 成員函式。

1

2void show() const; 3

4void stock::show() const ;

C 類建構函式 析構函式

類的建構函式是類的一種特殊的成員函式,它會在每次建立類的新物件時執行。建構函式的名稱與類的名稱是完全相同的,並且不會返回任何型別,也不會返回 void。建構函式可用於為某些成員變數設定初始值。下面的例項有助於更好地理解建構函式的概念 include using namespace std class...

C 類建構函式 析構函式

類的建構函式是類的一種特殊的成員函式,它會在每次建立類的新物件時執行。建構函式的名稱與類的名稱是完全相同的,並且不會返回任何型別,也不會返回 void。建構函式可用於為某些成員變數設定初始值。下面的例項有助於更好地理解建構函式的概念 include using namespace std class...

C 類建構函式 析構函式

類的建構函式是類的一種特殊的成員函式,它會在每次建立類的新物件時執行。建構函式的名稱與類的名稱是完全相同的,並且不會返回任何型別,也不會返回 void。建構函式可用於為某些成員變數設定初始值。下面的例項有助於更好地理解建構函式的概念 include using namespace std class...