《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課件第2章 類和對(duì)象_第1頁(yè)
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課件第2章 類和對(duì)象_第2頁(yè)
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課件第2章 類和對(duì)象_第3頁(yè)
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課件第2章 類和對(duì)象_第4頁(yè)
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課件第2章 類和對(duì)象_第5頁(yè)
已閱讀5頁(yè),還剩59頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

目錄2.1類和對(duì)象2.2構(gòu)造函數(shù)和析構(gòu)函數(shù)2.3Qt窗口及部件初探2.4更復(fù)雜的類和對(duì)象2.5相關(guān)指針2.6Qt信號(hào)槽通信機(jī)制2.1類和對(duì)象...姓名:小麗體重:50kg吃飯(1碗)睡覺(8小時(shí))姓名:小明體重: 70kg吃飯(2碗)睡覺(9小時(shí))人:姓名體重吃飯睡覺對(duì)象對(duì)象類:它是是對(duì)具有共同特征的一組事物(對(duì)象)進(jìn)行的抽象。這些事物具有一些通用的屬性和一些通用的行為。屬性行為2.1類和對(duì)象類是一種數(shù)據(jù)類型,包括兩方面的內(nèi)容:數(shù)據(jù)成員—以何種格式存儲(chǔ)數(shù)據(jù)信息一個(gè)類中可有多個(gè)數(shù)據(jù)成員;數(shù)據(jù)成員類型可以是基本數(shù)據(jù)類型、也可以是指針、類(非本類)等類型;類中的所有數(shù)據(jù)成員共同構(gòu)成了類中數(shù)據(jù)的存儲(chǔ)形式。成員函數(shù)--可以實(shí)施的行為成員函數(shù)需要實(shí)現(xiàn);類經(jīng)定義和實(shí)現(xiàn)后,就可以像基本的數(shù)據(jù)類型一樣使用。2.1.1類的定義class

類名{public:數(shù)據(jù)成員

//具有公有訪問權(quán)限成員函數(shù)

//具有公有訪問權(quán)限private:數(shù)據(jù)成員

//具有私有訪問權(quán)限成員函數(shù)

//具有私有訪問權(quán)限protected:數(shù)據(jù)成員

//具有保護(hù)訪問權(quán)限成員函數(shù)

//具有保護(hù)訪問權(quán)限};表示屬性表示行為定義類類型的關(guān)鍵字表示訪問權(quán)限的關(guān)鍵字2.1.1類的定義class

Time

{

int

hour,minute,second;

public:

void

setTime(int

h,int

m,int

s)

{

hour=h;

minute=m;

second=s;

}

void

showTime()

{

cout<<hour<<":"<<minute<<":"<<second<<endl;

}

};在類內(nèi)定義的成員函數(shù)默認(rèn)為內(nèi)聯(lián)成員函數(shù)默認(rèn)具有私有訪問權(quán)限例:2.1.1類的定義class

Time

{

int

hour,minute,second;

public:

void

setTime(int

h,int

m,int

s);

void

showTime();

};

void

Time::setTime(int

h,int

m,int

s)

{

hour=h;

minute=m;

second=s;

}

void

Time::showTime()

{

cout<<hour<<":"<<minute<<":"<<second<<endl;

}類外定義的成員函數(shù)若希望為內(nèi)聯(lián)函數(shù),可在聲明或定義時(shí),返回類型前加inline關(guān)鍵字例:2.1.1類的定義訪問權(quán)限:用來限制類成員是否對(duì)外界可見,以及多大范圍內(nèi)可以被訪問和使用??梢越o類中的不同數(shù)據(jù)成員和成員函數(shù)設(shè)置不同的訪問權(quán)限。函數(shù)對(duì)成員的訪問public公有成員private私有成員protected保護(hù)成員本類成員函數(shù)可以訪問使用形式:成員名可以訪問使用形式:成員名可以訪問使用形式:成員名其他函數(shù)可以訪問使用形式:對(duì)象名.公有成員不能訪問不能訪問表2-1類成員的訪問權(quán)限數(shù)據(jù)成員一般建議聲明為具有私有訪問權(quán)限(以實(shí)現(xiàn)信息的隱藏),對(duì)數(shù)據(jù)成員的訪問通過公有成員函數(shù)間接實(shí)現(xiàn)。2.1.2對(duì)象的定義與使用已有Time類后,可以用它來定義對(duì)象。例如:

Time

getUpTime;

Time

arrivalTime,departureTime;

cout<<sizeof(getUpTime); //輸出結(jié)果為12

arrivalTime=departureTime;

//對(duì)象之間可以相互賦值也可以在定義類的同時(shí)定義對(duì)象。例如:

class

Time

{

int

hour,minute,second;

public:

void

setTime(int

h,int

m,int

s)

{

hour=h;

minute=m;

second=s;

}

void

showTime()

{

cout<<hour<<":"<<minute<<":"<<second<<endl;

}

}

bellTime;2.1.2對(duì)象的定義與使用已有對(duì)象后,可使用圓點(diǎn)運(yùn)算符.來訪問其數(shù)據(jù)成員和成員函數(shù)。例如:

getUpTime.setTime(6,30,0);

getUpTime.showTime();

//輸出結(jié)果為6:30:0

getUpTime.hour=3;

//錯(cuò)誤。在類外,對(duì)象不能直接訪問私有數(shù)據(jù)如果setTime函數(shù)傳入的數(shù)據(jù)不符合實(shí)際情況會(huì)怎么樣?例如:

getUpTime.setTime(-6,80,-5);2.1.2對(duì)象的定義與使用void

Time::setTime(int

h,int

m,int

s){

if(h>23)

hour=23;

else

if(h<0)

hour=0;

else

hour=h;

if(m>59)

minute=59;

else

if(m<0)

minute=0;

else

minute=m;

if(s>59)

second=59;

else

if(s<0)

second=0;

else

second=s;}保證了對(duì)象內(nèi)部實(shí)際存儲(chǔ)的時(shí)為0到23之間的整數(shù)、分和秒為0到59之間的整數(shù)僅能通過公有接口間接的操縱私有數(shù)據(jù)成員2.1.3this指針2.1.3this指針成員函數(shù)的代碼是存儲(chǔ)在對(duì)象的內(nèi)存空間之外的,由所有對(duì)象共用。如:

getUpTime.setTime(6,30,0);

arrivalTime.setTime(8,20,30);實(shí)際執(zhí)行的是代碼區(qū)中的同一代碼段。void

Time::setTime(

int

h,int

m,int

s){

if(h>23)

hour=23;

else

if(h<0)

hour=0;

else

hour=h;

if(m>59)

minute=59;

else

if(m<0)

minute=0;

else

minute=m;

if(s>59)

second=59;

else

if(s<0)

second=0;

else

second=s;

}問題:如何區(qū)分兩次運(yùn)行時(shí),設(shè)置的是不同對(duì)象的私有數(shù)據(jù)成員呢?也可以使用等價(jià)的寫法:This->void

Time::setTime(Time*constregisterthis,

int

h,int

m,int

s)

{

if(h>23)

(*this).hour=23;

//

this指向當(dāng)前調(diào)用對(duì)象

else

if(h<0)

(*this).hour=0;

else

(*this).hour=h;

if(m>59)

(*this).minute=59;

else

if(m<0)

(*this).minute=0;

else

(*this).minute=m;

if(s>59)

(*this).second=59;

else

if(s<0)

(*this).second=0;

else

(*this).second=s;

}2.1.3this指針答案:在每個(gè)(非靜態(tài))成員函數(shù)中都包含著一個(gè)特殊的指針this。它是系統(tǒng)自動(dòng)創(chuàng)建的;值是當(dāng)前調(diào)用成員函數(shù)的對(duì)象所在的起始地址,即:始終指向當(dāng)前調(diào)用成員函數(shù)的對(duì)象。2.1.3this指針一般情況下不顯式的使用this指針。但也會(huì)有一些特殊的情況:void

Time::setTime(int

hour,int

minute,int

second)

{

if(hour>23)

this->hour=23;

else

if(hour<0)

this->hour=0;

else

this->hour=hour;

if(minute>59)

this->minute=59;

else

if(minute<0)

this->minute=0;

else

this->minute=minute;

if(second>59)

this->second=59;

else

if(second<0)

this->second=0;

else

this->second=second;

}函數(shù)內(nèi)部hour表示的是形參hour,要想使用類數(shù)據(jù)成員hour,必須用this->hour2.1.4項(xiàng)目文件組織項(xiàng)目建議采用多文件的組織方式。例如:對(duì)于類,通常會(huì)把它的定義寫在一個(gè)頭文件里,把它的成員函數(shù)實(shí)現(xiàn)寫在一個(gè)源文件中。例2_1:

圖2-2項(xiàng)目文件構(gòu)成好處:程序更加清晰明了,也方便管理和維護(hù)。類的使用者只需閱讀頭文件即可了解類的信息。多文件組織的方式減輕了編譯的工作量。2.1.4項(xiàng)目文件組織條件編譯指令:#ifndefTIME_H#defineTIME_H

class

Time

{

int

hour;

int

minute;

int

second;

public:

void

setTime(int

h,int

m,int

s);

void

showTime();

};

#endif//

TIME_H作用:防止一個(gè)源文件中兩次或多次包含同一個(gè)頭文件。目錄2.1類和對(duì)象2.2構(gòu)造函數(shù)和析構(gòu)函數(shù)2.3Qt窗口及部件初探2.4更復(fù)雜的類和對(duì)象2.5相關(guān)指針2.6Qt信號(hào)槽通信機(jī)制2.2構(gòu)造函數(shù)和析構(gòu)函數(shù)考慮如下的輸出結(jié)果?

Time

time;

time.showTime();結(jié)論:數(shù)據(jù)成員應(yīng)先賦值再使用。C++中提供了構(gòu)造函數(shù)機(jī)制,以完成對(duì)象初始化的工作。同樣的,也提供了析構(gòu)函數(shù)機(jī)制,以便在對(duì)象空間被回收之前進(jìn)行一些收尾的工作。2.2.1構(gòu)造函數(shù)構(gòu)造函數(shù)是類的成員函數(shù),在生成對(duì)象時(shí)由系統(tǒng)自動(dòng)調(diào)用。特殊之處:構(gòu)造函數(shù)名必須與類名相同;構(gòu)造函數(shù)沒有返回類型;構(gòu)造函數(shù)在類對(duì)象生成的時(shí)候由系統(tǒng)自動(dòng)調(diào)用執(zhí)行,不能由程序員顯式調(diào)用;訪問權(quán)限為公有的。2.2.1構(gòu)造函數(shù)無參構(gòu)造函數(shù)例:在Time類public:范圍內(nèi)添加聲明:

Time();

類外添加定義:

Time::Time()

{

hour=0;

minute=0;

second=0;

}Time

getUpTime;getUpTime.showTime();0:0:02.2.1構(gòu)造函數(shù)無參構(gòu)造函數(shù)初始化列表:位于構(gòu)造函數(shù)頭之后,以:開頭引出。例:

Time::Time():hour(0),minute(0),second(0)

{ }class

Time

{

int

hour;

int

minute;

int

second;

public:

void

setTime(int

h,int

m,int

s);

void

showTime();

};

2.2.1構(gòu)造函數(shù)普通帶參構(gòu)造函數(shù)例:

在Time類public:范圍內(nèi)新增聲明:

Time(int

h,int

m,int

s);

類外新增定義:

Time::Time(int

h,int

m,int

s)

:hour(h),minute(m),second(s)

{

}

Time

arrivalTime(10,25,10);arrivalTime.showTime();10:25:10傳遞給帶參構(gòu)造函數(shù)的值需在對(duì)象定義的同時(shí)給出:2.2.1構(gòu)造函數(shù)普通帶參構(gòu)造函數(shù)構(gòu)造函數(shù)的參數(shù)可以有默認(rèn)值。例如,更新聲明如下:

Time(int

h,int

m,int

s=0);

Time

departureTime

(12,30);departureTime.showTime();12:30:02.2.1構(gòu)造函數(shù)普通帶參構(gòu)造函數(shù)有多個(gè)構(gòu)造函數(shù)時(shí),會(huì)根據(jù)對(duì)象所帶參數(shù)自動(dòng)匹配對(duì)應(yīng)的構(gòu)造函數(shù)。例:在Time類public:范圍內(nèi)新增聲明:

Time(int

h);

類外新增定義:

Time::Time(int

h)

:hour(h),minute(0),second(0)

{

}

Time

getUpTime;getUpTime.showTime();

Time

arrivalTime(10,25,10);

arrivalTime.showTime();

Time

departureTime(12,30);

departureTime.showTime();

Time

bellTime(16);

bellTime.showTime();0:0:010:25:012:30:016:0:02.2.1構(gòu)造函數(shù)普通帶參構(gòu)造函數(shù)每個(gè)類都必須要有構(gòu)造函數(shù),系統(tǒng)在對(duì)象生成時(shí)會(huì)根據(jù)參數(shù)列表,自動(dòng)調(diào)用合適的構(gòu)造函數(shù)。問題:項(xiàng)目2_1中并沒有定義構(gòu)造函數(shù)?如果程序員未定義任何構(gòu)造函數(shù),系統(tǒng)會(huì)幫忙生成默認(rèn)構(gòu)造函數(shù)。例如項(xiàng)目2_1,編譯時(shí)會(huì)自動(dòng)添加如下構(gòu)造函數(shù):

Time::Time()

{

}該函數(shù)不做任何事情,它存在的意義只在于定義對(duì)象時(shí),使得系統(tǒng)至少一定能夠找到一個(gè)構(gòu)造函數(shù)。2.2.1構(gòu)造函數(shù)3.復(fù)制構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),它的形參必須是本類的引用,完成使用本類已有對(duì)象來初始化一個(gè)新對(duì)象的功能。例:在Time類public:范圍內(nèi)新增聲明:

Time(const

Time&

obj);

類外新增定義:

Time::Time(const

Time&

obj)

{

cout<<"Copy

Constructor

is

Called."<<endl;

hour=obj.hour+1;

minute=obj.minute;

second=obj.second;

}Time

bellTime(16);

bellTime.showTime();Time

offDutyTime(bellTime);

offDutyTime.showTime();

16:0:0CopyConstructorisCalled.17:0:02.2.1構(gòu)造函數(shù)3.復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)在函數(shù)形參為對(duì)象時(shí)會(huì)被調(diào)用。例:添加一個(gè)func1函數(shù):

void

func1(Time

time)

{

time.showTime();

}Time

bellTime(16);

bellTime.showTime();func1(bellTime);16:0:0CopyConstructorisCalled.17:0:02.2.1構(gòu)造函數(shù)3.復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)在一個(gè)對(duì)象以值傳遞的方式從函數(shù)返回時(shí)會(huì)被調(diào)用。例:添加一個(gè)func2函數(shù):

Time

func2()

{

Time

time(18);

time.showTime();

return

time;

}

func2().showTime();18:0:018:0:018:0:0CopyConstructorisCalled.19:0:02.2.1構(gòu)造函數(shù)4.就地初始化數(shù)據(jù)成員(需C++11標(biāo)準(zhǔn)支持)例:

class

Time

{

int

hour=0;

int

minute{0};

int

second=0;

//不支持如

int

second(0);的寫法

public:

void

showTime();

};

靜態(tài)且不具有常屬性的數(shù)據(jù)成員不能就地初始化2.2.2析構(gòu)函數(shù)也是一種特殊的成員函數(shù),在對(duì)象的內(nèi)存空間被回收之前由系統(tǒng)自動(dòng)調(diào)用。特殊之處:析構(gòu)函數(shù)名與類名相同,前面加個(gè)~以與構(gòu)造函數(shù)區(qū)分。訪問權(quán)限為公有的;析構(gòu)函數(shù)不帶任何參數(shù),也沒有返回類型(包括void);每個(gè)類只能有一個(gè)析構(gòu)函數(shù),不能重載;沒有定義析構(gòu)函數(shù)時(shí),系統(tǒng)會(huì)默認(rèn)生成一個(gè)什么也不做的析構(gòu)函數(shù);析構(gòu)函數(shù)可以像普通成員函數(shù)一樣被調(diào)用,但不建議這么做。2.2.2析構(gòu)函數(shù)例:

在Time類public:范圍內(nèi)新增聲明: ~Time();

類外新增定義: Time::~Time()

{

cout<<"destructor

is

called."<<endl;

}2.2.2析構(gòu)函數(shù)析構(gòu)函數(shù)常見的應(yīng)用情形--例2_2(部分代碼):

MyString::MyString(char*

str){

int

length;

for(length=0;str[length]!='\0';length++)

ptr=new

char[length+1];

for(int

i=0;i<length;i++)

ptr[i]=str[i];

ptr[length]='\0’;

}

MyString::~MyString()

{

delete

[]

ptr;

}

申請(qǐng)了動(dòng)態(tài)的空間應(yīng)在析構(gòu)時(shí)釋放,以免造成內(nèi)存泄漏目錄2.1類和對(duì)象2.2構(gòu)造函數(shù)和析構(gòu)函數(shù)2.3Qt窗口及部件初探2.4更復(fù)雜的類和對(duì)象2.5相關(guān)指針2.6Qt信號(hào)槽通信機(jī)制2.3Qt窗口及部件初探窗口部件是程序與用戶進(jìn)行交互的圖形化組件。功能:在標(biāo)準(zhǔn)輸出設(shè)備上繪制自己、顯示信息、接收用戶操作鼠標(biāo)鍵盤等形成的輸入、作為容器在其內(nèi)放置其它部件等。每個(gè)窗口部件都占據(jù)一塊矩形的圖形區(qū)域。從使用的角度來看,窗口部件可分為:窗口(頂級(jí)部件):指沒有嵌入到其它部件中的部件。子部件(非窗口部件):一般作為窗口中的一個(gè)組件存在(即:有父窗口)2.3.1窗口類標(biāo)題欄窗口標(biāo)題用戶區(qū)整個(gè)屏幕區(qū)域x軸y軸y()x()pos()frameGeometry().height()geometry().height()frameGeometry().width()geometry().x()geometry().y()geometry().width()2.3.1窗口類1.QWidget基本窗口2.3.1窗口類2.QDialog對(duì)話框用于完成一些較為短小的任務(wù)、或和用戶進(jìn)行簡(jiǎn)單交互。QDialogQDialog2.3.1窗口類2.QDialog對(duì)話框可有模態(tài)和非模態(tài)兩種狀態(tài)。2.3.1窗口類2.QDialog對(duì)話框例2_5(部分代碼)

QDialog

dlg1,dlg2;

dlg1.setWindowTitle("我是對(duì)話框1");

dlg1.exec();

dlg2.setModal(true);

dlg2.setWindowTitle("我是對(duì)話框2");

dlg2.resize(200,100);

dlg2.show();

QWidget

w;

w.setWindowTitle("我是基本窗口");

w.show();2.3.1窗口類2.QDialog對(duì)話框例2_6(部分代碼)

QWidget

w1,w2;

w1.setWindowTitle("我是基本窗口1");

w1.show();

w2.setWindowTitle("我是基本窗口2");

w2.move(100,100);

w2.show();

QDialog

dlg(&w1);

dlg.setWindowTitle("我是對(duì)話框");

dlg.resize(200,100);

dlg.setWindowModality(Qt::WindowModal);

dlg.show();

2.3.1窗口類3.QMainWindow主窗口是一個(gè)可以設(shè)置菜單條、工具欄、狀態(tài)條的窗口。例2_7(部分代碼)

QMainWindow

w;QMenuBar

menuBar(&w);

QMenu

menu1(&menuBar),menu2(&menuBar),subMenu(&menuBar);

subMenu.setTitle("打開");

//設(shè)置菜單內(nèi)容

subMenu.addAction("打開項(xiàng)目");

subMenu.addAction("打開文件");

menu1.setTitle("文件");

menu1.addMenu(&subMenu);

menu1.addAction("關(guān)閉");

menu2.setTitle("編輯");

menuBar.addMenu(&menu1);

//添加菜單和菜單欄

menuBar.addMenu(&menu2);

w.setMenuBar(&menuBar);

w.show();

//主窗口顯示2.3.2部件類例2_8(部分代碼)

QWidget

w;

w.resize(400,300);

QLabel

label(&w);

label.setText("我是一個(gè)標(biāo)簽");

label.move(10,10);

QPushButton

btn(&w);

btn.move(200,10);

btn.setText("我是一個(gè)按鈕");

QLineEdit

lineEdit(&w);

lineEdit.move(10,50);

lineEdit.setText("我是單行文本框");

lineEdit.setFocus();

QTextEdit

textEdit(&w);

textEdit.move(10,100);

textEdit.setText("我是多行文本框");2.3.2部件類例2_8(部分代碼)

QFont

font;

font.setPointSize(18);

font.setFamily("隸書");

font.setItalic(true);

w.setFont(font);

QPalette

plt;

plt.setColor(QPalette::Foreground,Qt::red);

plt.setColor(QPalette::Background,QColor(0,255,0));

label.setPalette(plt);

label.setAutoFillBackground(true);

btn.setStyleSheet("background-color:blue");

lineEdit.setStyleSheet("color:blue");textEdit.setTextColor(Qt::red);textEdit.append("我可以設(shè)置顏色");

textEdit.append("<font

color='green'>這是HTML

格式的文字</font>");目錄2.1類和對(duì)象2.2構(gòu)造函數(shù)和析構(gòu)函數(shù)2.3Qt窗口及部件初探2.4更復(fù)雜的類和對(duì)象2.5相關(guān)指針2.6Qt信號(hào)槽通信機(jī)制2.4.1類的組合類中數(shù)據(jù)成員的類型可以是自定義的類型,這就構(gòu)成了類的組合。class

TrainInfo

{

unsigned

platform;

string

trainNumber;

Time

arrivalTime,departureTime;

public:

TrainInfo();

TrainInfo(unsigned

plat,string

traNum,int

arrH,int

arrM,

int

arrS,

int

dptH,int

dptM,int

dpt);

void

showInfo();

~TrainInfo();

};C++標(biāo)準(zhǔn)庫(kù)中的提供的字符串類類型自定義的Time類類型2.4.1類的組合組合類設(shè)計(jì)時(shí),要考慮到對(duì)對(duì)象成員的初始化。TrainInfo::TrainInfo():platform(0){

cout<<"Constructor

of

TrainInfo

is

called."

<<endl;

}TrainInfo::TrainInfo(unsigned

plat,string

traNum,int

arrH,int

arrM,int

arrS,

int

dptH,int

dptM,int

dptS):platform(plat),trainNumber(traNum),

arrivalTime(arrH,arrM,arrS),

departureTime(dptH,dptM,dptS)

{

cout<<"Constructor

with

8

parameters

of

TrainInfo

is

called."

<<"I'm

info

of

train

"<<traNum<<endl;

}2.4.1類的組合在組合類對(duì)象生成時(shí),執(zhí)行如下步驟:(1)按照組合類對(duì)象定義時(shí)給出的實(shí)參列表,選擇合適的組合類構(gòu)造函數(shù),將實(shí)參賦值給對(duì)應(yīng)形參。(2)按照類中數(shù)據(jù)成員的聲明順序依次給每個(gè)數(shù)據(jù)成員分配內(nèi)存空間并初始化。對(duì)基礎(chǔ)類型的數(shù)據(jù)成員:若未在初始化列表中進(jìn)行初始化,則存儲(chǔ)的是不確定的值;否則在分配空間的同時(shí)進(jìn)行初始化。對(duì)于成員對(duì)象,若未在初始化列表中初始化,則分配空間的同時(shí)調(diào)用該成員對(duì)象的默認(rèn)構(gòu)造函數(shù)初始化;否則按照初始化參數(shù)列表調(diào)用成員對(duì)象相應(yīng)的構(gòu)造函數(shù)來完成初始化。

(3)執(zhí)行組合類對(duì)象構(gòu)造函數(shù)的函數(shù)體。例2_92.4.1類的組合組合對(duì)象的析構(gòu)順序如下:執(zhí)行組合對(duì)象的析構(gòu)函數(shù)體。(2)對(duì)于組合對(duì)象中的數(shù)據(jù)成員,按照聲明順序的逆序釋放每個(gè)數(shù)據(jù)成員的內(nèi)存空間。如果該數(shù)據(jù)成員為成員對(duì)象,則在釋放該成員對(duì)象的空間前調(diào)用并執(zhí)行該成員對(duì)象的析構(gòu)函數(shù)。例2_9對(duì)于兩個(gè)同作用域的對(duì)象:生成時(shí)按照聲明的先后順序分配空間,析構(gòu)時(shí)按照聲明順序的逆序進(jìn)行銷毀。2.4.2對(duì)象數(shù)組和基礎(chǔ)數(shù)據(jù)類型一樣,類也可以定義數(shù)組,稱為對(duì)象數(shù)組。例:Time

Time1Array[2];

Time

Time2Array[2]={};

Time

Time4Array[3]={{16},{},{8,30,1}};

Time

Time5Array[2]={{17}};

、

for(int

i=0;i<2;i++)

Time5Array[i].showTime();2.4.3類的嵌套class

Student

{

public:

enum

EduLevel{Pupil,JuniorStudent,HighSchoolStudent,UnderGraduate,GraduateStudent};

Student(string

_name="default

name",EduLevel

_eduLevel=Pupil)

:name(_name),eduLevel(_eduLevel)

{

}

void

show();private:

class

Family

{

string

mother,father,tel,address;

public:

Family(string

_mother="undefined",string

_father="undefined",

string

_tel=,string

_addr="Default

Address")

:mother(_mother),father(_father),tel(_tel),address(_addr)

{

}

void

show();

};

string

name;

Family

family;

EduLevel

eduLevel;

static

int

x;

};2.4.3類的嵌套在一個(gè)類的內(nèi)部定義另一個(gè)類(或結(jié)構(gòu)體、共用體、枚舉類型等),稱之為類的嵌套。內(nèi)部的類型稱為嵌套類,外部的類稱為外圍類。一般用于外圍類中需要使用嵌套類對(duì)象作為數(shù)據(jù)成員,而該嵌套類也只用于外圍類內(nèi)成員的定義時(shí)的情形。嵌套類和外圍類之間沒有包含關(guān)系。特點(diǎn):

嵌套類必須聲明在外圍類的內(nèi)部。

嵌套類名受外圍類訪問權(quán)限的控制。一般建議將嵌套類設(shè)置為私有的2.4.3類的嵌套例2_11(部分代碼)

void

Student::Family::show(){

//......}//...int

main(){

Student::EduLevel

level(Student::HighSchoolStudent);

Student

stu1("Tom",level);

//

Student::Family

f;

stu1.show();

return

0;

}目錄2.1類和對(duì)象2.2構(gòu)造函數(shù)和析構(gòu)函數(shù)2.3Qt窗口及部件初探2.4更復(fù)雜的類和對(duì)象2.5相關(guān)指針2.6Qt信號(hào)槽通信機(jī)制2.5.1對(duì)象指針指針變量中存儲(chǔ)的是一個(gè)對(duì)象整體內(nèi)存空間首字節(jié)的編碼,稱指針指向此對(duì)象,指針稱為對(duì)象指針。例如: Time

time,*timePtr(&time); timePtr->showTime();

(*timePtr).showTime();

time.showTime();等價(jià)2.5.2對(duì)象數(shù)據(jù)成員指針指針指向某對(duì)象中的數(shù)據(jù)成員,稱為對(duì)象數(shù)據(jù)成員指針。此時(shí)指針類型應(yīng)當(dāng)是數(shù)據(jù)成員的類型,而非對(duì)象的類型。例如:Time類的hour、minute數(shù)據(jù)成員具有公有訪問權(quán)限的前提下:

Time

time,sleepTime;

int

*intPtr=&time.hour;

cout<<*intPtr;

//等同于cout<<time.hour;

intPtr=&sleepTime.minute;

cout<<*intPtr;

//等同于cout<<sleepTime.minute;2.5.3類數(shù)據(jù)成員指針指針還可以指向類的數(shù)據(jù)成員,稱為類數(shù)據(jù)成員指針。與對(duì)象數(shù)據(jù)成員指針不同,不涉及具體的對(duì)象,它在定義時(shí)必須和類關(guān)聯(lián)。例如:Time類的hour、minute數(shù)據(jù)成員具有公有訪問權(quán)限的前提下:

int

Time::*intMemberPtr=&Time::hour;

Time

time,*ptrTime=&time;

int

*intPtr=&time.hour;

cout<<time.hour<<endl;

cout<<ptrTime->hour<<endl;

cout<<*intPtr<<endl;

cout<<time.*intMemberPtr<<endl;

cout<<ptrTime->*intMemberPtr<<endl; intMemberPtr=&Time::minute;

等價(jià)目錄2.1類和對(duì)象2.2構(gòu)造函數(shù)和析構(gòu)函數(shù)2.3Qt窗口及部件初探2.4更復(fù)雜的類和對(duì)象2.5相關(guān)指針2.6Qt信號(hào)槽通信機(jī)制2.6Qt信號(hào)槽通信機(jī)制是Qt框架所特有的機(jī)制隱藏了復(fù)雜的底層實(shí)現(xiàn),使得對(duì)象間的交互

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論