




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、主要內容主要內容n 構造函數構造函數, ,重載構造函數;重載構造函數;析構析構函數函數n 對象數組和對象指針對象數組和對象指針n 公用數據的保護:靜態成員公用數據的保護:靜態成員n 對象的賦值和復制:對象的賦值和復制:拷貝構造函數拷貝構造函數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; 構造函數構造函數 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; 構造函數構造函數利用構造函數創建對象利用構造函數創建對象其一般形式為其一般形式為: : 類名類名 對象名對象名(實參表實參表);); Date date1(2008,8,8);void main() Date date1(2008,8,8); coutDate1 output1:en
4、dl; date1.showDate(); 構造函數的特點構造函數的特點n 類的一個成員函數;類的一個成員函數;n 未聲明返回值類型;未聲明返回值類型;n 名字與類名相同;名字與類名相同;n 未顯式地調用。未顯式地調用。n 公有函數公有函數注意:一個類中可以定義多個參數注意:一個類中可以定義多個參數個數或參數類型不個數或參數類型不同同的構造函數。的構造函數。練習:練習:n仿照上例,編寫仿照上例,編寫coordcoord類的構造函數類的構造函數構造函數的構造函數的作用作用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; ;構造函數的重載構造函數的重載一個類中可以定義
7、多個參數一個類中可以定義多個參數個數或參數類型不同個數或參數類型不同的構造函數。的構造函數。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(); 構造函數的重載構造函數的重載說明:說明:n 構造函數允許被重載構造函數允許被重載n 對象定義時,只能有一個構造函數起作用對象定義
8、時,只能有一個構造函數起作用n 使用無參構造函數創建對象時不用加()使用無參構造函數創建對象時不用加()n 重載構造函數時應避免二義性重載構造函數時應避免二義性構造函數的重載構造函數的重載練習:練習:n仿照上例,編寫仿照上例,編寫coordcoord類的構造函數類的構造函數n Date:Date() n 沒有顯式定義構造函數時,系統默認提供的(另沒有顯式定義構造函數時,系統默認提供的(另有一種說法是某些情況下才提供默認構造函數)有一種說法是某些情況下才提供默認構造函數)n 默認構造函數不進行變量初始化默認構造函數不進行變量初始化n 定義對象時,不需要定義對象時,不需要()()n 一旦定義了構造
9、函數,就不再提供默認構造函數一旦定義了構造函數,就不再提供默認構造函數默認構造函數默認構造函數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; ;默認構造函數默認構造函數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; 默認構造函數默認構造函數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; ;帶缺省參數的構造函數帶缺省參數的構造函數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; 帶缺省參數的構造函數帶缺省參數的構造函數說明說明n 構造函數在類外定義,則構造函數在類外定義,則默認參數應該在類的聲明構造函默認參數應該在類的聲明構造函數原型時指數原型時指定,而不能在類外定義時指定定,而不能在類外定義時指定n 部分給默認參數,取默認值的參數必須在參數右邊。部分給默認參數,取默認值的參數必須在參數右邊。 Date(int y=2012,int m,int ); Date d(6,6);n 調用時,若一個參數省略,則其后參數必須全省略調用時,若一個參數省略,則其后參數必須全省略 Dat
14、e(int y,int m=1,int n=1); Date d(2012, ,6)n 一個類中定義了全部是默認參數的構造函數后,不能再定一個類中定義了全部是默認參數的構造函數后,不能再定義重載構造函數。(二義性)義重載構造函數。(二義性) Date (); Date (int y=0,int m=0,int d=0)練習:練習:n用帶默認參數的形式,編寫用帶默認參數的形式,編寫CoordCoord類的構造函數類的構造函數成員初始化表成員初始化表 帶有成員初始化表的構造函數的一般形式如下帶有成員初始化表的構造函數的一般形式如下: : 類名類名:構造函數名構造函數名(參數表參數表):(:(成員初
15、始化表成員初始化表) / / 構造函數體構造函數體 成員初始化表成員初始化表的一般形式為的一般形式為: : 數據成員名數據成員名1(1(初始值初始值1),1),數據成員名數據成員名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)相當于相當于rx=x ,6. / pi(3.14)相當于相當于pi=3.147.void print()8. coutx=x rx=rx pi=pi; 9. private:10.int x,rx; const float pi;11. ;成員初始化表成員初始化表 注意注意1.若要將數據成員存放在堆或數組中,若要將
17、數據成員存放在堆或數組中,則應在構造函數中則應在構造函數中進行賦值,不能使用成員初始化表。進行賦值,不能使用成員初始化表。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.類成員按它們在類里被聲明的順序進行初始化,與其在類成員按它們在類里被聲明的順序進行初始化,與其在成員初始化表中列出的順序無關。成員初始化表中列出的順序無關。#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 設計設計BoxBox類,計算盒子體積。類,計算盒子體積。n 用以下三種方式初始化用以下三種方式初始化Bo
19、xBox類:類:帶參構造函數,接收參數分別給長寬高賦值帶參構造函數,接收參數分別給長寬高賦值默認構造函數,使得長寬高初始化為(默認構造函數,使得長寬高初始化為(10,10,1010,10,10)帶默認參數的構造函數,使不提供參數時長寬高初始化為(帶默認參數的構造函數,使不提供參數時長寬高初始化為(1,1,11,1,1)成員初始化表完成長寬高的初始化成員初始化表完成長寬高的初始化n 寫出寫出SalarySalary類的構造函數類的構造函數1.通常,在構造函數中只做簡單初始化,不寫復雜程序通常,在構造函數中只做簡單初始化,不寫復雜程序2.構造函數中用構造函數中用new分配的存儲空間,怎么收回?分配
20、的存儲空間,怎么收回?析構函數析構函數n 析構函數的功能:析構函數的功能: 撤消對象時的清理撤消對象時的清理, ,如釋放分配給對象的內存空間等。如釋放分配給對象的內存空間等。n 析構函數的特點析構函數的特點: :(1)(1)析構函數與構造函數名字相同析構函數與構造函數名字相同, ,但它前面必須加一但它前面必須加一個波浪號個波浪號();();(2)(2)析構函數沒有參數析構函數沒有參數, ,也沒有返回值也沒有返回值, ,而且不能重載。而且不能重載。因此在一個類中只能有一個析構函數因此在一個類中只能有一個析構函數; ;(3)(3)當撤消對象時當撤消對象時, ,編譯系統會自動地調用析構函數。編譯系統
21、會自動地調用析構函數。 #include class Date public: Date(int y,int m,int d); / 構造函數構造函數 Date(); / 析構函數析構函數 void showDate(); private: int year, month, day;Date:Date(int y,int m,int d) / 構造函數的實現構造函數的實現 cout“創建創建endl; year=y; month=m; day=d; 析構函數析構函數Date:Date() / 析構函數的實現析構函數的實現 cout“銷毀銷毀endl;void Date:showDate() c
22、outyear.month.dayendl; void main() Date date1(1998,4,28); coutDate1 output1:endl; date1.showDate(); 析構函數析構函數n 若一個對象在完成其操作之前需要做一些內部處理(如釋若一個對象在完成其操作之前需要做一些內部處理(如釋放由放由new動態分配的空間),則需要顯示定義析構函數。動態分配的空間),則需要顯示定義析構函數。class strchar *s;int max_len;public:str(char*) s=new charmax_len; str() delete s; ;析構函數析構函數
23、模擬上例完成模擬上例完成Salary類的析構函數類的析構函數 一個對象生命期結束時一個對象生命期結束時,該對象的析構函數被,該對象的析構函數被自動調用。如,函數內自動調用。如,函數內的局部對象的局部對象 析構函數的調用時機析構函數的調用時機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; 全局對象(在函數外定全局對象(在函數外定義的對象)當義的對象)當main函數函數結束或執行結束或執行exit命令時
24、命令時自動執行析構函數釋放自動執行析構函數釋放對象。對象。析構函數的調用時機析構函數的調用時機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;析構函數調用順序析構函數調用順序對象對象1 的構的構造函數造函數對象對象2 的構的構造函數造函數對象對象3 的構的構造函數造函數對象對象1 的析的析構函數構函數對象對象2 的析的析構函數構函數對象對象3 的析的析構函數構函數n 當有多個對象時,先構造的后析構當有多
25、個對象時,先構造的后析構析構函數調用順序析構函數調用順序#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);靜態局部對象靜態局部對
26、象,則在第一次調用該函數建立對象時調用構造函,則在第一次調用該函數建立對象時調用構造函數,但要在主函數結束才調用析構函數。數,但要在主函數結束才調用析構函數。void fn()student st1; / 定義局部自動對象定義局部自動對象 static student st2; / 定義靜態局部對象定義靜態局部對象 析構函數調用順序析構函數調用順序對象數組對象數組所謂對象數組是指每一數組元素都是對象的數組所謂對象數組是指每一數組元素都是對象的數組, ,。定義一個一維對象數組的格式如下定義一個一維對象數組的格式如下: : 類名類名 數組名數組名 下標表達式下標表達式; 例如:例如: Studen
27、t s10;Student s10;對象數組中每個元素就是一個對象,通過對象可以訪問類的對象數組中每個元素就是一個對象,通過對象可以訪問類的公有成員。公有成員。 數組名數組名 下標下標.成員名成員名在建立數組時,同樣要調用構造函數。上面的數組有在建立數組時,同樣要調用構造函數。上面的數組有5050個元個元素,要調用素,要調用5050次構造函數。如果構造函數有多個參數,次構造函數。如果構造函數有多個參數,C+ C+ 要求:在等號后的花括號中為每個對象分別寫出構造函數并要求:在等號后的花括號中為每個對象分別寫出構造函數并指定實參。格式為:指定實參。格式為:student student ststn
28、=student ( n=student ( 實參實參1,1,實參實參2,2,實參實參3 )3 ), student ( student ( 實參實參1,1,實參實參2,2,實參實參3 )3 ) ; ; 對象數組對象數組析構函數調用順序析構函數調用順序#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析構函數被調用析構函數被調用ageendl; int get_age() return age; private: int age;對象數組對象數組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; 指向對象成員的指針指向對象成員的指針 對象由成員組成。對象占據的內存區是各個數據成員占據對象由成員組成。對象占據的內存區是各個數
32、據成員占據的內存區的總和。對象成員也有地址,即指針。這的內存區的總和。對象成員也有地址,即指針。這指針分指針分指向數據成員的指針和指向成員函數的指針指向數據成員的指針和指向成員函數的指針。1. 1. 指向對象公有數據成員的指針指向對象公有數據成員的指針 定義數據成員的指針變量定義數據成員的指針變量 數據類型數據類型 * * 指針變量名指針變量名計算公有數據成員的地址計算公有數據成員的地址 & &對象名對象名. .成員名成員名這里的數據類型是數據成員的數據類型。這里的數據類型是數據成員的數據類型。例:例: Time t1;Time t1; int int * * p1; p1;
33、/ / 定義一個指向整型數據的指針變量定義一個指向整型數據的指針變量 p1 = & t1.hour; p1 = & t1.hour; / / 假定假定hourhour是公有成員是公有成員 cout cout * *p1 endl;p1 endl;2. 2. 指向對象成員函數的指針指向對象成員函數的指針 定義指向成員函數的指針變量定義指向成員函數的指針變量 數據類型數據類型 ( 類名類名:* 變量名變量名 )( 形參表形參表 ); 數據類型數據類型是成員函數的類型。類名是類名是對象所屬的類變量名變量名按標識符取名形參表形參表:指定成員函數的形參表(形參個數、類型)取成員函數的地址
34、取成員函數的地址 & &類名類名:成員函數名給指針變量賦初值給指針變量賦初值 指針變量名指針變量名= & = & 類名類名:成員函數名成員函數名 ; ;用指針變量調用成員函數用指針變量調用成員函數 ( (對象名對象名. .* *指針變量名指針變量名)()(實參表實參表););對象名:是指定調用成員函數的對象。對象名:是指定調用成員函數的對象。* *:明確其后的是一個指針變量。:明確其后的是一個指針變量。實參表:與成員函數的形參表對應實參表:與成員函數的形參表對應#include using namespace std; class Time public: Ti
35、me(int,int,int); int hour; int minute; int sec; void get_time(); ;例例3.7 有關對象指針的使用方法有關對象指針的使用方法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(); / 用對象指
36、針調用成員函數用對象指針調用成員函數 void (Time:*p3)(); / 定義指向成員函數的指針定義指向成員函數的指針 p3=&Time:get_time; / 給成員函數的指針賦值給成員函數的指針賦值 (t1.*p3)(); / 用指向成員函數的指針調用成員函數用指向成員函數的指針調用成員函數 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;程序如何知道該輸出哪個值?程序如何知道該輸出哪個值?n this,其值是當前被調用的成員函數所在的對象的起始地其值是當前被調用的成員函數所在的對象的起始地址址this,指向當前對象的指針,指向當前對象的指針n 創建對象時創建對象時this指針指向該對象;指針指向該對象;n this指針是作為隱含的參數在指針是作為隱含的參數在調用對象的函數時調用對象的函數時傳遞給該傳遞給該函數。函數。n 可以用它來確定函數訪問
38、的是哪一個對象的數據成員可以用它來確定函數訪問的是哪一個對象的數據成員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應注意的問題應注意的問題n this的作用域僅在一個對象內部。的作用域僅在一個對象內部。例如,在類外的語句:例如,在類外的語句: A a; a.this; 錯誤錯誤n 在對象內部,在對象內部,thi
39、s指針是一個指針是一個const指針。指針。 例如:例如: this=&p; ; 錯誤錯誤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.;用對象指針訪問對象數組用對象指針訪問對象數組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();說明說明函數結束了,函數結束了,dlg還在。這個非還在。這個非模式對話框還在模式對話框還在1.1.newnew創建類對象需要指針接收,一處初始化,多處使用創建類對象需要指針接收,一處初始化,多處使用 2.2.newnew創建類對象使用完需創建類對象使用完需deletedelete銷毀銷毀 3.3.newnew創建對象直接使用堆空間,而不用創建對象直接使用堆空間,而不用newnew定義類對象則使
41、定義類對象則使用棧空間用棧空間 4.4.newnew對象指針用途廣泛,比如作為函數返回值、函數參數等對象指針用途廣泛,比如作為函數返回值、函數參數等 說明說明共用數據的保護共用數據的保護 如果即希望數據在一定范圍內共享,又不愿它被隨意修改,如果即希望數據在一定范圍內共享,又不愿它被隨意修改,從技術上可以把數據指定為只讀型的。從技術上可以把數據指定為只讀型的。C+C+提供提供constconst手段,手段,將數據、對象、成員函數指定為常量,從而實現了只讀要將數據、對象、成員函數指定為常量,從而實現了只讀要求,達到保護數據的目的。求,達到保護數據的目的。常類型常類型n 目的:為了保證數據共享又防止
42、數據被改動。目的:為了保證數據共享又防止數據被改動。n const 類型修飾符類型修飾符n 常類型的變量或者是對象成員的值在程序運行期間都是不常類型的變量或者是對象成員的值在程序運行期間都是不可以改變的。可以改變的。 常對象常對象n 定義格式:定義格式:類名類名 const const 對象名對象名(參數表參數表); 或或 const const 類名類名 對象名對象名(參數表參數表);n 常對象在定義時必須初始化,而且不能被更新常對象在定義時必須初始化,而且不能被更新是否有錯?是否有錯?#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);注意:注意:不允許直接或間接更改常對不允許直接或間接更改常對象的數據成員;象的數據成員;不允許常對象調用普通的成不允許常對象調用普通的成員函數員函數如果在常對象中要修改某個數據成員,如果在常對象中要修改某個數據成員,C+C+提供了指定提供了指定可可變的數據成員變的數據成員方法。方法。格式
44、:格式: mutable mutable 類型類型 數據成員;數據成員;在定義數據成員時加在定義數據成員時加mutablemutable后,將數據成員聲明為可變后,將數據成員聲明為可變的數據成員,就可以用聲明為的數據成員,就可以用聲明為constconst的成員函數修改它的的成員函數修改它的值。值。 常對象常對象常對象成員常對象成員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、數常成員函數類型類型 函數名(參數表)函數名(參數表)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.在函數的實現部分也要帶上關鍵字在函數的實現部分也要帶上關鍵字constconst2.2.constconst可以用于函數重載可以用于函數重載3.3.常對象只能調用常成員函數,不能調用普通的成員函數。常對象只能調用常成員函數,不能調用普通的成員函數。4.4.常成員函數不能更新對象的數據成員,也不能調用該類中常成員函數不能更新對象的數據成員,也不能調用該類中的普通的成
48、員函數。的普通的成員函數。常指針常指針將指針變量聲明為將指針變量聲明為const型,指針值始終保持為其初值,不能改變。型,指針值始終保持為其初值,不能改變。 一般形式為一般形式為 類型類型 * * const const 指針變量名;指針變量名; int m=1,n=2; int * const ptr1=&m; /ptr1是常指針是常指針 ptr1=&n; /錯誤,錯誤,ptr1應始終指向同一個變量應始終指向同一個變量 *ptr1 = 100;/ptr1所指向的變量值可以改變所指向的變量值可以改變常見用途常見用途: :將常指針作為函數的形參,目的是不允許在函數執行過將常指針作
49、為函數的形參,目的是不允許在函數執行過程中改變指針變量的值,使其始終指向原來的對象。程中改變指針變量的值,使其始終指向原來的對象。 指針值不可變指針值不可變, , 指針指向的值是否可變,取決于指向的對象。指針指向的值是否可變,取決于指向的對象。指向常對象的指針指向常對象的指針常對象,只能用指向常對象的指針變量指向它常對象,只能用指向常對象的指針變量指向它; ; 指向常對象的指針變量,可以指向非指向常對象的指針變量,可以指向非constconst的對象,但不能通過指的對象,但不能通過指針來改變其指向的對象針來改變其指向的對象; ; 當希望在調用函數時對象的值不被修改,就應當把形參定義為指當希望在
50、調用函數時對象的值不被修改,就應當把形參定義為指向常對象的指針變量,同時用對象的地址作實參向常對象的指針變量,同時用對象的地址作實參( (對象可以是對象可以是constconst或非或非constconst型型) )。 指向常對象的指針變量指向常對象的指針變量 const Time const Time * *ptr; ptr; 指針變量的指向可變,指針指向的對象不可改變。指針變量的指向可變,指針指向的對象不可改變。對象的常引用對象的常引用 如果用引用形參又不想讓函數修改實參,可以使用常引用如果用引用形參又不想讓函數修改實參,可以使用常引用機制。機制。格式:格式: const const 類名
51、類名 & & 形參對象名形參對象名#include using namespace std;class Time public: Time(int,int,int); int hour; int minute; int sec; ; 例例3.8 對象的引用對象的引用 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、想讓如果用引用形參又不想讓函數修改實參,可以使用函數修改實參,可以使用常引用機制常引用機制對象的賦值和拷貝對象的賦值和拷貝1.變量賦值變量賦值 int a=2,b; b=a;2.對象賦值:同種類型的對象對象賦值:同種類型的對象 對象對象1=對象對象2; 對象對象1的成員的成員 對象對象2的成員的成員說明說明1.1.使用對象賦值語句時,對象的類型必須相同。使用對象賦值語句時,對象的類型必須相同。2.2.兩個對象之間的賦值,僅僅使得這些對象的數據成員的兩個對象之間的賦值,僅僅使得這些對象的數據成員的值是相同的。兩個對象自身還是分離的。值是相同的。兩個對象自身還是分離的。3.3.將一個對象的值賦值給
53、另外一個對象時,大多數情況下將一個對象的值賦值給另外一個對象時,大多數情況下都是成功的。但是當類中存在指針時,可能會產生錯誤都是成功的。但是當類中存在指針時,可能會產生錯誤例:例: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靜態成員函數名靜態成員函數名(實參表實參表)練習:修改練習:修改student類,增加類
54、,增加sum數據成員記錄學生成績和數據成員記錄學生成績和 增加增加total和和average函數分別完成成績求和及平均值函數分別完成成績求和及平均值說明說明n 一般情況下,靜態成員函數主要用來訪問一般情況下,靜態成員函數主要用來訪問全局變量全局變量或同類或同類中的中的靜態數據成員靜態數據成員。達到對象間數據共享。達到對象間數據共享。n 因靜態成員函數不含因靜態成員函數不含thisthis指針,所以,靜態成員函數不訪指針,所以,靜態成員函數不訪問類中的非靜態成員。若要訪問非靜態對象必須通過對象問類中的非靜態成員。若要訪問非靜態對象必須通過對象( (或對象指針或對象指針) )來訪問來訪問靜態成員
55、訪問非靜態數據成員靜態成員訪問非靜態數據成員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 類模板名類模板名 類型參數名:按標識符取名。如有多個類型參數,每個類型類型參數名:按標識符取名。如有多個類型參數,每個類型參數都要以參數都要以classclass為前導,兩個類型參數之間用逗號分隔。為前導,兩個類型參數之間用逗號分隔。類模板名:按標識符取
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 寵物攝影器材應用-洞察闡釋
- 智能化泵閥控制系統-洞察闡釋
- 電商對農民心理適應影響-洞察闡釋
- 東西方心理特質對比研究-洞察闡釋
- 文旅資源可持續發展與生態保護-洞察闡釋
- 綠色NFV架構及其可持續發展研究-洞察闡釋
- 聯邦學習中的隱私保護與模型優化-洞察闡釋
- 災害背景下的心理干預技術創新-洞察闡釋
- 網絡音頻中聽覺注意力捕捉-洞察闡釋
- 藝術生成算法優化-洞察闡釋
- 煙花爆竹勞務合同范本
- 濟南出入境檢驗檢疫局國際旅行衛生保健中心
- (全冊完整16份)北師大版五年級下冊100道口算題大全
- 維修電工求職簡歷
- 人教版歷史八年級上冊知識點
- 麻醉藥品和精神藥品培訓試題
- GB/T 799-2020地腳螺栓
- 非小細胞肺癌寡轉移灶中立體定向放療的運用,放射醫學論文
- 遠足拉練動員大會課件
- 出租房屋安全檢查記錄
- 夏季養胃知識課件
評論
0/150
提交評論