類的建構函式(C )

2021-08-28 05:10:50 字數 3174 閱讀 1075

對於stock類,還有其他的一些工作要做。應為類提供被稱為建構函式和析構函式的標準函式。

類不能像結構一樣初始化,原因在於,資料部分的訪問狀態是私有的,這意味著程式不能直接訪問資料成員。程式只能通過成員函式來訪問資料成員,因此需要設計合適的成員函式,才能成功地將物件初始化(如果使資料成員成為公有,而不是私有,就可以按照結構一樣初始化類物件,但使資料稱為公有的違背了類的乙個主要初衷:資料隱藏)。

一般來說,最好是在建立物件時對它進行初始化。就stock類當前的實現而言,gift物件的company成員是沒有值的。類設計假設使用者在呼叫任何其他成員函式之前呼叫acquire(),但無法強加這種假設。避開這種問題的方法之一是在建立物件時,自動對它進行初始化。為此,c++提供了乙個特殊的成員函式——類建構函式,專門用於構造新物件、將值賦給它們的資料成員。更準確地說,c++為這些成員函式提供了名稱和使用語法,而程式設計師需要提供方法定義。名稱於類名相同。例如,stock類乙個可能的建構函式是名為stock()的成員函式。建構函式的原型和函式頭有乙個有趣的特徵——雖然沒有返回值,但沒有被宣告為void型別。實際上,建構函式沒有宣告型別。

現在需要建立stock的建構函式。由於需要為stock物件提供3個值,因此應為建構函式提供3個引數。程式可能只想設定company成員,而將其他值設定為0;這可以使用預設引數來完成。因此,原型如下:

stock(const string &co, long n = 0, double pr = 0.0);
第乙個引數是指向字串的指標,該字串用於初始化成員company。n和pr引數為shares和share_val成員提供值。注意,沒有返回型別。原型位於類宣告的公有部分。

stock::stock(const string &co, long n, double pr) 

else shares = n;

share_val = pr;

set_tot();

}

上述**和前面的函式acquire()相同。區別在於,程式宣告物件時,將自動呼叫建構函式。

注意:不能將類成員名稱用作建構函式的引數名,建構函式的引數表示的不是類成員,而是賦給類成員的值。否則最終的**將是這樣的:

shares = shares;
為避免這種混亂,一種常見的做法是在資料成員名中使用m_字首,另一種的做法是,在成員名中使用字尾_。

c++提供了兩種使用建構函式來初始化物件的方式。第一種方式是顯式地呼叫建構函式:

stock food = stock("world cabbage", 250 ,1.25);
另一種方法是隱式地呼叫建構函式:

stock garment("furry mason", 50 , 2.5);	//等於stock garment = stock("furry mason", 50 , 2.5);
每次建立類物件(甚至使用new動態分配記憶體)時,c++都是哦那個類建構函式。下面是將建構函式與new一起使用的方法:

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

建構函式的使用方式不同於其他類方法。一般來說,使用物件來呼叫方法,但無法使用物件來呼叫建構函式,因為在建構函式構造出物件之前,物件是不存在的。因此建構函式被用來建立物件,而不能通過物件來呼叫。

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

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

stock::stock()
因此將建立fluffy_the_cat物件,但不初始化其成員。預設建構函式沒有引數,因為宣告中不包含值。

奇怪的是,當且僅當沒有定義任何建構函式時,編譯器才會提供預設建構函式。為類定義了建構函式後,程式設計師就必須為它提供預設建構函式。如果提供了非預設建構函式,但沒有提供預設建構函式,則下面的宣告將出錯:

stock stock1;
這樣做的原因可能是想禁止建立未初始化的物件。然而,如果要建立物件,而不顯式地初始化,則必須定義乙個不接受任何引數地預設建構函式。定義預設建構函式地方式有兩種。一種是給已有建構函式地所有引數提供預設值。

stock(const string &co = "error", long n = 0, double pr = 0.0);
另一種方式是通過函式過載來定義另乙個建構函式——乙個沒有引數地建構函式。

由於只能有乙個預設建構函式,因此不要同時使用這兩種方式。實際上,通常應初始化所有的物件,以確保所有成員一開始就有已知的合理值。因此,使用者定義的預設建構函式通常給所有成員提供隱式初始值。例如:

stock::stock()

使用上述任何一種方式(沒有引數或所有引數都有預設值)建立了預設建構函式後,便可以宣告物件變數,而不對它們進行顯式初始化:

stock first;	//call default constructor implicitly

stock first = stock(); //call it explicitly

stock *prelief = new stock; //call it implicitly

然而,不要被非預設建構函式的隱式形式所誤導:

stock first("concrete conglomerate");	//call constructor

stock second(); //declares a function

stock third; //call default constructor

第乙個宣告呼叫非預設建構函式,即接受引數的建構函式;第二個宣告指出,second()是乙個返回stock物件的函式。隱式地呼叫預設建構函式時,不要使用圓括號。

C 類的建構函式

第一次寫部落格,有點不知從哪點下手,還是先記錄一下最近看的c 有關類的建構函式方面的知識吧。首先,類的建構函式是在類的定義時就直接對該類物件的成員變數進行初始化,建構函式的函式名與類名相同且沒有返回值,建構函式不能被子類繼承,也不能宣告為虛函式,在子類中必須重新定義建構函式,但建構函式可以進行過載,...

C 類的建構函式

1.什麼是建構函式?2.怎麼寫建構函式?3.什麼是預設建構函式。4.建構函式的簡單應用。下面我們就這具體來解決這幾個問題 1.什麼是建構函式?2.怎麼寫建構函式?怎麼寫建構函式我們就從 來演示吧 class fruits fruits int price fruits char name,int p...

C 類的建構函式

c 類的建構函式是類的成員函式,在建立類時,會自動生成乙個預設建構函式,執行時自動呼叫,如果不對預設建構函式進行修改,則不執行任何功能。一般可用建構函式進行成員變數的初始化。使用自定義建構函式可以對其進行傳參,在呼叫時根據傳入引數選擇所使用的建構函式。同時可通過初始化列表方式對引數進行初始化。cla...