




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、主要內(nèi)容主要內(nèi)容n 構(gòu)造函數(shù)構(gòu)造函數(shù), ,重載構(gòu)造函數(shù);重載構(gòu)造函數(shù);析構(gòu)析構(gòu)函數(shù)函數(shù)n 對(duì)象數(shù)組和對(duì)象指針對(duì)象數(shù)組和對(duì)象指針n 公用數(shù)據(jù)的保護(hù):靜態(tài)成員公用數(shù)據(jù)的保護(hù):靜態(tài)成員n 對(duì)象的賦值和復(fù)制:對(duì)象的賦值和復(fù)制:拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)n 友元友元n 類模板類模板1. #include 2.using namespace std;3. class Date 4. public:5.void setDate(int y,int m,int d); 6.void showDate();7. private:8. int year, month, day;9. ;10. void Date:s
2、etDate(int y,int m,int d) 11. year=y; month=m; day=d; 12.void Date:showDate()13. coutyear.month.dayendl; 構(gòu)造函數(shù)構(gòu)造函數(shù) 13.void main()14.15. Date date1; 16. date1.setDate(2008,8,8);17. coutDate1 output1:endl;18. date1.showDate(); 19. #include using namespace std; class Date public: Data(int y,int m,int d)
3、; void showDate(); private: int year, month, day; ; Date:Date (int y,int m,int d) year=y; month=m; day=d; inline void Date:showDate() coutyear.month.dayendl; 構(gòu)造函數(shù)構(gòu)造函數(shù)利用構(gòu)造函數(shù)創(chuàng)建對(duì)象利用構(gòu)造函數(shù)創(chuàng)建對(duì)象其一般形式為其一般形式為: : 類名類名 對(duì)象名對(duì)象名(實(shí)參表實(shí)參表);); Date date1(2008,8,8);void main() Date date1(2008,8,8); coutDate1 output1:en
4、dl; date1.showDate(); 構(gòu)造函數(shù)的特點(diǎn)構(gòu)造函數(shù)的特點(diǎn)n 類的一個(gè)成員函數(shù);類的一個(gè)成員函數(shù);n 未聲明返回值類型;未聲明返回值類型;n 名字與類名相同;名字與類名相同;n 未顯式地調(diào)用。未顯式地調(diào)用。n 公有函數(shù)公有函數(shù)注意:一個(gè)類中可以定義多個(gè)參數(shù)注意:一個(gè)類中可以定義多個(gè)參數(shù)個(gè)數(shù)或參數(shù)類型不個(gè)數(shù)或參數(shù)類型不同同的構(gòu)造函數(shù)。的構(gòu)造函數(shù)。練習(xí):練習(xí):n仿照上例,編寫仿照上例,編寫coordcoord類的構(gòu)造函數(shù)類的構(gòu)造函數(shù)構(gòu)造函數(shù)的構(gòu)造函數(shù)的作用作用n 構(gòu)造函數(shù)用于為對(duì)象分配空間和進(jìn)行初始化構(gòu)造函數(shù)用于為對(duì)象分配空間和進(jìn)行初始化class Studentstring nam
5、e;int age;int *score;int courseNum;public:Student(string n, int a,int cn);void showStudent();Student:Student(string n, int a, int cn) name = n; age = a; courseNum = cn; score = new intcourseNum; for (int i = 0; i scorei;void Student:showStudent().Date:Date (int y,int m,int d) year=y; month=m; day=d;
6、 Date:Date() year = 2001;month = 1;day=1;Date:Date(int y) year = y;month=1;day=1; inline void Date:showDate() coutyear.month.dayendl; #include using namespace std; class Date public: Date(int y,int m,int d); Date(); Date(int y); void showDate(); private: int year, month, day; ;構(gòu)造函數(shù)的重載構(gòu)造函數(shù)的重載一個(gè)類中可以定義
7、多個(gè)參數(shù)一個(gè)類中可以定義多個(gè)參數(shù)個(gè)數(shù)或參數(shù)類型不同個(gè)數(shù)或參數(shù)類型不同的構(gòu)造函數(shù)。的構(gòu)造函數(shù)。void main() Date date1(2008,8,8); Date date2; Date date3(2008); coutDate1 output1:endl; date1.showDate(); coutDate2 output2:endl; date2.showDate(); coutDate3 output3:endl; date3.showDate(); 構(gòu)造函數(shù)的重載構(gòu)造函數(shù)的重載說明:說明:n 構(gòu)造函數(shù)允許被重載構(gòu)造函數(shù)允許被重載n 對(duì)象定義時(shí),只能有一個(gè)構(gòu)造函數(shù)起作用對(duì)象定義
8、時(shí),只能有一個(gè)構(gòu)造函數(shù)起作用n 使用無參構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí)不用加()使用無參構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí)不用加()n 重載構(gòu)造函數(shù)時(shí)應(yīng)避免二義性重載構(gòu)造函數(shù)時(shí)應(yīng)避免二義性構(gòu)造函數(shù)的重載構(gòu)造函數(shù)的重載練習(xí):練習(xí):n仿照上例,編寫仿照上例,編寫coordcoord類的構(gòu)造函數(shù)類的構(gòu)造函數(shù)n Date:Date() n 沒有顯式定義構(gòu)造函數(shù)時(shí),系統(tǒng)默認(rèn)提供的(另沒有顯式定義構(gòu)造函數(shù)時(shí),系統(tǒng)默認(rèn)提供的(另有一種說法是某些情況下才提供默認(rèn)構(gòu)造函數(shù))有一種說法是某些情況下才提供默認(rèn)構(gòu)造函數(shù))n 默認(rèn)構(gòu)造函數(shù)不進(jìn)行變量初始化默認(rèn)構(gòu)造函數(shù)不進(jìn)行變量初始化n 定義對(duì)象時(shí),不需要定義對(duì)象時(shí),不需要()()n 一旦定義了構(gòu)造
9、函數(shù),就不再提供默認(rèn)構(gòu)造函數(shù)一旦定義了構(gòu)造函數(shù),就不再提供默認(rèn)構(gòu)造函數(shù)默認(rèn)構(gòu)造函數(shù)默認(rèn)構(gòu)造函數(shù)Date:Date (int y,int m,int d) year=y; month=m; day=d; Date:Date(int y) year = y;month=1;day=1; inline void Date:showDate() coutyear.month.dayendl; #include using namespace std; class Date public: Date(int y,int m,int d); Date(int y); void showDate(); pr
10、ivate: int year, month, day; ;默認(rèn)構(gòu)造函數(shù)默認(rèn)構(gòu)造函數(shù)int main() Date date1(2008,8,8); Date date2; Date date3(2008); coutDate1 output1:endl; date1.showDate(); coutDate2 output2:endl; date2.showDate(); coutDate3 output3:endl; date3.showDate(); return 0; 默認(rèn)構(gòu)造函數(shù)默認(rèn)構(gòu)造函數(shù)Date:Date (int y,int m,int d) year=y; month=m;
11、day=d; inline void Date:showDate() coutyear.month.dayendl; #include using namespace std; class Date public: Date(int y=2001,int m=1,int d=1); void showDate(); private: int year, month, day; ;帶缺省參數(shù)的構(gòu)造函數(shù)帶缺省參數(shù)的構(gòu)造函數(shù)Date:Date (int y,int m,int d) year=y; month=m; day=d; inline void Date:showDate() coutyea
12、r.month.dayendl; #include using namespace std; class Date public: Date(int y=2001,int m=1,int d=1); void showDate(); private: int year, month, day; ;int main() Date date1(2008,8,8); Date date2; Date date3(2008); coutDate1 output1:endl; date1.showDate(); coutDate2 output2:endl; date2.showDate(); cout
13、Date3 output3:endl; date3.showDate(); return 0; 帶缺省參數(shù)的構(gòu)造函數(shù)帶缺省參數(shù)的構(gòu)造函數(shù)說明說明n 構(gòu)造函數(shù)在類外定義,則構(gòu)造函數(shù)在類外定義,則默認(rèn)參數(shù)應(yīng)該在類的聲明構(gòu)造函默認(rèn)參數(shù)應(yīng)該在類的聲明構(gòu)造函數(shù)原型時(shí)指數(shù)原型時(shí)指定,而不能在類外定義時(shí)指定定,而不能在類外定義時(shí)指定n 部分給默認(rèn)參數(shù),取默認(rèn)值的參數(shù)必須在參數(shù)右邊。部分給默認(rèn)參數(shù),取默認(rèn)值的參數(shù)必須在參數(shù)右邊。 Date(int y=2012,int m,int ); Date d(6,6);n 調(diào)用時(shí),若一個(gè)參數(shù)省略,則其后參數(shù)必須全省略調(diào)用時(shí),若一個(gè)參數(shù)省略,則其后參數(shù)必須全省略 Dat
14、e(int y,int m=1,int n=1); Date d(2012, ,6)n 一個(gè)類中定義了全部是默認(rèn)參數(shù)的構(gòu)造函數(shù)后,不能再定一個(gè)類中定義了全部是默認(rèn)參數(shù)的構(gòu)造函數(shù)后,不能再定義重載構(gòu)造函數(shù)。(二義性)義重載構(gòu)造函數(shù)。(二義性) Date (); Date (int y=0,int m=0,int d=0)練習(xí):練習(xí):n用帶默認(rèn)參數(shù)的形式,編寫用帶默認(rèn)參數(shù)的形式,編寫CoordCoord類的構(gòu)造函數(shù)類的構(gòu)造函數(shù)成員初始化表成員初始化表 帶有成員初始化表的構(gòu)造函數(shù)的一般形式如下帶有成員初始化表的構(gòu)造函數(shù)的一般形式如下: : 類名類名:構(gòu)造函數(shù)名構(gòu)造函數(shù)名(參數(shù)表參數(shù)表):(:(成員初
15、始化表成員初始化表) / / 構(gòu)造函數(shù)體構(gòu)造函數(shù)體 成員初始化表成員初始化表的一般形式為的一般形式為: : 數(shù)據(jù)成員名數(shù)據(jù)成員名1(1(初始值初始值1),1),數(shù)據(jù)成員名數(shù)據(jù)成員名2(2(初始值初始值2),2), 成員初始化表成員初始化表Date:Date (int y,int m,int d):year(y),month(m),day(d) inline void Date:showDate() coutyear.month.dayendl; #include using namespace std; class Date public: Date(int y,int m,int d); v
16、oid showDate(); private: int year, month, day; ;1. #include 2.using namespace std;3. class A4. public:5.A(int x1):x(x1),rx(x),pi(3.14) / rx(x)相當(dāng)于相當(dāng)于rx=x ,6. / pi(3.14)相當(dāng)于相當(dāng)于pi=3.147.void print()8. coutx=x rx=rx pi=pi; 9. private:10.int x,rx; const float pi;11. ;成員初始化表成員初始化表 注意注意1.若要將數(shù)據(jù)成員存放在堆或數(shù)組中,若要將
17、數(shù)據(jù)成員存放在堆或數(shù)組中,則應(yīng)在構(gòu)造函數(shù)中則應(yīng)在構(gòu)造函數(shù)中進(jìn)行賦值,不能使用成員初始化表。進(jìn)行賦值,不能使用成員初始化表。class Studentstring name;int age;int *score;int courseNum;public:Student(string n, int a,int cn);void showStudent();Student:Student(string n, int a, int cn) :name(n), age(a), courseNum(cn)score = new intcourseNum;for (int i = 0; i scorei;2
18、.2.類成員按它們?cè)陬惱锉宦暶鞯捻樞蜻M(jìn)行初始化,與其在類成員按它們?cè)陬惱锉宦暶鞯捻樞蜻M(jìn)行初始化,與其在成員初始化表中列出的順序無關(guān)。成員初始化表中列出的順序無關(guān)。#include using namespace std;class Testpublic:Test(int m): k(m) ,i(k+2) void Show()coutiendlk;private:int i; int k; ;void main()Test t1(6);t1.Show();注意注意成員初始化表成員初始化表n 設(shè)計(jì)設(shè)計(jì)BoxBox類,計(jì)算盒子體積。類,計(jì)算盒子體積。n 用以下三種方式初始化用以下三種方式初始化Bo
19、xBox類:類:帶參構(gòu)造函數(shù),接收參數(shù)分別給長(zhǎng)寬高賦值帶參構(gòu)造函數(shù),接收參數(shù)分別給長(zhǎng)寬高賦值默認(rèn)構(gòu)造函數(shù),使得長(zhǎng)寬高初始化為(默認(rèn)構(gòu)造函數(shù),使得長(zhǎng)寬高初始化為(10,10,1010,10,10)帶默認(rèn)參數(shù)的構(gòu)造函數(shù),使不提供參數(shù)時(shí)長(zhǎng)寬高初始化為(帶默認(rèn)參數(shù)的構(gòu)造函數(shù),使不提供參數(shù)時(shí)長(zhǎng)寬高初始化為(1,1,11,1,1)成員初始化表完成長(zhǎng)寬高的初始化成員初始化表完成長(zhǎng)寬高的初始化n 寫出寫出SalarySalary類的構(gòu)造函數(shù)類的構(gòu)造函數(shù)1.通常,在構(gòu)造函數(shù)中只做簡(jiǎn)單初始化,不寫復(fù)雜程序通常,在構(gòu)造函數(shù)中只做簡(jiǎn)單初始化,不寫復(fù)雜程序2.構(gòu)造函數(shù)中用構(gòu)造函數(shù)中用new分配的存儲(chǔ)空間,怎么收回?分配
20、的存儲(chǔ)空間,怎么收回?析構(gòu)函數(shù)析構(gòu)函數(shù)n 析構(gòu)函數(shù)的功能:析構(gòu)函數(shù)的功能: 撤消對(duì)象時(shí)的清理撤消對(duì)象時(shí)的清理, ,如釋放分配給對(duì)象的內(nèi)存空間等。如釋放分配給對(duì)象的內(nèi)存空間等。n 析構(gòu)函數(shù)的特點(diǎn)析構(gòu)函數(shù)的特點(diǎn): :(1)(1)析構(gòu)函數(shù)與構(gòu)造函數(shù)名字相同析構(gòu)函數(shù)與構(gòu)造函數(shù)名字相同, ,但它前面必須加一但它前面必須加一個(gè)波浪號(hào)個(gè)波浪號(hào)();();(2)(2)析構(gòu)函數(shù)沒有參數(shù)析構(gòu)函數(shù)沒有參數(shù), ,也沒有返回值也沒有返回值, ,而且不能重載。而且不能重載。因此在一個(gè)類中只能有一個(gè)析構(gòu)函數(shù)因此在一個(gè)類中只能有一個(gè)析構(gòu)函數(shù); ;(3)(3)當(dāng)撤消對(duì)象時(shí)當(dāng)撤消對(duì)象時(shí), ,編譯系統(tǒng)會(huì)自動(dòng)地調(diào)用析構(gòu)函數(shù)。編譯系統(tǒng)
21、會(huì)自動(dòng)地調(diào)用析構(gòu)函數(shù)。 #include class Date public: Date(int y,int m,int d); / 構(gòu)造函數(shù)構(gòu)造函數(shù) Date(); / 析構(gòu)函數(shù)析構(gòu)函數(shù) void showDate(); private: int year, month, day;Date:Date(int y,int m,int d) / 構(gòu)造函數(shù)的實(shí)現(xiàn)構(gòu)造函數(shù)的實(shí)現(xiàn) cout“創(chuàng)建創(chuàng)建endl; year=y; month=m; day=d; 析構(gòu)函數(shù)析構(gòu)函數(shù)Date:Date() / 析構(gòu)函數(shù)的實(shí)現(xiàn)析構(gòu)函數(shù)的實(shí)現(xiàn) cout“銷毀銷毀endl;void Date:showDate() c
22、outyear.month.dayendl; void main() Date date1(1998,4,28); coutDate1 output1:endl; date1.showDate(); 析構(gòu)函數(shù)析構(gòu)函數(shù)n 若一個(gè)對(duì)象在完成其操作之前需要做一些內(nèi)部處理(如釋若一個(gè)對(duì)象在完成其操作之前需要做一些內(nèi)部處理(如釋放由放由new動(dòng)態(tài)分配的空間),則需要顯示定義析構(gòu)函數(shù)。動(dòng)態(tài)分配的空間),則需要顯示定義析構(gòu)函數(shù)。class strchar *s;int max_len;public:str(char*) s=new charmax_len; str() delete s; ;析構(gòu)函數(shù)析構(gòu)函數(shù)
23、模擬上例完成模擬上例完成Salary類的析構(gòu)函數(shù)類的析構(gòu)函數(shù) 一個(gè)對(duì)象生命期結(jié)束時(shí)一個(gè)對(duì)象生命期結(jié)束時(shí),該對(duì)象的析構(gòu)函數(shù)被,該對(duì)象的析構(gòu)函數(shù)被自動(dòng)調(diào)用。如,函數(shù)內(nèi)自動(dòng)調(diào)用。如,函數(shù)內(nèi)的局部對(duì)象的局部對(duì)象 析構(gòu)函數(shù)的調(diào)用時(shí)機(jī)析構(gòu)函數(shù)的調(diào)用時(shí)機(jī)void fun() cout“in fun.”endl; Date d(2001,5,6); d.showDate(); void main() cout“in main.”endl; fun(); cout”out of fun”endl; 全局對(duì)象(在函數(shù)外定全局對(duì)象(在函數(shù)外定義的對(duì)象)當(dāng)義的對(duì)象)當(dāng)main函數(shù)函數(shù)結(jié)束或執(zhí)行結(jié)束或執(zhí)行exit命令時(shí)
24、命令時(shí)自動(dòng)執(zhí)行析構(gòu)函數(shù)釋放自動(dòng)執(zhí)行析構(gòu)函數(shù)釋放對(duì)象。對(duì)象。析構(gòu)函數(shù)的調(diào)用時(shí)機(jī)析構(gòu)函數(shù)的調(diào)用時(shí)機(jī)Date d(2001,5,6);void fun() cout“in fun.”endl; d.showDate(); void main() cout“in main.”endl; fun(); cout”out of fun”endl;析構(gòu)函數(shù)調(diào)用順序析構(gòu)函數(shù)調(diào)用順序?qū)ο髮?duì)象1 的構(gòu)的構(gòu)造函數(shù)造函數(shù)對(duì)象對(duì)象2 的構(gòu)的構(gòu)造函數(shù)造函數(shù)對(duì)象對(duì)象3 的構(gòu)的構(gòu)造函數(shù)造函數(shù)對(duì)象對(duì)象1 的析的析構(gòu)函數(shù)構(gòu)函數(shù)對(duì)象對(duì)象2 的析的析構(gòu)函數(shù)構(gòu)函數(shù)對(duì)象對(duì)象3 的析的析構(gòu)函數(shù)構(gòu)函數(shù)n 當(dāng)有多個(gè)對(duì)象時(shí),先構(gòu)造的后析構(gòu)當(dāng)有多
25、個(gè)對(duì)象時(shí),先構(gòu)造的后析構(gòu)析構(gòu)函數(shù)調(diào)用順序析構(gòu)函數(shù)調(diào)用順序#include using namespace std;class Student int ID; float score;public: Student( int id, float s); Student();Student:Student( int id, float s):ID(id),score(s) couthello IDendl;Student:Student() coutbye IDendl;int main() Student s1(101,80.5) Student s1(102,70.5);靜態(tài)局部對(duì)象靜態(tài)局部對(duì)
26、象,則在第一次調(diào)用該函數(shù)建立對(duì)象時(shí)調(diào)用構(gòu)造函,則在第一次調(diào)用該函數(shù)建立對(duì)象時(shí)調(diào)用構(gòu)造函數(shù),但要在主函數(shù)結(jié)束才調(diào)用析構(gòu)函數(shù)。數(shù),但要在主函數(shù)結(jié)束才調(diào)用析構(gòu)函數(shù)。void fn()student st1; / 定義局部自動(dòng)對(duì)象定義局部自動(dòng)對(duì)象 static student st2; / 定義靜態(tài)局部對(duì)象定義靜態(tài)局部對(duì)象 析構(gòu)函數(shù)調(diào)用順序析構(gòu)函數(shù)調(diào)用順序?qū)ο髷?shù)組對(duì)象數(shù)組所謂對(duì)象數(shù)組是指每一數(shù)組元素都是對(duì)象的數(shù)組所謂對(duì)象數(shù)組是指每一數(shù)組元素都是對(duì)象的數(shù)組, ,。定義一個(gè)一維對(duì)象數(shù)組的格式如下定義一個(gè)一維對(duì)象數(shù)組的格式如下: : 類名類名 數(shù)組名數(shù)組名 下標(biāo)表達(dá)式下標(biāo)表達(dá)式; 例如:例如: Studen
27、t s10;Student s10;對(duì)象數(shù)組中每個(gè)元素就是一個(gè)對(duì)象,通過對(duì)象可以訪問類的對(duì)象數(shù)組中每個(gè)元素就是一個(gè)對(duì)象,通過對(duì)象可以訪問類的公有成員。公有成員。 數(shù)組名數(shù)組名 下標(biāo)下標(biāo).成員名成員名在建立數(shù)組時(shí),同樣要調(diào)用構(gòu)造函數(shù)。上面的數(shù)組有在建立數(shù)組時(shí),同樣要調(diào)用構(gòu)造函數(shù)。上面的數(shù)組有5050個(gè)元個(gè)元素,要調(diào)用素,要調(diào)用5050次構(gòu)造函數(shù)。如果構(gòu)造函數(shù)有多個(gè)參數(shù),次構(gòu)造函數(shù)。如果構(gòu)造函數(shù)有多個(gè)參數(shù),C+ C+ 要求:在等號(hào)后的花括號(hào)中為每個(gè)對(duì)象分別寫出構(gòu)造函數(shù)并要求:在等號(hào)后的花括號(hào)中為每個(gè)對(duì)象分別寫出構(gòu)造函數(shù)并指定實(shí)參。格式為:指定實(shí)參。格式為:student student ststn
28、=student ( n=student ( 實(shí)參實(shí)參1,1,實(shí)參實(shí)參2,2,實(shí)參實(shí)參3 )3 ), student ( student ( 實(shí)參實(shí)參1,1,實(shí)參實(shí)參2,2,實(shí)參實(shí)參3 )3 ) ; ; 對(duì)象數(shù)組對(duì)象數(shù)組析構(gòu)函數(shù)調(diào)用順序析構(gòu)函數(shù)調(diào)用順序#include using namespace std;class Student int ID; float score;public: Student( int id, float s); Student();Student:Student( int id, float s):ID(id),score(s) couthello IDendl
29、;Student:Student() coutbye IDendl;int main() student std 3 =student(1001, 87),student(1002, 76),student(1003, 80) ;#include using namespace std;class Catpublic: Cat( ) age=10; Cat(int n) age=n; Cat() cout析構(gòu)函數(shù)被調(diào)用析構(gòu)函數(shù)被調(diào)用ageendl; int get_age() return age; private: int age;對(duì)象數(shù)組對(duì)象數(shù)組main() Cat ob14; Cat o
30、b24=11,22,33,44; Cat ob34=55,66; for (int i=0;i4;i+) coutob1i.get_age() ; coutendl; for (int i=0;i4;i+) coutob2i.get_age() ; coutendl; for (int i=0;i4;i+) coutob3i.get_age() ; coutendl; return 0; 10.main()11.12. Cat ob34=Cat(11),Cat(22),Cat(33), Cat(44);13. Cat ob44=Cat(55), Cat(66);14. int i; 15. f
31、or (i=0;i4;i+) 16. coutob3i.get_age() ; 17. coutendl;18. for (i=0;i4;i+)19. coutob4i.get_age() ; 20. cout-成員名成員名 或或 ( (* *指針名指針名).).成員名成員名#include class exepublic: void exe(int a) x=a; void showA() coutxshowA(); (*p).showA(); return 0; 指向?qū)ο蟪蓡T的指針指向?qū)ο蟪蓡T的指針 對(duì)象由成員組成。對(duì)象占據(jù)的內(nèi)存區(qū)是各個(gè)數(shù)據(jù)成員占據(jù)對(duì)象由成員組成。對(duì)象占據(jù)的內(nèi)存區(qū)是各個(gè)數(shù)
32、據(jù)成員占據(jù)的內(nèi)存區(qū)的總和。對(duì)象成員也有地址,即指針。這的內(nèi)存區(qū)的總和。對(duì)象成員也有地址,即指針。這指針分指針分指向數(shù)據(jù)成員的指針和指向成員函數(shù)的指針指向數(shù)據(jù)成員的指針和指向成員函數(shù)的指針。1. 1. 指向?qū)ο蠊袛?shù)據(jù)成員的指針指向?qū)ο蠊袛?shù)據(jù)成員的指針 定義數(shù)據(jù)成員的指針變量定義數(shù)據(jù)成員的指針變量 數(shù)據(jù)類型數(shù)據(jù)類型 * * 指針變量名指針變量名計(jì)算公有數(shù)據(jù)成員的地址計(jì)算公有數(shù)據(jù)成員的地址 & &對(duì)象名對(duì)象名. .成員名成員名這里的數(shù)據(jù)類型是數(shù)據(jù)成員的數(shù)據(jù)類型。這里的數(shù)據(jù)類型是數(shù)據(jù)成員的數(shù)據(jù)類型。例:例: Time t1;Time t1; int int * * p1; p1;
33、/ / 定義一個(gè)指向整型數(shù)據(jù)的指針變量定義一個(gè)指向整型數(shù)據(jù)的指針變量 p1 = & t1.hour; p1 = & t1.hour; / / 假定假定hourhour是公有成員是公有成員 cout cout * *p1 endl;p1 endl;2. 2. 指向?qū)ο蟪蓡T函數(shù)的指針指向?qū)ο蟪蓡T函數(shù)的指針 定義指向成員函數(shù)的指針變量定義指向成員函數(shù)的指針變量 數(shù)據(jù)類型數(shù)據(jù)類型 ( 類名類名:* 變量名變量名 )( 形參表形參表 ); 數(shù)據(jù)類型數(shù)據(jù)類型是成員函數(shù)的類型。類名是類名是對(duì)象所屬的類變量名變量名按標(biāo)識(shí)符取名形參表形參表:指定成員函數(shù)的形參表(形參個(gè)數(shù)、類型)取成員函數(shù)的地址
34、取成員函數(shù)的地址 & &類名類名:成員函數(shù)名給指針變量賦初值給指針變量賦初值 指針變量名指針變量名= & = & 類名類名:成員函數(shù)名成員函數(shù)名 ; ;用指針變量調(diào)用成員函數(shù)用指針變量調(diào)用成員函數(shù) ( (對(duì)象名對(duì)象名. .* *指針變量名指針變量名)()(實(shí)參表實(shí)參表););對(duì)象名:是指定調(diào)用成員函數(shù)的對(duì)象。對(duì)象名:是指定調(diào)用成員函數(shù)的對(duì)象。* *:明確其后的是一個(gè)指針變量。:明確其后的是一個(gè)指針變量。實(shí)參表:與成員函數(shù)的形參表對(duì)應(yīng)實(shí)參表:與成員函數(shù)的形參表對(duì)應(yīng)#include using namespace std; class Time public: Ti
35、me(int,int,int); int hour; int minute; int sec; void get_time(); ;例例3.7 有關(guān)對(duì)象指針的使用方法有關(guān)對(duì)象指針的使用方法Time:Time(int h,int m,int s) hour = h; minute = m; sec = s; void Time:get_time() couthour:minute:secendl; int main() Time t1(10,13,56); int *p1=&t1.hour; / 定義指向成員的指針定義指向成員的指針p1 cout*p1get_time(); / 用對(duì)象指
36、針調(diào)用成員函數(shù)用對(duì)象指針調(diào)用成員函數(shù) void (Time:*p3)(); / 定義指向成員函數(shù)的指針定義指向成員函數(shù)的指針 p3=&Time:get_time; / 給成員函數(shù)的指針賦值給成員函數(shù)的指針賦值 (t1.*p3)(); / 用指向成員函數(shù)的指針調(diào)用成員函數(shù)用指向成員函數(shù)的指針調(diào)用成員函數(shù) return 0; This指針指針class Coord private: int x; int y; public: Coord(int m,int n); int showXY(); ;Coord:Coord(int m,int n) x=m; y=n;void Coord:sho
37、wXY() coutx,yendl;int main() Coord c1(3,5); Coord c2(8,8); c1.showXY(); c2.showXY(); return 0;程序如何知道該輸出哪個(gè)值?程序如何知道該輸出哪個(gè)值?n this,其值是當(dāng)前被調(diào)用的成員函數(shù)所在的對(duì)象的起始地其值是當(dāng)前被調(diào)用的成員函數(shù)所在的對(duì)象的起始地址址this,指向當(dāng)前對(duì)象的指針,指向當(dāng)前對(duì)象的指針n 創(chuàng)建對(duì)象時(shí)創(chuàng)建對(duì)象時(shí)this指針指向該對(duì)象;指針指向該對(duì)象;n this指針是作為隱含的參數(shù)在指針是作為隱含的參數(shù)在調(diào)用對(duì)象的函數(shù)時(shí)調(diào)用對(duì)象的函數(shù)時(shí)傳遞給該傳遞給該函數(shù)。函數(shù)。n 可以用它來確定函數(shù)訪問
38、的是哪一個(gè)對(duì)象的數(shù)據(jù)成員可以用它來確定函數(shù)訪問的是哪一個(gè)對(duì)象的數(shù)據(jù)成員This指針指針this 指針引例指針引例void Coord:showXY(Coord *this) coutx,yendl;int main() Coord c1(3,5); Coord c2(8,8); c1.showXY(&c1); c2.showXY(&c2); return 0;使用使用thisthis應(yīng)注意的問題應(yīng)注意的問題n this的作用域僅在一個(gè)對(duì)象內(nèi)部。的作用域僅在一個(gè)對(duì)象內(nèi)部。例如,在類外的語句:例如,在類外的語句: A a; a.this; 錯(cuò)誤錯(cuò)誤n 在對(duì)象內(nèi)部,在對(duì)象內(nèi)部,thi
39、s指針是一個(gè)指針是一個(gè)const指針。指針。 例如:例如: this=&p; ; 錯(cuò)誤錯(cuò)誤1.#include 2.class example3.public:4.example( int n, int m)5.x=n; y=m;6.int getX()7.return x;8.int getY()9.return y;10.private:11.int x,y;12.;用對(duì)象指針訪問對(duì)象數(shù)組用對(duì)象指針訪問對(duì)象數(shù)組13.main()14. int i;15.example op4=example(1,2),example(3,4),example(5,6),example(7,8);1
40、6.example *p; 17. p=&op3;18.for(i=0;i4;i+)19. coutgetX() ;20. coutgetY()n;21. p-; 22.coutcreate();說明說明函數(shù)結(jié)束了,函數(shù)結(jié)束了,dlg還在。這個(gè)非還在。這個(gè)非模式對(duì)話框還在模式對(duì)話框還在1.1.newnew創(chuàng)建類對(duì)象需要指針接收,一處初始化,多處使用創(chuàng)建類對(duì)象需要指針接收,一處初始化,多處使用 2.2.newnew創(chuàng)建類對(duì)象使用完需創(chuàng)建類對(duì)象使用完需deletedelete銷毀銷毀 3.3.newnew創(chuàng)建對(duì)象直接使用堆空間,而不用創(chuàng)建對(duì)象直接使用堆空間,而不用newnew定義類對(duì)象則使
41、定義類對(duì)象則使用??臻g用??臻g 4.4.newnew對(duì)象指針用途廣泛,比如作為函數(shù)返回值、函數(shù)參數(shù)等對(duì)象指針用途廣泛,比如作為函數(shù)返回值、函數(shù)參數(shù)等 說明說明共用數(shù)據(jù)的保護(hù)共用數(shù)據(jù)的保護(hù) 如果即希望數(shù)據(jù)在一定范圍內(nèi)共享,又不愿它被隨意修改,如果即希望數(shù)據(jù)在一定范圍內(nèi)共享,又不愿它被隨意修改,從技術(shù)上可以把數(shù)據(jù)指定為只讀型的。從技術(shù)上可以把數(shù)據(jù)指定為只讀型的。C+C+提供提供constconst手段,手段,將數(shù)據(jù)、對(duì)象、成員函數(shù)指定為常量,從而實(shí)現(xiàn)了只讀要將數(shù)據(jù)、對(duì)象、成員函數(shù)指定為常量,從而實(shí)現(xiàn)了只讀要求,達(dá)到保護(hù)數(shù)據(jù)的目的。求,達(dá)到保護(hù)數(shù)據(jù)的目的。常類型常類型n 目的:為了保證數(shù)據(jù)共享又防止
42、數(shù)據(jù)被改動(dòng)。目的:為了保證數(shù)據(jù)共享又防止數(shù)據(jù)被改動(dòng)。n const 類型修飾符類型修飾符n 常類型的變量或者是對(duì)象成員的值在程序運(yùn)行期間都是不常類型的變量或者是對(duì)象成員的值在程序運(yùn)行期間都是不可以改變的。可以改變的。 常對(duì)象常對(duì)象n 定義格式:定義格式:類名類名 const const 對(duì)象名對(duì)象名(參數(shù)表參數(shù)表); 或或 const const 類名類名 對(duì)象名對(duì)象名(參數(shù)表參數(shù)表);n 常對(duì)象在定義時(shí)必須初始化,而且不能被更新常對(duì)象在定義時(shí)必須初始化,而且不能被更新是否有錯(cuò)?是否有錯(cuò)?#include class Apublic:int m;A( int i, int j) m=i;n=j
43、;void setvalue(int i) n=i;void disply() coutm=mendl; coutn=nendl; private:int n;void main() A a(10,20); a.setvalue(40); a.m=30; a.disply();const A a(10,20);注意:注意:不允許直接或間接更改常對(duì)不允許直接或間接更改常對(duì)象的數(shù)據(jù)成員;象的數(shù)據(jù)成員;不允許常對(duì)象調(diào)用普通的成不允許常對(duì)象調(diào)用普通的成員函數(shù)員函數(shù)如果在常對(duì)象中要修改某個(gè)數(shù)據(jù)成員,如果在常對(duì)象中要修改某個(gè)數(shù)據(jù)成員,C+C+提供了指定提供了指定可可變的數(shù)據(jù)成員變的數(shù)據(jù)成員方法。方法。格式
44、:格式: mutable mutable 類型類型 數(shù)據(jù)成員;數(shù)據(jù)成員;在定義數(shù)據(jù)成員時(shí)加在定義數(shù)據(jù)成員時(shí)加mutablemutable后,將數(shù)據(jù)成員聲明為可變后,將數(shù)據(jù)成員聲明為可變的數(shù)據(jù)成員,就可以用聲明為的數(shù)據(jù)成員,就可以用聲明為constconst的成員函數(shù)修改它的的成員函數(shù)修改它的值。值。 常對(duì)象常對(duì)象常對(duì)象成員常對(duì)象成員n類的數(shù)據(jù)成員可以是常量或常引用。常數(shù)據(jù)成員只能通過構(gòu)造函數(shù)類的數(shù)據(jù)成員可以是常量或常引用。常數(shù)據(jù)成員只能通過構(gòu)造函數(shù)初始化列表進(jìn)行初始化。初始化列表進(jìn)行初始化。1. #include 2. class Date 3. public:4.Date( int y, i
45、nt m, int d);5.void showDate();6. private:7. const int year, month, day;8. ;1. Date:Date (int y,int m,int d):year(y),month(m),day(d),r(year) 2. 3. void Date:showDate()4. coutyear.month.dayendl; 5. void main()6. Date date1(1998,4,28);7. date1.showDate();8. 注意:注意:year,month,day初始化后不允許被修改初始化后不允許被修改常成員函
46、數(shù)常成員函數(shù)類型類型 函數(shù)名(參數(shù)表)函數(shù)名(參數(shù)表)const; class Date public:Date(int y,int m,int d):year(y),month(m),day(d) void showDate(); void showDate()const; private: int year, month, day; ;void Date:showDate() coutShowDate1;endl; coutyear.month.dayendl; void Date:showDate()const coutShowDate2;endl; coutyear.month.day
47、endl; void main() Date date1(1998,4,28); date1.showDate(); const Date date2(2002,11,14); date2.showDate(); 注意:注意:1.1.在函數(shù)的實(shí)現(xiàn)部分也要帶上關(guān)鍵字在函數(shù)的實(shí)現(xiàn)部分也要帶上關(guān)鍵字constconst2.2.constconst可以用于函數(shù)重載可以用于函數(shù)重載3.3.常對(duì)象只能調(diào)用常成員函數(shù),不能調(diào)用普通的成員函數(shù)。常對(duì)象只能調(diào)用常成員函數(shù),不能調(diào)用普通的成員函數(shù)。4.4.常成員函數(shù)不能更新對(duì)象的數(shù)據(jù)成員,也不能調(diào)用該類中常成員函數(shù)不能更新對(duì)象的數(shù)據(jù)成員,也不能調(diào)用該類中的普通的成
48、員函數(shù)。的普通的成員函數(shù)。常指針常指針將指針變量聲明為將指針變量聲明為const型,指針值始終保持為其初值,不能改變。型,指針值始終保持為其初值,不能改變。 一般形式為一般形式為 類型類型 * * const const 指針變量名;指針變量名; int m=1,n=2; int * const ptr1=&m; /ptr1是常指針是常指針 ptr1=&n; /錯(cuò)誤,錯(cuò)誤,ptr1應(yīng)始終指向同一個(gè)變量應(yīng)始終指向同一個(gè)變量 *ptr1 = 100;/ptr1所指向的變量值可以改變所指向的變量值可以改變常見用途常見用途: :將常指針作為函數(shù)的形參,目的是不允許在函數(shù)執(zhí)行過將常指針作
49、為函數(shù)的形參,目的是不允許在函數(shù)執(zhí)行過程中改變指針變量的值,使其始終指向原來的對(duì)象。程中改變指針變量的值,使其始終指向原來的對(duì)象。 指針值不可變指針值不可變, , 指針指向的值是否可變,取決于指向的對(duì)象。指針指向的值是否可變,取決于指向的對(duì)象。指向常對(duì)象的指針指向常對(duì)象的指針常對(duì)象,只能用指向常對(duì)象的指針變量指向它常對(duì)象,只能用指向常對(duì)象的指針變量指向它; ; 指向常對(duì)象的指針變量,可以指向非指向常對(duì)象的指針變量,可以指向非constconst的對(duì)象,但不能通過指的對(duì)象,但不能通過指針來改變其指向的對(duì)象針來改變其指向的對(duì)象; ; 當(dāng)希望在調(diào)用函數(shù)時(shí)對(duì)象的值不被修改,就應(yīng)當(dāng)把形參定義為指當(dāng)希望在
50、調(diào)用函數(shù)時(shí)對(duì)象的值不被修改,就應(yīng)當(dāng)把形參定義為指向常對(duì)象的指針變量,同時(shí)用對(duì)象的地址作實(shí)參向常對(duì)象的指針變量,同時(shí)用對(duì)象的地址作實(shí)參( (對(duì)象可以是對(duì)象可以是constconst或非或非constconst型型) )。 指向常對(duì)象的指針變量指向常對(duì)象的指針變量 const Time const Time * *ptr; ptr; 指針變量的指向可變,指針指向的對(duì)象不可改變。指針變量的指向可變,指針指向的對(duì)象不可改變。對(duì)象的常引用對(duì)象的常引用 如果用引用形參又不想讓函數(shù)修改實(shí)參,可以使用常引用如果用引用形參又不想讓函數(shù)修改實(shí)參,可以使用常引用機(jī)制。機(jī)制。格式:格式: const const 類名
51、類名 & & 形參對(duì)象名形參對(duì)象名#include using namespace std;class Time public: Time(int,int,int); int hour; int minute; int sec; ; 例例3.8 對(duì)象的引用對(duì)象的引用 Time:Time(int h,int m,int s) hour=h; minute=m; sec=s; void fun(Time &t)t.hour=18;int main()Time t1(10,13,56); fun(t1); coutt1.hourendl; return 0;如果用引用形參又不
52、想讓如果用引用形參又不想讓函數(shù)修改實(shí)參,可以使用函數(shù)修改實(shí)參,可以使用常引用機(jī)制常引用機(jī)制對(duì)象的賦值和拷貝對(duì)象的賦值和拷貝1.變量賦值變量賦值 int a=2,b; b=a;2.對(duì)象賦值:同種類型的對(duì)象對(duì)象賦值:同種類型的對(duì)象 對(duì)象對(duì)象1=對(duì)象對(duì)象2; 對(duì)象對(duì)象1的成員的成員 對(duì)象對(duì)象2的成員的成員說明說明1.1.使用對(duì)象賦值語句時(shí),對(duì)象的類型必須相同。使用對(duì)象賦值語句時(shí),對(duì)象的類型必須相同。2.2.兩個(gè)對(duì)象之間的賦值,僅僅使得這些對(duì)象的數(shù)據(jù)成員的兩個(gè)對(duì)象之間的賦值,僅僅使得這些對(duì)象的數(shù)據(jù)成員的值是相同的。兩個(gè)對(duì)象自身還是分離的。值是相同的。兩個(gè)對(duì)象自身還是分離的。3.3.將一個(gè)對(duì)象的值賦值給
53、另外一個(gè)對(duì)象時(shí),大多數(shù)情況下將一個(gè)對(duì)象的值賦值給另外一個(gè)對(duì)象時(shí),大多數(shù)情況下都是成功的。但是當(dāng)類中存在指針時(shí),可能會(huì)產(chǎn)生錯(cuò)誤都是成功的。但是當(dāng)類中存在指針時(shí),可能會(huì)產(chǎn)生錯(cuò)誤例:例:testCopy.txtclass Date int year,month,day;public:Date(int y=2001,int m=1,int d=1):year(y),month(m),day(d)void showDate();inline void Date:showDate()coutyear,month,day靜態(tài)成員函數(shù)名靜態(tài)成員函數(shù)名(實(shí)參表實(shí)參表)練習(xí):修改練習(xí):修改student類,增加類
54、,增加sum數(shù)據(jù)成員記錄學(xué)生成績(jī)和數(shù)據(jù)成員記錄學(xué)生成績(jī)和 增加增加total和和average函數(shù)分別完成成績(jī)求和及平均值函數(shù)分別完成成績(jī)求和及平均值說明說明n 一般情況下,靜態(tài)成員函數(shù)主要用來訪問一般情況下,靜態(tài)成員函數(shù)主要用來訪問全局變量全局變量或同類或同類中的中的靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員。達(dá)到對(duì)象間數(shù)據(jù)共享。達(dá)到對(duì)象間數(shù)據(jù)共享。n 因靜態(tài)成員函數(shù)不含因靜態(tài)成員函數(shù)不含thisthis指針,所以,靜態(tài)成員函數(shù)不訪指針,所以,靜態(tài)成員函數(shù)不訪問類中的非靜態(tài)成員。若要訪問非靜態(tài)對(duì)象必須通過對(duì)象問類中的非靜態(tài)成員。若要訪問非靜態(tài)對(duì)象必須通過對(duì)象( (或?qū)ο笾羔樆驅(qū)ο笾羔? )來訪問來訪問靜態(tài)成員
55、訪問非靜態(tài)數(shù)據(jù)成員靜態(tài)成員訪問非靜態(tài)數(shù)據(jù)成員1.#include 2.class small_cat3.public:4.small_cat(double w);5.static void display(small_cat &w);6.static void total_display();7.private:8.double weight;9.static double total_weight;10.static double total_number;11.;small_cat :small_cat(double w) weight=w; total_weight+=w; to
56、tal_number+;void small_cat : display(small_cat &w) cout小貓的重量是小貓的重量是w.weightendl;void small_cat : total_display() couttotal_number小貓的重量是小貓的重量是;couttotal_weight kg endl;1.double small_cat:total_number=0;2.double small_cat:total_weight=0;3.int main()4.5.small_cat w1(0.9),w2(0.8),w3(0.7);6.small_cat
57、:display(w1);7.small_cat:display(w2);8.small_cat:display(w3);9.small_cat:total_display();10.return 0;11.友元友元class Pointprivate: double x,y;public: Point( int m=0, int n=0):x(m),y(n) void showXY();void Point:showXY() coutx,yy)?x:y; int min() return (xy)?x:y; float min() return (xy)?x:y;定義類模板的格式:定義類模板的格式:template class template class class 類模板名類模板名 類型參數(shù)名:按標(biāo)識(shí)符取名。如有多個(gè)類型參數(shù),每個(gè)類型類型參數(shù)名:按標(biāo)識(shí)符取名。如有多個(gè)類型參數(shù),每個(gè)類型參數(shù)都要以參數(shù)都要以classclass為前導(dǎo),兩個(gè)類型參數(shù)之間用逗號(hào)分隔。為前導(dǎo),兩個(gè)類型參數(shù)之間用逗號(hào)分隔。類模板名:按標(biāo)識(shí)符取
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 髖關(guān)節(jié)置換術(shù)后護(hù)理要點(diǎn)
- 協(xié)會(huì)和社區(qū)共建協(xié)議書
- 長(zhǎng)期員工勞務(wù)協(xié)議書
- 冰淇淋門店托管協(xié)議書
- 保安試用期合同協(xié)議書
- 鄰里解決糾紛協(xié)議書
- 雇員簽定免責(zé)協(xié)議書
- 資質(zhì)服務(wù)托管協(xié)議書
- 銷售代理軟件協(xié)議書
- 兩個(gè)幼兒園合并協(xié)議書
- 2025屆福建省漳州市高三第三次教學(xué)質(zhì)量檢測(cè)生物試卷(解析版)
- 2025年茶葉加工工職業(yè)技能競(jìng)賽參考試題庫500題(含答案)
- 2025甘肅陜煤集團(tuán)韓城煤礦招聘250人筆試參考題庫附帶答案詳解
- 2025-2030年中國溫泉特色酒店行業(yè)市場(chǎng)深度調(diào)研及發(fā)展趨勢(shì)與投資前景預(yù)測(cè)研究報(bào)告
- 《設(shè)計(jì)課件:構(gòu)建高效數(shù)據(jù)集教程》
- 2025江蘇中考:歷史高頻考點(diǎn)
- 家政合伙合同協(xié)議書
- 醫(yī)療器械網(wǎng)絡(luò)銷售質(zhì)量管理規(guī)范宣貫培訓(xùn)課件2025年
- SL631水利水電工程單元工程施工質(zhì)量驗(yàn)收標(biāo)準(zhǔn)第1部分:土石方工程
- DL∕T 5370-2017 水電水利工程施工通 用安全技術(shù)規(guī)程
- 廣東省2024年中考數(shù)學(xué)試卷【附真題答案】
評(píng)論
0/150
提交評(píng)論