再談類別(建構元)

Download Report

Transcript 再談類別(建構元)

類別的進階認識
2009.04 綠園
認識「建構元」
建構元所扮演的主要角色是幫助新建立的
物件設定初值。
 建構元可視為一特殊的函數。
 建構元的名稱必須與其所屬之類別的類別
名稱完全相同。
 建構元不能有傳回值。
 建構元是在建立物件時便會自動呼叫。
 大部分定義在 public 中。

【建構元的定義語法】
類別名稱(型態1 引數1, 型態2 引數2, ……)
{
程式敘述;
......
......
......
//沒有傳回值
}
//最後不能有分號
【建構元的使用範例】
class CWin
{ private:
char id;
int width, height;
public:
CWin(char i, int w, int h) //建構元
{
id = i;
width = w;
height = h;
cout << “CWin建構元被呼叫了……” << endl;
};
}
void show_member(void)
//成員函數
{ cout << “Window ” << id << “: ”;
cout << “width=” << width << “, height=” << height<<endl;
}
//記得要加分號
【建構元的使用範例】
class CWin
{ private:
char id;
int width, height;
int main(void)
{
CWin win1(‘A’,50,40);
CWin win2(‘B’,60,70);
win1.show_member();
public:
win2.show_member();
CWin(char i, int w, int h) //建構元
{
system(“pause”);
id = i;
width = w;
height = h;
return 0;
}
cout << “CWin建構元被呼叫了……” << endl;
};
}
void show_member(void)
//成員函數
{ cout << “Window ” << id << “: ”;
cout << “width=” << width << “, height=” << height<<endl;
}
//記得要加分號
【建構元的多載】
class CWin
{ private:
char id;
int width, height;
public:
CWin(char i, int w, int h) //建構元
{ id = i;
width = w;
height = h;
cout << “CWin(char,int,int)建構元被呼叫了……” << endl;
}
CWin(int w, int h) //建構元
{ id = ‘Z’;
width = w;
height = h;
cout << “CWin(int,int)建構元被呼叫了……” << endl;
}
CWin() //建構元
{ id =‘D’;
width = 100;
height = 100;
cout << “預設建構元被呼叫了……” << endl;
}
{
void show_member(void)
//成員函數
cout << “Window ” << id << “: ”;
cout << “width=” << width << “, height=” << height << endl;
}
};
//記得要加分號
【建構元的多載】
class CWin
{ private:
char id;
int width, height;
int main(void)
{
CWin win1(‘A’,50,40);
public:
CWin win2(80,120);
CWin(char i, int w, int h) //建構元
{ id=i;
width=w;
CWin win3; //不加括號
height=h;
cout << “CWin(char,int,int)建構元被呼叫了……” << endl;
}
win1.show_member();
CWin(int w, int h) //建構元
{ id=‘Z’;
win2.show_member();
width=w;
height=h;
cout << “CWin(int,int)建構元被呼叫了……” << endl;
win3.show_member();
}
CWin() //建構元
{ id=‘D’;
system(“pause”);
width=100;
height=100;
return 0;
cout << “預設建構元被呼叫了……” << endl;
}
void show_member(void)
//成員函數
}
{ cout << “Window ” << id << “: ”;
cout << “width=” << width << “, height=” << height << endl;
}
}; //記得要加分號
【建構元的引數預設值】
class CWin
{ private:
char id;
int width, height;
public:
CWin(char i=‘D’,int w=100,int h=100) //建構元
{ id=i;
width=w;
height=h;
cout << “CWin建構元被呼叫了……” << endl;
}
void show_member(void)
//成員函數
{ cout << “Window ” << id << “: ”;
cout << “width=” << width ;
cout << “, height=” << height;
cout << endl;
}
}; //記得要加分號
【建構元的引數預設值】
class CWin
{ private:
char id;
int width, height;
public:
CWin(char i=‘D’,int w=100,int h=100) //建構元
{ id=i;
width=w;
height=h;
cout << “CWin建構元被呼叫了……” << endl;
}
int main(void)
void show_member(void)
//成員函數
{ CWin win1(‘A’,50,40);
{ cout << “Window ” << id << “: ”;
CWin win2(‘B’,80);
cout << “width=” << width ;
CWin win3;
cout << “, height=” << height;
cout << endl;
win1.show_member();
}
win2.show_member();
}; //記得要加分號
win3.show_member();
system(“pause”);
return 0;
}
【建構元的引數預設值二】
class CWin
{ private:
char id;
int width, height;
public:
CWin(char i=‘D’,int w=100,int h=100):id(i),width(w),height(h)
{ cout << “CWin建構元被呼叫了……” << endl;
}
void show_member(void)
//成員函數
{ cout << “Window ” << id << “: ”;
cout << “width=” << width ;
cout << “, height=” << height;
cout << endl;
}
}; //記得要加分號
【建構元的引數預設值二】
class CWin
{ private:
char id;
int width, height;
public:
CWin(char i=‘D’,int w=100,int h=100):id(i),width(w),height(h)
{ cout << “CWin建構元被呼叫了……” << endl;
}
void show_member(void)
//成員函數
{ cout << “Window ” << id << “: ”;
int main(void)
cout << “width=” << width ;
{ CWin win1(‘A’,50,40);
cout << “, height=” << height;
CWin win2(‘B’,80);
cout << endl;
}
CWin win3;
}; //記得要加分號
win1.show_member();
win2.show_member();
win3.show_member();
system(“pause”);
return 0;
}
【傳遞物件到函數】-- 兩面積比大小
class CWin
{ private:
char id;
int width, height;
public:
CWin(char i,int w,int h):id(i),width(w), height(h)
{}
void compare(CWin win)
{ if( this->area() > win.area() )
cout << “Window ” << this->id << “ is larger” << endl;
else
cout << “Window ” << win.id << “ is larger” << endl;
}
int area(void)
{ return width * height;
}
}; //記得要加分號
【傳遞物件到函數】-- 兩面積比大小
class CWin
{ private:
char id;
int width, height;
public:
CWin(char i,int w,int h):id(i),width(w), height(h)
{}
void compare(CWin win)
{ if( this->area() > win.area() )
cout << “Window ” << this->id << “ is larger” << endl;
else
cout << “Window ” << win.id << “ is larger” << endl;
}
int main(void)
int area(void)
{ CWin win1(‘A’,70,80);
{ return width * height;
}
CWin win2(‘B’,60,90);
}; //記得要加分號
win1.compare(win2);
system(“pause”);
return 0;
}
【由函數傳回物件】-- 兩面積比大小
class CWin
{ private:
char id;
int width, height;
public:
CWin(char i,int w,int h):id(i),width(w), height(h)
{}
CWin compare(CWin win)
{ if( this->area() > win.area() )
return *this;
else
return win;
}
int area(void)
{ return width*height;
}
char get_id(void)
{ return id;
}
}; //記得要加分號
【由函數傳回物件】-- 兩面積比大小
class CWin
{ private:
char id;
int width, height;
public:
CWin(char i,int w,int h):id(i),width(w), height(h)
{}
CWin compare(CWin win)
{ if( this->area() > win.area() )
return *this;
else
return win;
int main(void)
}
{ CWin win1(‘A’,70,80);
int area(void)
CWin win2(‘B’,60,90);
{ return width*height;
cout << “Window ”;
}
cout << (win1.compare(win2)).get_id();
char get_id(void)
cout << “ is larger”;
{ return id;
system(“pause”);
}
return 0;
}; //記得要加分號
}
【建立物件陣列】
class CWin
{ private:
char id;
int width, height;
public:
CWin(char i=‘D’,int w=100,int h=100):id(i),width(w),height(h)
{ cout << “CWin建構元被呼叫了……” << endl;
}
void show_member(void)
//成員函數
{ cout << “Window ” << id << “: ”;
cout << “widht=” << width ;
cout << “, height=” << height;
cout << endl;
}
}; //記得要加分號
【建立物件陣列】
class CWin
{ private:
char id;
int width, height;
public:
CWin(char i=‘D’,int w=100,int h=100):id(i),width(w),height(h)
{ cout << “CWin建構元被呼叫了……” << endl;
}
void show_member(void)
//成員函數
{ cout << “Window ” << id << “: ”;
cout << “widht=” << width ;
cout << “, height=” << height;
int main(void)
cout << endl;
{ CWin win1(‘A’,50,40);
}
CWin my_win[3];
}; //記得要加分號
win1.show_member();
my_win[2].show_member();
system(“pause”);
return 0;
}
【物件陣列與函數】-- 找出最大值
class CWin
{ private:
char id;
int width, height;
public:
void set_data(char i, int w, int h)
{ id = i;
width = w;
height = h;
}
int area(void)
{ return width*height;
}
friend void largest(CWin [], int);
}; //記得要加分號
void largest( CWin win[], int n )
{ int max=0,iw, i;
for(i=0; i<n; i++)
if( win[i].area() > max )
{ iw=i;
max=win[i].area(); }
cout << “largest window = ” << win[iw].id << endl;
}
【物件陣列與函數】-- 找出最大值
class CWin
{ private:
char id;
int width, height;
public:
void set_data(char i, int w, int h)
{ id = i;
width = w;
int main(void)
height = h;
}
{
int area(void)
CWin win[3];
{ return width*height;
win[0].set_data('A',60,70);
}
win[1].set_data('B',40,60);
friend void largest(CWin [], int);
win[2].set_data('C',80,50);
}; //記得要加分號
largest(win,3);
void largest( CWin win[], int n )
system(“pause”);
{ int max=0,iw, i;
for(i=0; i<n; i++)
return 0;
if( win[i].area() > max )
}
{ iw=i;
max=win[i].area(); }
cout << “largest window = ” << win[iw].id << endl;
}
類別裡的靜態成員
資料成員--實例變數
win1 物件
id
width
height
win2 物件
id
width
height
…
‘A’
50
40
…
…
‘B’
60
80
…
我們所建立的物件
win1、win2均能
保有自己的值,各
自獨立,且存於不
同的記憶體內。具
有此特性的變數,
稱之為「實例變數」
(instance
variable)。
成員函數--實例函數
win1.show_member();
//透過物件 win1 呼叫 show_member()
win2.show_member();
//透過物件 win2 呼叫 show_member()
必須先建立物件,再利用物件來呼叫它,而無法直接呼叫
show_member()而不透過物件。具有此特性的函數,
稱之為「實例函數」(instance function)。
靜態資料成員



可由所有的物件來共享,也就是說每一個物件的「靜態資
料成員」均相同,更改了某個物件的「靜態資料成員」
,其它物件的「靜態資料成員」也將隨之更改。
宣告方式:
static int num;
//將num宣告成靜態資料成員
使用語法:
類別名稱::靜態資料成員名稱
cout << CWin::num; //印出靜態資料成員num的值
【靜態資料成員範例】
class CWin
{ private:
char id;
int width, height;
public:
static int num;
CWin(char i,int w,int h):id(i),width(w), height(h)
{ num++; }
CWin()
{ num++; }
}; //記得要加分號
int CWin::num = 0;
//將 num 的初值設為 0
【靜態資料成員範例】
class CWin
{ private:
char id;
int width, height;
public:
static int num;
CWin(char i,int w,int h):id(i),width(w), height(h)
{ num++; }
CWin()
int main(void)
{ num++; }
{ CWin win1(‘A’,50,40);
}; //記得要加分號
CWin win2(‘B’,60,80);
int CWin::num = 0;
cout << “已建立 ” << CWin::num;
//將 num 的初值設為 0
cout << “ 個物件了…” << endl;
CWin my_win[4];
cout << “已建立 ” << CWin::num;
cout << “ 個物件了…” << endl;
system(“pause”);
return 0;
}
【類別的靜態成員函數】
class CWin
{ private:
char id;
int width, height;
static int num;
public:
CWin(char i,int w,int h):id(i),width(w), height(h)
{ num++; }
CWin()
int main(void)
{ num++; }
{ CWin::count();
static void count(void)
CWin win1(‘A’,50,40);
{ cout << “已建立 ” << num;
CWin win2(‘B’,60,80);
cout << “ 個物件了” << endl;
CWin::count();
}
}; //記得要加分號
CWin my_win[5];
CWin::count();
int CWin::num = 0;
system(“pause”);
return 0;
}
【靜態成員函數使用的限制】
其限制有二:
1. 靜態成員函數不能取用類別內一般的變數
或函數。
2. 靜態成員函數內部不能使用 this 關鍵
字。