C++對象與類課件_第1頁
C++對象與類課件_第2頁
C++對象與類課件_第3頁
C++對象與類課件_第4頁
C++對象與類課件_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

小測驗Const是什么?請舉一例說明?內(nèi)聯(lián)函數(shù)是什么?有什么作用?什么是函數(shù)重載?請舉出一例說明?什么是引用?請舉一例說明?

第10章類和對象

1類的構(gòu)成2成員函數(shù)的定義3對象的定義和使用4構(gòu)造函數(shù)與析構(gòu)函數(shù)5自引用指針this6對象數(shù)組

1類的構(gòu)成

1.1從結(jié)構(gòu)體到類1.2類的構(gòu)成本節(jié)主要內(nèi)容1.1從結(jié)構(gòu)體到類

1.結(jié)構(gòu)體的擴充

例如下面聲明了一個日期結(jié)構(gòu)體:structDate{intyear;//年intmonth;//月intday;//日};C語言結(jié)構(gòu)體一般格式如下:

struct結(jié)構(gòu)名{數(shù)據(jù)

};例有關(guān)日期結(jié)構(gòu)體的例子。#include<iostream>usingnamespacestd;structDate{//聲明了一個名為Date的結(jié)構(gòu)體intyear;intmonth;intday;};intmain(){Datedate1;

date1.year=2010

;//可以在結(jié)構(gòu)體外直接訪問數(shù)據(jù)yeardate1.month=8;//可以在結(jié)構(gòu)體外直接訪問數(shù)據(jù)monthdate1.day=25;//可以在結(jié)構(gòu)體外直接訪問數(shù)據(jù)daycout<<date1.year<<"."<<date1.month<<"."<<date1.day<<endl;return0;}

程序的運行結(jié)果如下:2010.8.25

C語言中的結(jié)構(gòu)體缺點:結(jié)構(gòu)體變量可以在結(jié)構(gòu)體外直接訪問數(shù)據(jù),在C結(jié)構(gòu)體中的數(shù)據(jù)是很不安全的。

C++中引入了類的概念,克服了C結(jié)構(gòu)體的缺點。C++中引入了類的概念,

它不僅可以含有數(shù)據(jù),而且還可以含有函數(shù)。

類中的數(shù)據(jù)和函數(shù),分別稱作數(shù)據(jù)成員和成員函數(shù)。類聲明的簡化格式如下:

class類名{數(shù)據(jù)函數(shù)};

類的聲明由關(guān)鍵字class打頭,后跟類名花括號中是類體以一個分號“;”結(jié)束類聲明的簡化格式如下:

class類名{

數(shù)據(jù)成員函數(shù)函數(shù)};

1.2類的構(gòu)成在類中,數(shù)據(jù)成員和成員函數(shù)分別屬于private部分、和public部分。數(shù)據(jù)成員和成員函數(shù)一般也統(tǒng)稱為類的成員。類聲明的一般格式如下:

class類名{public:

公有數(shù)據(jù)成員;公有成員函數(shù);private:

私有數(shù)據(jù)成員;私有成員函數(shù);};

公有成員既可被類內(nèi)的成員函數(shù)訪問,也可被類的外部訪問,是類與外界的接口。

私有成員只能被類內(nèi)的成員函數(shù)訪問,而類外部的任何訪問都是非法的。

用一個類Date來描述日期,其形式如下:classDate{

public:voidsetDate(inty,intm,intd);//公有成員函數(shù)voidshowDate();//公有成員函數(shù)

private:intyear;//私有數(shù)據(jù)成員intmonth;//私有數(shù)據(jù)成員intday;//私有數(shù)據(jù)成員};

私有數(shù)據(jù)成員year、month和day只能由內(nèi)部成員函數(shù)訪問,在類的外部無法訪問,保護了私有數(shù)據(jù)的安全。

設(shè)置日期成員函數(shù)setDate和日期顯示成員函數(shù)showDate都是公有的成員函數(shù),類外部對類Date的數(shù)據(jù)進行操作,只能通過這兩個函數(shù)來實現(xiàn)。

說明:

(1)除了private和public之外,類中的成員還可以用另一個關(guān)鍵字protected來說明。被protected說明的數(shù)據(jù)成員和成員函數(shù)稱為保護成員。類聲明的完整格式如下:

class類名{public:

公有數(shù)據(jù)成員;公有成員函數(shù);protected:

保護數(shù)據(jù)成員;保護成員函數(shù);private:

私有數(shù)據(jù)成員;私有成員函數(shù);};保護成員可以由本類的成員函數(shù)訪問,也可以由本類的派生類的成員函數(shù)訪問,而類外的任何訪問都是非法的,將在第13章詳細介紹。

(2)對一個具體的類來講,類聲明格式中的3個部分并非一定要全有,但至少要有其中的一個部分。一般情況下,一個類的數(shù)據(jù)成員應(yīng)該聲明為私有成員,成員函數(shù)聲明為公有成員。

這樣,內(nèi)部的數(shù)據(jù)整個隱蔽在類中,在類的外部根本就無法看到,使數(shù)據(jù)得到有效的保護。

(3)類聲明中的private、protected和public三個關(guān)鍵字可以按任意順序出現(xiàn)任意次。但是,如果把所有的私有成員、保護成員和公有成員歸類放在一起,程序?qū)⒏忧逦?/p>

(4)C++規(guī)定,在默認情況下(即沒有指定成員是私有、保護或公有時),類中的成員是私有的。

例將結(jié)構(gòu)體struct改為類class。#include<iostream>usingnamespacestd;classDate{//將結(jié)構(gòu)體struct改為類class

intyear;//私有數(shù)據(jù)成員intmonth;//私有數(shù)據(jù)成員intday;//私有數(shù)據(jù)成員};

intmain(){Datedate1;date1.year=2010;//錯誤,在類外不能訪問私有數(shù)據(jù)成員yeardate1.month=8;//錯誤,在類外不能訪問私有數(shù)據(jù)成員monthdate1.day=25;//錯誤,在類外不能訪問私有數(shù)據(jù)成員daycout<<date1.year<<"."<<date1.month<<".“<<date1.day<<endl;//錯誤,不能訪問私有數(shù)據(jù)成員return0;}私有成員只能被類內(nèi)的成員函數(shù)訪問,而類外部的任何訪問都是非法的。如何才能訪問類中的私有數(shù)據(jù)成員呢?將后面作詳細的介紹。

#include<iostream>//有關(guān)日期結(jié)構(gòu)體的例子。usingnamespacestd;structDate{//聲明了一個名為Date的結(jié)構(gòu)體intyear;//公有的數(shù)據(jù)成員intmonth;//公有的數(shù)據(jù)成員intday;};//公有的數(shù)據(jù)成員intmain(){Datedate1;

date1.year=2010

;//可以在結(jié)構(gòu)體外直接訪問數(shù)據(jù)yeardate1.month=8;//可以在結(jié)構(gòu)體外直接訪問數(shù)據(jù)monthdate1.day=25;//可以在結(jié)構(gòu)體外直接訪問數(shù)據(jù)daycout<<date1.year<<"."<<date1.month<<"."<<date1.day<<endl;return0;}程序的運行結(jié)果如下:208.25

在默認情況下,結(jié)構(gòu)體中的成員是公有的。因此,數(shù)據(jù)成員year、month和day默認為是公有的,結(jié)構(gòu)體外的變量date1能夠?qū)λ鼈冎苯舆M行訪問

(5)不能在類聲明中給數(shù)據(jù)成員賦初值。例如:

classabc{

private:

chara=

q

;//錯誤

intb=33;//錯誤

public:

};C++規(guī)定,只有在對象定義之后才能給數(shù)據(jù)成員賦初值

2成員函數(shù)的定義

2.1普通成員函數(shù)的定義2.2內(nèi)聯(lián)成員函數(shù)的定義本節(jié)主要內(nèi)容2.1普通成員函數(shù)的定義

將成員函數(shù)以普通成員函數(shù)(即非內(nèi)聯(lián)的成員函數(shù))的形式進行定義。在類聲明中只給出成員函數(shù)的原型,而將成員函數(shù)的定義放在類外部。例如:

Student∷成員函數(shù)名(參數(shù)表)

成員函數(shù)在類外定義的一般形式是:返回值類型類名∷成員函數(shù)名(參數(shù)表){函數(shù)體}

在類名和成員函數(shù)名之間應(yīng)加上作用域運算符“∷”classStudent{//學(xué)生類的定義-1private:intnumber;floatscore;public:

voidinput(intnumber1,floatscore1);//函數(shù)原型1,輸入成績

voidmodify(floatscore1);

//函數(shù)原型2,修改成績

voidprint();

//函數(shù)原型3,打印成績};voidStudent::input(intnumber1,floatscore1)//函數(shù)定義1{number=number1;score=score1;}voidStudent::modify(floatscore1)

//函數(shù)定義2{score=score1;}voidStudent::print()

//函數(shù)定義3{cout<<"\nnumber:"<<number<<"score:"<<score;}在類聲明中只給出成員函數(shù)的原型,而將成員函數(shù)的定義放在類外部。

在函數(shù)名前應(yīng)加上類名和作用域運算符“∷”說明:

(1)在類聲明中,成員函數(shù)原型的參數(shù)表中可以不說明參數(shù)的名字,而只說明它們的類型。例如:

voidmodify(floatscore1);但是,在類外定義成員函數(shù)時,不但要說明參數(shù)表中參數(shù)的類型,還必須要指出其參數(shù)名。例如:

voidStudent::modify(floatscore1){score=score1;}

(2)采用“在類聲明中只給出成員函數(shù)的原型,而將成員函數(shù)的定義放在類的外部”的定義方式,是C++程序設(shè)計的良好習(xí)慣。2.2內(nèi)聯(lián)成員函數(shù)的定義

(1)隱式聲明將成員函數(shù)直接定義在類的內(nèi)部。例如:

classStudent{//學(xué)生類的定義-2private:intnumber;floatscore;public:voidinput(intnumber1,floatscore1)//定義成員函數(shù){number=number1;score=score1;}voidmodify(floatscore1)//定義成員函數(shù){score=score1;}

voidprint()//定義成員函數(shù){cout<<"\nnumber:"<<number<<"score:"<<score;}

};

將成員函數(shù)直接定義在類內(nèi)部,編譯時是作為內(nèi)聯(lián)函數(shù)的方式來處理(內(nèi)聯(lián)函數(shù)隱式定義)

(2)顯式聲明

在類聲明中只給出成員函數(shù)的原型,而成員函數(shù)的定義放在類外部。但在類外部成員函數(shù)的定義前冠以關(guān)鍵字“inline”,使它起到內(nèi)聯(lián)函數(shù)的作用。

classStudent{private:intnumber;floatscore;public:

voidinput(intnumber1,floatscore1);...

};

inline

voidStudent::input(intnumber1,floatscore1){number=number1;score=score1;}

成員函數(shù)的原型冠以關(guān)鍵字“inline”

使用

inline定義內(nèi)聯(lián)函數(shù)時,可以在聲明函數(shù)原型和定義函數(shù)時同時寫inline,也可以在其中一處聲明inline,效果是相同的,都能按內(nèi)聯(lián)函數(shù)處理。但是,必須將類的聲明和內(nèi)聯(lián)成員函數(shù)的定義都放在同一個文件(或同一個頭文件)中,否則編譯時無法進行代碼置換。classStudent{//學(xué)生類的定義-3private:intnumber;floatscore;public:

inline

voidinput(intnumber1,floatscore1);//函數(shù)原型1

inlinevoidmodify(floatscore1);//函數(shù)原型2

inlinevoidprint();//函數(shù)原型3};inlinevoidStudent::input(intnumber1,floatscore1){number=number1;//函數(shù)定義1score=score1;}inlinevoidStudent::modify(floatscore1){score=score1;}//函數(shù)定義2inlinevoidStudent::print()//函數(shù)定義3{cout<<"\nnumber:"<<number<<"score:"<<score;}冠以關(guān)鍵字“inline”

3對象的定義和使用3.1類與對象的關(guān)系3.2.對象的定義3.3對象中成員的訪問3.4類的作用域和類成員的訪問屬性本節(jié)主要內(nèi)容3.1類與對象的關(guān)系在C++中,類與對象間的關(guān)系,可以用數(shù)據(jù)類型int和整型變量i之間的關(guān)系來類比。類類型和int類型均代表的是一般的概念,而對象和整型變量卻是代表具體的東西。

數(shù)據(jù)類型實例inta,b(變量)學(xué)生類張三,李四(對象)水果類蘋果,桔子(對象)3.2.對象的定義定義對象可以用以下兩種方法:方法1:

在聲明類的同時,直接定義對象,即在聲明類的右花括號“}”后,直接寫出屬于該類的對象名表。例如:

classStudent{

//....

}

stu1,stu2;

在聲明類Student的同時,直接定義對象stu1和stu2

方法2:聲明了類之后,在使用時再定義對象。其一般形式如下:classStudent{

//…

};…Studentstu1,stu2;

在使用時再定義對象,此時定義了類Student的兩個對象stu1和stu2說明:聲明了一個類便聲明了一種類型,這時沒有給它分配存儲空間,只有定義了對象后,系統(tǒng)才為對象分配存儲空間。類名對象名1,對象名2,…;3.3對象中成員的訪問不論是數(shù)據(jù)成員,還是成員函數(shù),只要是公有的,在類的外部可以通過類的對象進行訪問。訪問對象中的成員通常有以下三種方法。

(1)通過對象名和對象選擇符訪問對象中的成員其一般形式是:其中“·”叫做對象選擇符,簡稱點運算符。

對象名·數(shù)據(jù)成員名或

對象名·成員函數(shù)名(實參表)#include<iostream>//學(xué)生類的完整程序usingnamespacestd;classStudent{private:intnumber;floatscore;public:

voidinput(intnumber1,floatscore1);

//輸入學(xué)生成績

voidmodify(floatscore1);

//修改學(xué)生成績

voidprint();

//打印學(xué)生成績};voidStudent::input(intnumber1,floatscore1){number=number1;score=score1;}voidStudent::modify(floatscore1){score=score1;}voidStudent::print(){cout<<"\nnumber:"<<number<<"score:"<<score;}intmain(){Studentstu1,stu2;

stu1.input(9901,95);

stu2.input(9902,75);

stu1.print();stu2.print();

stu1.modify(85.5);stu1.print();stu2.print();return0;}stu1.number=9901,stu1.score=95stu2.number=9902,stu2.score=75

stu1.score=85.5運行結(jié)果:number:9901score:95number:9902score:75number:9901score:85.5number:9902score:75#include<iostream>//通過對象名和對象選擇符訪問對象中的成員。usingnamespacestd;classDate{public:

voidsetDate(inty,intm,intd);voidshowDate();private:intyear;intmonth;intday;};voidDate::setDate(inty,intm,intd){year=y;month=m;day=d;}voidDate::showDate(){cout<<year<<"."<<month<<"."<<day<<endl;}intmain(){Datedate1;cout<<"Date1setandoutput:"<<endl;

date1.setDate(2010,4,28);

date1.showDate();return0;}調(diào)用對象date1的公有成員函數(shù)setDate,給date1的私有數(shù)據(jù)成員賦值調(diào)用對象date1公有成員函數(shù)showDate,顯示date1的私有數(shù)據(jù)成員程序運行結(jié)果如下:Date1setandoutput:2010.4.28說明:

在類外只能訪問公有(public)成員,而不能訪問私有(private)成員。如果將主程序改成下面的形式,將出現(xiàn)編譯錯誤:

intmain(){Datedate1;

date1.year=2010;

date1.month=8;

date1.day=25;cout<<date1.year<<"."<<date1.month<<"."<<date1.day<<endl;return0;}錯誤,在類的外部,對象date1不能訪問私有數(shù)據(jù)成員year、month和day(2)通過指向?qū)ο蟮闹羔樤L問對象中的成員此時,訪問此對象的成員時,不能用“.”操作符,而應(yīng)使用“->”操作符。例如:classDate{public:intyear;…};……Dated,*ptr;//定義對象d和指向類Date的指針變量ptrptr=&d;//使ptr指向?qū)ο骴cout<<ptr->year;//輸出ptr指向?qū)ο笾械某蓡Tyear

d.year(*ptr).year三者是等價的ptr->year(3)通過對象的引用訪問對象中的成員

如果為一個對象定義了一個引用,也就是為這個對象起了一個別名。例如:classDate{public:intyear;...};…Dated1;//定義類Date的對象d1Date&d2=d1;//定義類Date的引用d2,//并用對象d1進行初始化cout<<d1.year;//輸出對象d1中的數(shù)據(jù)成員yearcout<<d2.year;//輸出對象d2中的數(shù)據(jù)成員year由于d2是d1的引用(即d2和d1占有相同的存儲單元),因此d2.year和d1.year是相同的。3.4類的作用域和類成員的訪問屬性

所謂類的作用域就是指在類的聲明中的一對花括號所形成的作用域。一個類的所有成員都在該類的作用域內(nèi)。在類的作用域內(nèi),一個類的任何成員函數(shù)成員可以不受限制地訪問該類中的其他成員。而在類作用域之外,對該類的數(shù)據(jù)成員和成員函數(shù)的訪問則要受到一定的限制,有時甚至是不允許的。

這主要與類成員的訪問屬性有關(guān)。

類成員有二種訪問屬性:公有屬性和私有屬性。

說明為公有的成員不但可以被類中成員函數(shù)訪問,還可在類的外部,通過類的對象進行訪問。說明為私有的成員只能被類中成員函數(shù)訪問,不能在類的外部,通過類的對象進行訪問。換一種說法:類內(nèi)部的成員函數(shù)可以訪問類的所有成員,沒有任何限制,類外部的對象可以訪問類的公有成員,不能訪問類的私有成員。classSample{

private:

inti;//私有成員

public:intj;//公有成員voidset(inti1,intj1)//公有成員{i=i1;//類的成員函數(shù)可以訪問類的私有成員ij=j1;}//類的成員函數(shù)可以訪問類的公有成員j};intmain(){Samplea;//定義類Sample的對象a

a.set(3,5);

cout<<a.i<<endl;cout<<a.j<<endl;return0;}

非法,類Sample的對象a不能訪問類的私有成員i

在類外,類Sample的對象a可以訪問公有成員函數(shù)set()

合法,類Sample的對象a能夠訪問類的公有成員j分析以下程序段一般而言,公有成員是類的對外接口,而私有成員是類的內(nèi)部數(shù)據(jù)和內(nèi)部實現(xiàn),不希望外界訪問。4構(gòu)造函數(shù)與析構(gòu)函數(shù)

4.1對象的初始化和構(gòu)造函數(shù)4.2用成員初始化表對數(shù)據(jù)成員初始化4.3析構(gòu)函數(shù)4.4默認的構(gòu)造函數(shù)和默認的析構(gòu)函數(shù)4.5帶默認參數(shù)的構(gòu)造函數(shù)

本節(jié)主要內(nèi)容4.1對象的初始化和構(gòu)造函數(shù)

與使用變量一樣,對象時也應(yīng)該“先定義,后使用”。在定義對象時,對數(shù)據(jù)成員賦初值,稱為對象的初始化。C++規(guī)定,類聲明體中不能給數(shù)據(jù)成員直接賦初值,下面的寫法是錯誤的:classDate{private:intyear=2010;//錯誤intmonth=6;//錯誤intday=16;//錯誤};對象的初始化常采用以下兩種方法:1.調(diào)用普通的成員函數(shù)來完成

2.調(diào)用構(gòu)造函數(shù)來完成classDate{public:voidsetDate(inty,intm,intd);voidshowDate();private:

intyear;intmonth;intday;};…intmain(){Datedate1;

date1.setDate(2010,4,28);

…return0;}調(diào)用對象date1的公有成員函數(shù)setDate,給date1的私有數(shù)據(jù)成員賦初值,初始化后:Date1.year=2010Date1.month

=4Date1.day

=281.用普通成員函數(shù)對對象進行初始化

在建立對象的時,采用構(gòu)造函數(shù)給數(shù)據(jù)成員賦初值,通常有以下兩種形式。形式1:

類名對象名[(實參表)];這里的“類名”與構(gòu)造函數(shù)名相同,“實參表”是為構(gòu)造函數(shù)提供的實際參數(shù)。

2.用構(gòu)造函數(shù)對對象進行初始化構(gòu)造函數(shù)是一種特殊的成員函數(shù),它主要用于:

(1)為對象分配空間(2)為對象的數(shù)據(jù)成員進行初始化(3)其他指定的任務(wù)#include<iostream>//usingnamespacestd;classDate{public:

Date(inty,intm,intd);//聲明構(gòu)造函數(shù)Date的原型voidshowDate();private:intyear;intmonth;intday;};Date::Date(inty,intm,intd)//定義構(gòu)造函數(shù)Date{year=y;month=m;day=d;}inlinevoidDate::showDate(){cout<<year<<"."<<month<<"."<<day<<endl;}intmain(){Datedate1(2010,4,28);date1.showDate();return0;}(3)定義類Date的對象date1,調(diào)用構(gòu)造函數(shù),給對象date1的數(shù)據(jù)成員賦初值

(2)構(gòu)造函數(shù)可以有任意類型的參數(shù),但不能具有返回類型(1)構(gòu)造函數(shù)的名字必須與類名相同通常,利用構(gòu)造函數(shù)建立對象有以下二種方法:(1)一般形式為:

類名對象名(實參表);

例如:complexA(1.1,2.2);

類名對象名實參表

在建立對象的時,采用構(gòu)造函數(shù)對對象進行初始化,通常有以下兩種形式:

形式1:

例如:Datedate1(2010,4,28);

類名對象名實參表

建立對象時,編譯系統(tǒng)會自動地調(diào)用構(gòu)造函數(shù),對對象進行初始化類名對象名[(實參表)];形式2:其一般語法形式為:

例如:

Date*pdate=newDate(2010,4,28);

類名*指針變量名=new類名(實參表);指針pdate指向該對象的地址

對象名:匿名對象,或稱對象名是(*pdate)此時,應(yīng)使用“->”來訪問對象的成員,而不是“.”。

類名*指針變量名=new類名[(實參表)];將主函數(shù)改成用這種方法來實現(xiàn)。intmain(){Date*pdate=newDate(2010,4,28);

pdate->showDate();deletepdate;return0;}

利用構(gòu)造函數(shù)創(chuàng)建對象的另一種方法:用指針和new來實現(xiàn)。說明:

(1)構(gòu)造函數(shù)的名字必須與類名相同,否則編譯程序?qū)阉?dāng)作一般的成員函數(shù)來處理。(2)構(gòu)造函數(shù)沒有返回值,在聲明和定義構(gòu)造函數(shù)時,是不能說明它的類型的,甚至說明為void類型也不行。例如上述構(gòu)造函數(shù)不能寫成

void

Date(inty,intm,intd);

說明為void類型也不行

(3)與普通的成員函數(shù)一樣,構(gòu)造函數(shù)的函數(shù)體可寫在類體內(nèi),也可寫在類體外。

如類Date可以聲明如下:classDate{public:

Date(inty,intm,intd)//構(gòu)造函數(shù)定義在類內(nèi){year=y;month=m;day=d;}voidshowDate(){cout<<year<<"."<<month<<"."<<day<<endl;}private:intyear;intmonth;intday;};

構(gòu)造函數(shù)的函數(shù)體也可寫在類體外

(4)構(gòu)造函數(shù)一般聲明為公有成員,但它不需要也不能像其他成員函數(shù)那樣被顯式地調(diào)用,它是在定義對象的同時被自動調(diào)用的。例如,下面的用法是錯誤的:

date1.Date(2010,4,28);

(5)構(gòu)造函數(shù)可以是不帶參數(shù)的。例如:

classA{private:intx;public:A(){x=50;}…

};intmain(){Aa;…}構(gòu)造函數(shù)可以不帶參數(shù)

定義類A的對象a時,調(diào)用不帶參數(shù)的構(gòu)造函數(shù)給數(shù)據(jù)成員x賦初值50

4.2用成員初始化表對數(shù)據(jù)成員初始化

classA{inti;floatf;public:A(inti1,floatf1)

{i=i1;f=f1;}};classA{inti;floatf;public:A(inti1,floatf1):i(i1),f(f1){}};在構(gòu)造函數(shù)中一般用賦值語句對數(shù)據(jù)成員的初始化進行

C++還提供另一種初始化數(shù)據(jù)成員的方法----用成員初始化列表來實現(xiàn)對數(shù)據(jù)成員的初始化。

帶有成員初始化列表的構(gòu)造函數(shù)的一般形式如下:成員初始化列表的一般形式為:

類名::構(gòu)造函數(shù)名([參數(shù)表])[:(成員初始化列表)]{構(gòu)造函數(shù)體}數(shù)據(jù)成員名1(初始值1),數(shù)據(jù)成員名2(初始值2),…

#include<iostream>usingnamespacestd;classDate{public:

Date(inty,intm,intd);//聲明構(gòu)造函數(shù)的原型voidshowDate();private:intyear;intmonth;intday;};Date::Date(inty,intm,intd):year(y),month(m),day(d){}voidDate::showDate(){cout<<year<<"."<<month<<"."<<day<<endl;}intmain(){Datedate1(2010,4,28);//定義類Date的對象date1 date1.showDate();return0;}

定義構(gòu)造函數(shù)Date(),使用成員初始化表對數(shù)據(jù)成員初始化運行結(jié)果如下:2010.4.28說明:數(shù)據(jù)成員是按照它們在類中聲明的順序進行初始化的,與它們在成員初始化列表中列出的順序無關(guān)。練習(xí)1寫出以下程序的運行結(jié)果。#include<iostream>usingnamespacestd;classD{intmem1;intmem2;public:D(inti):mem1(i),mem2(mem1+1){cout<<"mem1:"<<mem1<<endl; cout<<"mem2:"<<mem2<<endl;}};voidmain(){Dd(15);}

相當(dāng)于:mem1=i;mem2=mem1+1運行結(jié)果為:mem1:15mem2:16

#include<iostream>usingnamespacestd;classD{intmem1;intmem2;public:D(inti):mem2(i),mem1(mem2+1){cout<<"mem1:"<<mem1<<endl; cout<<"mem2:"<<mem2<<endl;}};voidmain(){Dd(15);}

相當(dāng)于:mem2=i;mem1=mem2+1;請問:運行結(jié)果?

mem1:16mem2:15實際運行結(jié)果:mem1:858993459mem2:15

×

原因:不是按照構(gòu)造初始化表的順序?qū)?shù)據(jù)成員進行初始化而是按照數(shù)據(jù)成員在類里被聲明的順序進行初始化練習(xí)2#include<iostream>usingnamespacestd;classD{intmem1;intmem2;public:D(inti):mem2(i),mem1(mem2+1){cout<<"mem1:"<<mem1<<endl;cout<<"mem2:"<<mem2<<endl;}};voidmain(){Dd(15);}

初始化過程:1.mem1=mem2+1=隨機數(shù)2.mem2=i=15

程序結(jié)果如下:mem1:-858993459mem2:15

解決方法??練習(xí)2分析錯誤原因//練習(xí)2#include<iostream>usingnamespacestd;classD{intmem2;intmem1;public:D(inti):mem2(i),mem1(mem2+1){cout<<"mem1:"<<mem1<<endl; cout<<"mem2:"<<mem2<<endl;}};voidmain(){Dd(15);}

將mem1和mem2交換運行結(jié)果為:mem1:16mem2:15

4.3析構(gòu)函數(shù)

析構(gòu)函數(shù)也是一種特殊的成員函數(shù)。它執(zhí)行與構(gòu)造函數(shù)相反的操作,通常用于執(zhí)行一些清理任務(wù),主要有:

1.釋放分配給對象的內(nèi)存空間。2.其他指定的任務(wù)classStudent{//帶構(gòu)造函數(shù)的學(xué)生類private:intnumber;floatscore;public:

Student(intnumber1,floatscore1);

~Student(){cout<<“destructing”;}

};

Student::Student(intnumber1,floatscore1){number=number1;score=score1;}構(gòu)造函數(shù)析構(gòu)函數(shù)classStudent{private:intnumber;floatscore;public:

Student(intnumber1,floatscore1);

~Student(){cout<<“destructing”;}

};Student::Student(intnumber1,floatscore1){number=number1;score=score1;}

①析構(gòu)函數(shù)與類名相同,但它前面必須加一個波浪號(~)②析構(gòu)函數(shù)沒有參數(shù),也沒有返回值

③當(dāng)撤消對象時,編譯系統(tǒng)會自動地調(diào)用析構(gòu)函數(shù)析構(gòu)函數(shù)有以下一些特點:

(1)析構(gòu)函數(shù)名與類名相同,但它前面必須加一個波浪號(~)。(2)析構(gòu)函數(shù)不返回任何值。在定義析構(gòu)函數(shù)時,是不能說明它的類型的,甚至說明為void類型也不行。(3)撤銷對象時,編譯系統(tǒng)會自動地調(diào)用析構(gòu)函數(shù)。#include<iostream>//含有構(gòu)造函數(shù)和析構(gòu)函數(shù)的Date類。usingnamespacestd;classDate{public:

Date(inty,intm,intd);//聲明構(gòu)造函數(shù)

~Date();//聲明析構(gòu)函數(shù)voidsetDate(inty,intm,intd);voidshowDate();private:intyear;intmonth;intday;};

Date::Date(inty,intm,intd)//定義構(gòu)造函數(shù){cout<<"constructing..."<<endl;year=y;month=m;day=d;}

Date::~Date()//定義析構(gòu)函數(shù){cout<<"destruting..."<<endl; }voidDate::setDate(inty,intm,intd){year=y;month=m;day=d;}inlinevoidDate::showDate(){cout<<year<<"."<<month<<"."<<day<<endl;}intmain(){Datedate1(2010,4,28);

date1.showDatereturn0;}程序運行結(jié)果如下:constructing...2010

.4.28destruting...

定義類Date的對象date1,調(diào)用date1的構(gòu)造函數(shù),初始化對象date1說明:

在以下情況,當(dāng)對象的生命周期結(jié)束時,析構(gòu)函數(shù)會被自動調(diào)用:

①如果定義了一個全局對象,則在程序流程離開其作用域時(如main函數(shù)結(jié)束或調(diào)用exit函數(shù))時,調(diào)用該全局對象的析構(gòu)函數(shù)。

②如果一個對象被定義在一個函數(shù)體內(nèi),則當(dāng)這個函數(shù)結(jié)束時,該對象的析構(gòu)函數(shù)被自動調(diào)用。

③若一個對象是使用new運算符動態(tài)創(chuàng)建的,在使用delete運算符釋放它時,delete會自動調(diào)用析構(gòu)函數(shù)。

#include<iostream>//較完整的學(xué)生類示例。#include<string>usingnamespacestd;classStudent{public:

Student(char*name1,char*stu_no1,floatscore1);//聲明構(gòu)造函數(shù)~Student();//聲明析構(gòu)函數(shù)voiddisp();//成員函數(shù),用于顯示數(shù)據(jù)private: char*name;char*stu_no;floatscore;};

//姓名,學(xué)號,成績Student::Student(char*name1,char*stu_no1,floatscore1){name=newchar[strlen(name1)+1];strcpy(name,name1);stu_no=newchar[strlen(stu_no1)+1];strcpy(stu_no,stu_no1);score=score1;}定義構(gòu)造函數(shù)Student::~Student()//定義析構(gòu)函數(shù){delete[]name;delete[]stu_no;}voidStudent::disp(){cout<<"name:"<<name<<endl;cout<<"stu_no:"<<stu_no<<endl;cout<<"score:"<<score<<endl;}intmain(){Studentstu1("Liming","20080201",90);stu1.disp();

Studentstu2("Wangfun","20080202",85);

stu2.disp();return0;}

定義類Student的對象stu1,調(diào)用構(gòu)造函數(shù),初始化對象stu1

定義類Student的對象stu2,調(diào)用構(gòu)造函數(shù),初始化對象stu2運行結(jié)果如下:name:Limingstu_no:20080201score:90name:Wangfunstu_no:20080202score:855自引用指針this成員函數(shù)的存儲方式

classBox{intx;intprint(){cout<<x;}};

Box對象1,對象2,對象3;

不同對象的數(shù)據(jù)成員存放在不同的內(nèi)存地址

所有對象的成員函數(shù)對應(yīng)的是同一個函數(shù)代碼段#include<iostream>usingnamespacestd;classA{intx;public:A(intx1){x=x1;}

voiddisp(){cout<<"whenx="<<this->x;}

};main() {Aa(1),b(2),c(3);

a.disp();b.disp();c.disp();return0;}

當(dāng)一個對象要調(diào)用成員函數(shù)時,this指針中就裝著該對象的地址,成員函數(shù)就根據(jù)這個指針,找到相應(yīng)的數(shù)據(jù),然而進行相應(yīng)的操作。a.xb.xb.x運行結(jié)果:whenx=1whenx=2whenx=3在C++成員函數(shù)中事先設(shè)置了一個名為this的對象指針

在通常情況下,this指針在糸統(tǒng)中是隱式地存在的。我們也可以將其顯式地表示出來。

#include<iostream.h>classA{intx;public:A(intx1){x=x1;}voiddisp(){cout<<"\nthis="<<this<<"whenx="<<this->x;}};main()

溫馨提示

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

最新文檔

評論

0/150

提交評論