1. 程式人生 > >C++類和物件小程式

C++類和物件小程式

/*該程式用到了建構函式、解構函式、物件陣列、物件指標、類內定義友元函式*/
#include<iostream>
using namespace std;
class Box
{
public:
Box(float l=2,float w=3,float h=4):length(l),width(w),height(h){}
//既使用了預設引數的建構函式,
  //有用函式初始化表對資料成員進行了初始化
float volume();     //求長方形體積
~Box(); //解構函式
friend void display(Box &);   //類內定義display函式為Box類的友元函式
private:
float length;
float width;
float height;
};//注意在括號後面要引號


void display(Box &t)  //形參t是對Box類物件的引用
{
cout<<t.length<<" "<<t.width<<" "<<t.height<<endl;//必須指定訪問的物件,這裡是Box類的物件t
}


float Box::volume()
{
return(length*width*height);
}


Box::~Box()
{
cout<<volume()<<"加油!"<<endl;
}


int main()
{
Box box1;
cout<<box1.volume()<<endl;//注意在呼叫volume函式時,函式後面要加括號
Box box2(4,4);
cout<<box2.volume()<<endl;
Box box[2]={Box(1,2),   //定義物件陣列
Box(2,2)};
cout<<box[0].volume()<<endl;
cout<<(*box).volume()<<endl;//陣列名box是個指向物件陣列box[0]的指標
cout<<box->volume()<<endl;
float(Box::*p)()=&Box::volume;//定義了指向物件函式的指標,此時volume函式後面無括號
cout<<(box[0].*p)()<<endl;//呼叫物件box[0]中p所指的成員函式,相當於box[0].volume()
Box *point=box;
cout<<(point->*p)()<<endl;

//cout<<(box->*p)()<<endl;

                                                     /*求大神幫忙,這一句跟前兩句是同樣的意思,不被註釋掉時顯示“error C2296: '->*' : illegal, left operand has type 'class Box [2]' ”,為什麼呢?*/

display(box1);//呼叫友元函式display,實參box是Box類物件
return 0;

}

執行結果:


為什麼執行結果會有後面四條語句輸出呢?這時因為我用到了解構函式來輸出不同長方形的體積和“加油”兩字,通過結果可以看到,先構造的後析構,後構造的先析構。當物件建立的時候就執行建構函式,物件建立的先後順序分別是box[1],box[0],box2,box1,所以在主函式結束前系統就“反向”執行這些物件的解構函式。