第八講:物件陣列與指標
本講基本要求一、物件陣列* 掌握:物件陣列和物件指標的定義及引用。
* 理解:this指標的使用;物件陣列的定義、使用方法;指向物件成員的指標。
* 了解:建構函式有多個引數物件陣列和建構函式有單個引數物件陣列的實參的傳遞方式。
重點、難點
* 物件陣列和物件指標的定義及引用。
陣列不僅可以由簡單變數組成(例如整型陣列的每乙個元素都是整型變數),也可以由物件組成(物件陣列的每乙個元素都是同類的物件)。
定義物件陣列的一般格式
:類名 陣列名[陣列個數]
說明:
1、有許多實體的屬性是共同的,只是屬性的具體內容不同時我們可對立物件陣列。
2、定義陣列,有多少個元素在建立陣列時,同樣要呼叫多少次建構函式。如果有50個元素,需要凋用50次建構函式。
3、如果建構函式只有乙個引數,在定義陣列時可以直接在等號後面的花括號內提供實參。如
student stud[3]=;
//合法.3個實參分別傳遞給3個陣列元素的建構函式。
4、建構函式有多個引數,則不能用在定義陣列時直接提供所有實參的方法,因為乙個陣列有多個元素,對每個元素要提供多個實參,如果再考慮到建構函式有預設引數的情況,很容易造成實參與形參的對應關係不清晰,出現歧義性。
5、建構函式有多個引數,在建立物件陣列時,分別呼叫建構函式,對每個元素初始化。每乙個元素的實參分別用括號包起來,對應建構函式的一組形參,不會混淆。
例6 物件陣列的使用方法。 #include二、 物件指標using namespace std;
class box
//宣告有預設引數的建構函式,用引數初始化表對資料成員初始化
int volume();
private:
int height;
int width;
int length; };
int box::volume()
int main()
;
cout<<"volume of a[0] is "cout<<"volume of a[0] is "cout<<"volume of a[0] is "return 0; }
執行結果如下:
volume of a[0] is 1800
volume of a[l] is 5400
volume of a[2] is 8320
指標可以用來指向一般的變數,也可以指向物件。
1、 指向物件的指標
在建立物件時,編譯系統會為每乙個物件分配一定的儲存空間,以存放其成員。物件空間的起始位址就是物件的指標。可以定義乙個指標變數,用來存放物件的指標。
定義指向類物件的指標變數的一般形式為:類名 *物件指標名;
例如:以下物件指標的定義、賦值語句:
time *pt;//定義pt為指向time類刈象的指標變數
time tl;//定義tl為time類物件
pt=&tl;//將t1的起始位址賦給pt
如果 有—個類:
class time
;
void time::get_time()
;
time::time(int h,int m,int s)//定義建構函式
void time::get_time()//定義公有成員函式
程式執行結果為:
10 (main函式第4行的輸出)
10:13:56 (main函式第5行的輸出)
10:13:56 (main函式第7行的輸出)
10:13:56 (main函式第8行的輸出)
10:13:56 (main函式第11行的輸出)
說明:
(1)從main函式第9行可以看出:成員函式的入口位址的正確寫法是:&類名::成員函式名。不應寫成:
p3=&t1.gel_time;//t1為物件名
成員函式不是存放在物件的空間中的,而是存放在物件外的空間中的,如果有多個同類的物件,它們共用同乙個函式**段。因此賦給指標變數p3的應是這個公用的函式**段的入口位址。
(2)main函式第8、9兩行可以合寫為一行:
void(time::*p3)()=&time::get_time;//定義指標變數時指定其指向
3、 this 指標
每個物件中的資料成員都分別占有儲存空間,如果對同乙個類定義了n個物件,則有n組同樣大小的空間以存放n個物件中的資料成員。但是,不同的物件都呼叫同乙個函式**段。那麼,當不同物件的成員函式引用資料成員時,怎麼能保證引用的是所指定的物件的資料成員呢?
在每乙個成員函式中都包含乙個特殊的指標,這個指標的名字是固定的,稱為this。它是指向本類物件的指標,它的值是當前被呼叫的成員函式所在的物件的起始位址。
需要說明:
1、這些都是編譯系統自動實現的,程式設計序者不必人為地在形參中增加this指標,也不必將物件a的位址傳給this指標。這裡寫出以上過程,只是為了使讀者者理解this指標的作用和實現的機理。
2、 在需要時也可以顯式地使用this指標。例如在box類的volume函式中,下面兩種表示方法都是合法的、相互等價的。
return(height*width*length);//隱含使用this指標
return(this->height*this->width t this->length);//顯式使用this指標
3、this兩側的括號不能省略,不能寫成*this.height。因為成員運算子「.」的優先級別高於指標運算子「*」,因此,*this.height就相當於*(this.height),而this.height是不合法的,編譯出錯。
4、例6程式中定義的box類,volume函式要計算height*width*length的值,實際上是執行:
(this->height)*(this->width):(this->length)
由於當前this指向物件a,因此相當於執行:
第八章 指標 第八章 指標
1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...
C const物件指標與const指標 (八)
1 例 1.int i 1 const int cptr i cptr 2 出錯,cptr指向的是常量1 cout cptr 注意 指向 const 的指標常用作函式的形參。將形參定義為指向 const 的指標,確保傳遞給函式的實際物件在函式中不因形參而被修改。2 const pointer本身值不...
《C和指標》第八章 陣列
1.一維陣列名的值是乙個指標常量,也就是第乙個元素的位址,它的型別取決於陣列元素的型別,陣列元素是什麼型別的,它就是指向什麼型別的指標,並且這個指標是乙個指標常量而不是指標變數 2.只有兩種場合陣列名不當指標常量來表示 一是當陣列名作為sizeof操作符的運算元的時候,sizeof返回整個陣列的長度...