[C++]類和物件(二)

丫就是熊個貓貓發表於2016-12-09

類和物件

類的物件如何引用私有資料成員

1、通過公有函式為私有成員賦值

class  Test{

int  x ,  y;

    public:

       void Setxy(int  a, int b){x=a;y=b;}

       void  Printxy(void) {cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}

} ;

void  main(void)

{    Test    p1,p2;

    p1.Setxy(3, 5);呼叫公有函式為私有物件賦值

   p1.Printxy( );

}

2、利用指標訪問私有資料成員

class  Test{

int  x,y;

   public:

       void Setxy(int  a, int b) {x=a;y=b;}

       void  Getxy(int  *px,  int *py) {*px=x;*py=y;} //提取x,y值

       void  Printxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;  }

};

void  main(void)

{    Test    p1,p2;

      p1.Setxy(3,5);

      int  a,b;

      p1.Getxy(&a,  &b);//將   a=x,   b=y

      cout<<a<<'\t'<<b<<endl;  

}

輸出: 3   5

3、利用函式訪問私有資料成員

class  Test{

int  x,y;

   public:

       void Setxy(int  a, int b) {x=a;y=b;}

       int  Getx(void) { return   x;} //返回x值

       int  Gety(void) { return   y;} //返回y值

       void  Printxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;  }

};

void  main(void)

{    Test    p1,p2;

      p1.Setxy(3,5);

      int  a,b;

      a=p1.Getx( );     b=p1.Gety();  //將   a=x,   b=y

      cout<<a<<'\t'<<b<<endl;  

}

函式值就是私有成員變數的值

 

4、利用引用訪問私有資料成員

class  Test{

int  x,y;

   public:

       void Setxy(int  a, int b){x=a;   y=b;}

      void  Getxy(int &px,  int &py) { px=x;py=y;} //提取x,y值

      void  Printxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;  }

};

void  main(void)

{     Test    p1,p2;

       p1.Setxy(3,5);

       int  a,b;

       p1.Getxy(a,  b);//將   a=x,   b=y

       cout<<a<<'\t'<<b<<endl;  

}

輸出: 3   5

 

成員函式的過載

類中的成員函式與前面介紹的普通函式一樣,成員函式可以帶有預設的引數,也可以過載成員函式 。

過載時,函式的形參必須在型別或數目上不同。

可以有預設引數的成員函式,若形參不完全預設,則必須從形參的右邊開始預設。

預設引數的成員函式

class A{

float  x,y;

public:

float Sum(void) {   return  x+y;   }

void Set(float a,float b=10.0) {    x=a;y=b;}

      void Print(void) {cout<<"x="<<x<<'\t'<<"y="<<y<<endl; }

};

void main(void)

{A a1,a2;

a1.Set (2.0,4.0);   不預設引數,a1.x=2,  a1.y=4

cout<<"a1:  ";  a1.Print ();

cout<<"a1.sum="<<a1.Sum ()<<endl;

a2.Set(20.0);     預設引數,a2.x=20,  a2.y=10

cout<<"a2:  ";  a2.Print ();

cout<<"a2.sum="<<a2.Sum ()<<endl;

}

定義類的指標及如何用指標來引用物件

class A{

float  x,y;

public:

float Sum(void) {   return  x+y;   }

void Set(float  a,float  b) {    x=a;y=b;}

      void Print(void) {cout<<"x="<<x<<'\t'<<"y="<<y<<endl;   }

};

void main(void)

{A a1,a2;

A *p;//定義類的指標

p=&a1;//給指標賦值

            p->Set(2.0,  3.0);    //通過指標引用物件的成員函式

            p->Print();

            cout<<p->Sum()<<endl;

a2.Set(10.0, 20.0);   a2.Print();

}

定義類的陣列及陣列中元素的引用

void main(void)

{

Stu stu[3];//定義類的陣列

Stu  *pstu;//定義類的指標

pstu=stu;//為指標賦值

int i;

stu[0].SetStudent (“A”,90,90);//通過陣列元素的引用賦值

stu[1].SetStudent ("B",80,80);

stu[2].SetStudent ("C",70,70);

for(i=0;i<3;i++)

{

pstu->Show ();//指標變數指向陣列元素

pstu++;//指標變數加一,指向下一元素

}

}

返回引用型別的成員函式(可以返回私有資料成員的引用)

class A{

float  x,y;

public:

float &Getx(void ) {   return  x;   } //返回x的引用

void Set(float a,float b) {    x=a;   y=b;   }

void Print(void) {   cout<<x<<'\t'<<y<<endl;   }

};

void main(void)

{A  a1,a2;

a1.Set (3,5);

cout<<"a1:  ";   a1.Print ();

a1.Getx()=30;//將a1物件中的x成員賦值

cout<<"changed  a1: ";

a1.Print ();

}

 

 

線性表的應用

線性表用來存放若干個整數,用一個指標指向其存放整數的首地址。當存放的資料大於原先開闢的空間時,線性表自動動態開闢空間,儲存所有的整數。

線性表有三個引數來描述:指向線性表儲存空間首地址的指標變數List;無符號整數nMax,指示表的最大長度;無符號整數nElem,指示表中實際所放的資料個數。

實際上,線性表相當於一個整型陣列,List為陣列的首地址,nMax為陣列在記憶體開闢的空間數,nElem為陣列中實際存放的元素個數。只不過陣列的空間是動態開闢的。

class ListClass {

   int *List;    //指向線性表的指標

   unsigned nMax;    //表的最大長度

   unsigned nElem;    //表中當前的元素個數

  .......

};

 

1class ListClass {

   int *List;    //指向線性表的指標

   unsigned nMax;    //表的最大長度

   unsigned nElem;    //表中當前的元素個數

public:

void Init(int n=10);   //初始化針表,最大長度的預設值為10

void Elem(int); //線上性表尾增加一個元素

int & Elem(unsigned n);//返回線性表中第n個元素的引用

unsigned Elem(void);//返回當前線性表中元素的個數

unsigned Max(void);//返回線性表的長度(佔用空間數)

void Print(void);//輸出線性表中所有的元素

int GetElem(int i);//返回線性表中第i個元素的值

void Destroy(void);//收回線性表佔用的儲存空間

};

2void ListClass::Elem (int elem) //線上性表尾增加一個元素

{nElem=nElem+1;

if(nElem>nMax)//空間不夠,動態開闢儲存空間

{int *list;

list=new int[nMax+1]; //開闢一較大的空間    重新定義一個指標list,用其開闢一較大的空間,將原有空間的數全部拷貝到新的空間,並將新的資料放在新空間內,同時將舊的空間收回,將線性表的指標指向新空間。

for(int i=0;i<nMax;i++)

list[i]=List[i];

nMax=nMax+1;

list[i]=elem;

delete []List;

List=list;

}

else{List[nElem-1]=elem;}

}

this 指標

不同物件佔據記憶體中的不同區域,它們所儲存的資料各不相同,但對成員資料進行操作的成員函式的程式程式碼均是一樣的。

 

當對一個物件呼叫成員函式時,編譯程式先將物件的地址賦給this指標,然後呼叫成員函式,每次成員函式存取資料成員時,也隱含使用this指標。

this指標具有如下形式的預設說明:

   Stu   *const    this;  

即 this 指標裡的地址是一個常量

·建構函式和解構函式是在類體中說明的兩種特殊的成員函式。

·建構函式是在建立物件時,使用給定的值來將物件初始化

·解構函式的功能正好相反,是在系統釋放物件前,對物件做一些善後工作。

·建構函式可以帶引數、可以過載,同時沒有返回值。

·建構函式是類的成員函式,系統約定建構函式名必須與類名相同。建構函式提供了初始化物件的一種簡單的方法。

class A{

float  x,y;

public:

A(float a,float b){  x=a;   y=b;}//建構函式,初始化物件

float Sum(void) {   return  x+y;   }

void Set(float  a,float  b) {    x=a;y=b;}

Print(void) {  cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}

};

void main(void)

{A a1(2.0, 3.0);//定義時呼叫建構函式初始化

A  a2(1.0,2.0);

a2.Set(10.0, 20.0);   //利用成員函式重新為物件賦值

           a1.Print();

a2.Print();

}

對建構函式,說明以下幾點:

1.建構函式的函式名必須與類名相同。建構函式的主要作用是完成初始化物件的資料成員以及其它的初始化工作。

2. 在定義建構函式時,不能指定函式返回值的型別,也不能指定為void型別。

3. 一個類可以定義若干個建構函式。當定義多個建構函式時,必須滿足函式過載的原則。

4.建構函式可以指定引數的預設值。

5.若定義的類要說明該類的物件時,建構函式必須是公有的成員函式。如果定義的類僅用於派生其它類時,則可將建構函式定義為保護的成員函式。

 

由於建構函式屬於類的成員函式,它對私有資料成員、保護的資料成員和公有的資料成員均能進行初始化。

 

·對區域性物件,靜態物件,全域性物件的初始化對於區域性物件,每次定義物件時,都要呼叫建構函式。

·對於靜態物件,是在首次定義物件時,呼叫建構函式的,且由於物件一直存在,只呼叫一次建構函式。

·對於全域性物件,是在main函式執行之前呼叫建構函式的

 

相關文章