該語句說明了一個名為day的數組,該數組有十個元素,且每個元素都是Date類型的對象。

在main()函數中,我們說明了一個Date類型的數組day[3]。該數組的三個元素day[0],day[1],day[2]都是Date類型的對象。

二、初始化對象數組

在說明對象數組的同時,還可以為其提供初始值。如果將例6.6的main()函數改為如下的形式:

三、對象數組和缺省構造函數

如果在聲明數組時,沒有為其提供初始值,編譯器在創建這個數組元素時將自動調用缺省構造函數。即相應的類應該有一個缺省的構造函數(亦即不帶參數的構造函數),該缺省的構造函數要麼是編譯器自動生成的,要麼是用戶自己定義,否則編譯器會給出出錯信息。例如,將例5.6的main()函數改為如下的形式:

在說明對象數組dayl[3]時,我們沒有為其提供任何初始值,所以,編譯器為數組的三個元素調用缺省的構造函數Date()。該缺省構造函數把它們的值都賦值為1,1,1900。

在說明對象數組day2[3]時,我們為前兩個數組元素提供了初始值,但沒有為它的第三個元素提供初始值。這樣,編譯器就為前兩個元素day2[0]和day2[1]調用構造函數Date(int,im,int),實際參數分別為1,1,1980和3,20,1990;而為第三個元素day2[2]調用缺省的構造函數Date()。所以,它們的值分別為:(1,1,1980)、(3,20,1990)和(1,1,1900)。

由此可見,在創建對象數組時,缺省構造函數用於下述兩種情況:

1.在沒有為對象數組的元素提供任何初始值時,編譯器為數組的每個元素調用一次缺省構造函數。

2.在沒有為對象數組的所有元素提供初始值時,編譯器為那些沒有被提初始值的數組元素調用缺省構造函數。

四、對象數組和new,delete

可以通過運算符new動態地分配一個對象數組,然後再通過運算符delete來釋放這個數組。假設有類Myclass,則操作形式為:

Myclass1p=newMyclass[5];

由此可見,在創建對象數組和動態對象時,缺省構造函數用於下述四種情況:

1.如果沒有為對象數組提供任何初始值,C++將為每個數組元素調用一次缺省構造函數。

2.如果為對象數組提供的初始值不完全,C++將為那些沒有初始值的數組元素調用缺省構造函數。

3.當用1運算符分配一個動態對象時,如果沒有提供初始值,C++將為該動態對象調用缺省構造函數。

4.當用new運算符分配一個動態對象數組時,不允許提供任何初始值。C++將為動態對象數組的每個元素調用一次缺省構造函數。

6.5對象指針

對象指針是指向對象的指針。例如:Myplass*ptr;指針變量ptr是指向Myclass類型對象的指針。所以,它是一個對象指針。當需要訪問對象指針所指向的對象成員時,應使用成員訪問運算符(->)。

本例中,聲明了一個Myclass類型的對象ob,同時,還聲明了指針對象ptr,它的類型為Myclass*。在建立指針對象時,不執行Myclass類的構造函數。所以,語句ptr=&ob;使指針對象ptr指向對象ob,這樣,表達式*ptr就標識對象ob。因此,語句ptr->Show()調用的是對象ob的成員函數Show()。該函數顯示數據成員value的值。

對象指針的一個重要用法是通過它訪問對象數組的各個元素。

本例中,air是有三個元素的Myclass類型的對象數組,ptr是指向Myclass類型對象的指針。語句ptr=arr;把數組arr的起始地址賦給ptr。(注意,數組arr的起始地址是arr,而不是&aiT。)

然後,通過一個for循環語句訪問數組的每個元素。當指針變量增1時,該指針指向其基類型的下一個元素,即每執行一次語句ptr++;,ptr就指向arr數組的下一個元素。這樣,我們就能通過對象指針去訪問對象數組的元素了。

6.6對象成員

可以定義一個包含對象成員的類,這個特性稱為“複合”。即可以利用其它的類作為數據成員來定義一個新類。要想初始化對象成員,必須在成員初始化表中進行。

本例中,在聲明類Two時,指定了一個名為ob的私有成員,它是一個類One的對象。可以注意到,在聲明ob時,沒有指定參數,然而,這並不意味著要調用缺省的構造函數。隻有一個Tw>的對象被建立時,ob對象才被建立。

為了為某個成員知象調用構造函數,必須指定一個成員初始化表。它的形式為:在包含類的構造函數的參數表後,放上一個冒號(:),後跟成員的名及一列參數。如例中的:Two(inta,intb)ob(a)

利用指定的參數a可為ob成員對象調用One類的構造函數。所以在Two構造函數開始執行之前,ob成員被初始化。如果某個類包含有多個成員對象,可以指定一列初始化表,它們之間用冒號(:)分隔。這幾個對象成員的初始化順序可以隨意安排(有關成員初始化表的更詳細說明見

6.2)。

如果不使用成員初始化表,編譯器在構造包含對象之前,將為成員對象調用缺省構造函數。如果成員的類沒有定義缺省的構造函數,編譯器就會產生一個錯誤。一般來說,除非缺省的構造函數執行了所需的所有初始化,否則應該使用成員初始化表來初始化成員對象。

如果一個類中有多個對象成員,編譯器對對象成員構造函數的調用順序取決於這些對

象成員在類中說明的順序,而與它們在成員初始化表中給出的順序無關。而析構函數的調用順序恰好與構造函數調用順序相反。

6.7舉例

例6.8類Block用來描述長方體的概念。數據成員length、width和height記錄長方體的長、寬和高。成員函數Volunrn()求長方體的體積,Surface()求長方體的表麵積。

例6.9類Student用來表示學生的基本情況,姓名(name)、學號(ID)、性別(sex)和年齡(age)。然後,在函數中定義一個可以存放五個學生數據的數組Stu-arr,並對每個數組元素給定初始值,最後進行顯示。

1.簡述對象初始化和對象賦值的區別。

2.拷貝構造函數有什麼作用?

3.在什麼情況下必須自定義拷貝構造函數?

4.用申請和釋放對象數組,應注意哪些問題?

5.設計一個類,用於表示一個學生所學的數學、物理、化學、語文和英語五門課程,並算出總分。然後,用對象數組完成10名學生的情撫,並輸出。