




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣西2025年02月柳州市事業(yè)單位度上半年公開考試招考工作人員筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 運動療法在成人脊柱側(cè)彎康復(fù)中的實踐案例
- 合同要約與承諾重慶市房屋建筑與市政基礎(chǔ)設(shè)施工程現(xiàn)場施工專業(yè)人員土建預(yù)算員培訓(xùn)
- 建設(shè)工程招投標的分類學(xué)習(xí)情境一建設(shè)工程承發(fā)包與招投標認知課件
- 建設(shè)工程招標標底的概念及作用課件
- 垃圾清合同范本
- 廣州松田職業(yè)學(xué)院《臨床藥理學(xué)與傳染病學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 1.2 《復(fù)雜多變的關(guān)系》-課件- -2024-2025學(xué)年統(tǒng)編版道德與法治九年級下冊
- 山東華宇工學(xué)院《機場信息系統(tǒng)》2023-2024學(xué)年第二學(xué)期期末試卷
- 河南大學(xué)《金屬學(xué)原理Ⅱ》2023-2024學(xué)年第二學(xué)期期末試卷
- 咨詢公司項目風(fēng)險控制方案
- 2024年初一英語閱讀理解專項練習(xí)及答案
- 污水處理廠防水防腐工程施工方案
- 病例報告表(CRF)模板
- 2024年云南昆明市教育體育局直屬學(xué)校(單位)選調(diào)10人易考易錯模擬試題(共500題)試卷后附參考答案
- (完整版)建筑工程項目精益建造實施計劃書
- 《2024年 《法學(xué)引注手冊》示例》范文
- DL∕T 2447-2021 水電站防水淹廠房安全檢查技術(shù)規(guī)程
- NB-T+10499-2021水電站橋式起重機選型設(shè)計規(guī)范
- 城市更新可行性研究結(jié)論與建議
- 廣東省深圳市2024年高一下學(xué)期期末調(diào)研考試英語試題含解析
評論
0/150
提交評論