c--中構(gòu)造函數(shù)和析構(gòu)函數(shù)講解課件_第1頁(yè)
c--中構(gòu)造函數(shù)和析構(gòu)函數(shù)講解課件_第2頁(yè)
c--中構(gòu)造函數(shù)和析構(gòu)函數(shù)講解課件_第3頁(yè)
c--中構(gòu)造函數(shù)和析構(gòu)函數(shù)講解課件_第4頁(yè)
c--中構(gòu)造函數(shù)和析構(gòu)函數(shù)講解課件_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Visual C+程序設(shè)計(jì)第10章 構(gòu)造函數(shù) 和析構(gòu)函數(shù)10.1 構(gòu)造函數(shù)10.2 析構(gòu)函數(shù)10.3 實(shí)現(xiàn)類型轉(zhuǎn)換和 拷貝的構(gòu)造函數(shù)10.4 構(gòu)造函數(shù)和對(duì)象成員第10章 構(gòu)造函數(shù)和析構(gòu)函數(shù)給對(duì)象的數(shù)據(jù)成員賦值有二類(四種)方法:1. 定義時(shí)賦值(初始化)(1)用數(shù)據(jù)列表初始化(數(shù)據(jù)成員為公有訪問權(quán)限);(2)用構(gòu)造函數(shù)初始化。2. 定義后賦值(1)用成員函數(shù)賦值-回顧第9章示例3; (2)用同類型的對(duì)象賦值。如:class A public: int a,b;void set(int x,int y)a=x;b=y; ; void main() A a1=5,10,a2,a3; a2.set(

2、15,20); a3=a1;10.1 構(gòu)造函數(shù)10.1.1 構(gòu)造函數(shù)的概念1. 構(gòu)造函數(shù)是實(shí)現(xiàn)數(shù)據(jù)成員初始化的特殊的成員函數(shù); 2. 構(gòu)造函數(shù)與類同名,沒有類型,也不返回值;3. 創(chuàng)建對(duì)象時(shí),構(gòu)造函數(shù)被自動(dòng)調(diào)用。每創(chuàng)建一個(gè)對(duì)象都必須調(diào)用一次構(gòu)造函數(shù),每調(diào)用一次構(gòu)造函數(shù)必定創(chuàng)建一個(gè)對(duì)象。10.1.2 構(gòu)造函數(shù)的種類1. 普通構(gòu)造函數(shù):普通參數(shù);2. 拷貝構(gòu)造函數(shù):參數(shù)為對(duì)象的引用。 一個(gè)類至少有上述兩個(gè)構(gòu)造函數(shù),可以有更多的構(gòu)造函數(shù)(構(gòu)造函數(shù)允許重載),以實(shí)現(xiàn)不同形式對(duì)象的創(chuàng)建。 10.1 構(gòu)造函數(shù)10.1.3 構(gòu)造函數(shù)的定義1. 類中定義格式 類名(形參列表) . /函數(shù)體,對(duì)數(shù)據(jù)成員賦值2.

3、 類中說明,類外定義(1) 類中說明 類名(形參列表);(2)類外定義 類名:類名(形參列表) . /函數(shù)體10.1 構(gòu)造函數(shù)例10-1 定義表示平面點(diǎn)的類Point及其構(gòu)造函數(shù)。 class Pointfloat x,y;public:Point(float a,float b);Point(float a) x=y=a;void print() cout(x,y“)n”; ; Point: Point(float a,float b) x=a; y=b; 10.1 構(gòu)造函數(shù)10.1.4 構(gòu)造函數(shù)產(chǎn)生對(duì)象建立對(duì)象時(shí),必須提供與構(gòu)造函數(shù)形參一致的實(shí)參,其基本格式只有如下兩種形式:類名 對(duì)象名(

4、實(shí)參); 類名 對(duì)象名;例10-2 用例10-1定義的類定義對(duì)象,并初始化。class Point float x,y;public: Point(float a,float b); Point(float a) x=y=a; void print() cout(x,y“)n”; ;Point: Point(float a,float b) x=a; y=b; void main() Point p1(5),p2(10,15); p1.print();p2.print(); 10.1 構(gòu)造函數(shù)主函數(shù)中,能否添加下列語句: Point p3;10.1.5 缺省的構(gòu)造函數(shù)1. 缺省構(gòu)造函數(shù)的種類(

5、1)系統(tǒng)自動(dòng)產(chǎn)生的構(gòu)造函數(shù),如下所示: 類名() (2)用戶定義的沒有參數(shù)的構(gòu)造函數(shù);(3)用戶定義的所有參數(shù)都有缺省值的構(gòu)造函數(shù)。2. 用缺省構(gòu)造函數(shù)創(chuàng)建對(duì)象的格式:類名 對(duì)象名;3. 使用時(shí)的注意(1)只有在用戶沒有定義構(gòu)造函數(shù)時(shí),系統(tǒng)才自動(dòng)產(chǎn)生構(gòu)造函數(shù);(2)類中可能沒有缺省的構(gòu)造函數(shù);(3)一個(gè)類最多只能有一個(gè)缺省的構(gòu)造函數(shù)。10.1 構(gòu)造函數(shù)例10-3 缺省構(gòu)造函數(shù)的使用。class Pointfloat x,y;public:Point( ) x=0; y=0; Point(float a ,float b ) x=a; y=b; /Avoid print() cout(x,y“)

6、n”; ;void main() Point p1 , p2(1,2);p1.print(); p2.print(); 10.1 構(gòu)造函數(shù)主函數(shù)能否增加:Point p3();p3.print();能否對(duì)A行作如下修改?=0 =010.1.6 構(gòu)造函數(shù)和new運(yùn)算符1. 用new運(yùn)行符產(chǎn)生動(dòng)態(tài)對(duì)象(1)產(chǎn)生單個(gè)對(duì)象(可以初始化);(2)產(chǎn)生數(shù)組對(duì)象(不能初始化)。如:class C float r,i;public: C (float r1 ,float i1) r=r1; i=i1; cout“構(gòu)造n”; C () r=i=0; cout“缺省構(gòu)造n”; ;void main() C *p1

7、=new C,*p2=new C (2,-3), *p3=new C5; 10.1 構(gòu)造函數(shù)2. 用new為指針成員分配動(dòng)態(tài)空間 當(dāng)類的數(shù)據(jù)成員為指針時(shí),在構(gòu)造函數(shù)中應(yīng): 先用new運(yùn)算符為指針動(dòng)態(tài)分配空間; 然后再對(duì)指針?biāo)缚臻g賦值。如: class Array int*p; .; /p表示10個(gè)元素的一維數(shù)組則如下的構(gòu)造函數(shù)都是錯(cuò)誤的:Array(int *t)p=t; Array (int *t)*p=*t;Array (int *t)for(int i=0;i10;i+)pi=ti;Array (int *t)p=new int10; p=t; / *p=*t;正確的應(yīng)為:Array

8、(int *t) p=new int10; / 分配動(dòng)態(tài)空間 for(int i=0;i10;i+)pi=ti; / 對(duì)動(dòng)態(tài)空間賦值 10.1 構(gòu)造函數(shù)1. 析構(gòu)函數(shù)的概念用于撤消對(duì)象的成員函數(shù)。2. 定義格式(1)類中定義 類名() . /函數(shù)體(2)類中說明,類外定義 類中說明 類名();/類中說明 類外定義 類名:類名()/類外定義 . /函數(shù)體10.2 析構(gòu)函數(shù)3. 使用時(shí)注意:(1)析構(gòu)函數(shù)的名稱由運(yùn)算符與類名組成;(2)析構(gòu)函數(shù)無函數(shù)類型,無參數(shù),且不返回值;(3)析構(gòu)函數(shù)不可以重載,每個(gè)類只有一個(gè)析構(gòu)函數(shù);(4)類中通常不需要定義析構(gòu)函數(shù),而由系統(tǒng)自動(dòng)產(chǎn)生一個(gè)如下的缺省析構(gòu)函數(shù):

9、 類名:類名() (5)當(dāng)類中用new 運(yùn)算符分配了動(dòng)態(tài)空間時(shí),必須定義析構(gòu)函數(shù),并在函數(shù)體中用delete運(yùn)算符釋放動(dòng)態(tài)空間。4. 構(gòu)造函數(shù)與析構(gòu)函數(shù)的調(diào)用過程在創(chuàng)建對(duì)象時(shí),調(diào)用構(gòu)造函數(shù);在撤消對(duì)象時(shí),調(diào)用析構(gòu)函數(shù);所以它們的調(diào)用過程(順序)通常是相反的。10.2 析構(gòu)函數(shù)10.3.1 實(shí)現(xiàn)類型轉(zhuǎn)換的構(gòu)造函數(shù) 當(dāng)一個(gè)對(duì)象被賦值為一個(gè)數(shù)字,如果這個(gè)數(shù)字可以放入某個(gè)構(gòu)造函數(shù)實(shí)現(xiàn)對(duì)這個(gè)構(gòu)造函數(shù)的調(diào)用時(shí),則該賦值語句成立。其實(shí)質(zhì)是以所給的數(shù)據(jù)為參數(shù)調(diào)用普通的構(gòu)造函數(shù)初始化對(duì)象,此時(shí)的構(gòu)造函數(shù)稱為類型轉(zhuǎn)換的構(gòu)造函數(shù)。例10-4 用類型轉(zhuǎn)換的構(gòu)造函數(shù)初始化對(duì)象。class Ex int x,y;publ

10、ic: Ex(int a, int b=10) x=a; y=b; cout“x=”x“,y=”y“n”; Ex() coutx“,釋放對(duì)象。n”;void main() Ex e1(5); Ex e2=15; e1=20; cout“End.n”;10.3 實(shí)現(xiàn)類型轉(zhuǎn)換和拷貝的構(gòu)造函數(shù)其中:Ex e2=15;等同于Ex e2(15);e1=20;等同于e1=Ex(20);x=5,y=10 x=15,y=10 x=20,y=1020,釋放對(duì)象。End.15,釋放對(duì)象。20,釋放對(duì)象。10.3.2 完成拷貝功能的構(gòu)造函數(shù) 拷貝功能的構(gòu)造函數(shù)實(shí)現(xiàn):用一個(gè)已建立的對(duì)象初始化同類型的對(duì)象,其調(diào)用格式為

11、:類名 新對(duì)象名(已建立對(duì)象名); 或類名 新對(duì)象名=已建立對(duì)象名; 例10-5 用拷貝構(gòu)造函數(shù)初始化對(duì)象。class Ex int x,y;public: Ex(int a,int b) x=a; y=b; cout“x=”x“,y=”y“,普通構(gòu)造。n”; Ex(Ex &t)/拷貝功能的構(gòu)造函數(shù) x=t.x; y=t.y; cout“x=”x“,y=”y“,拷貝構(gòu)造。n”; ;void main() Ex e1(5,10); Ex e2(e1); Ex e3=e2; 10.3 實(shí)現(xiàn)類型轉(zhuǎn)換和拷貝的構(gòu)造函數(shù)x=5,10, 普通構(gòu)造x=5,10, 拷貝構(gòu)造x=5,10, 拷貝構(gòu)造與普通構(gòu)造函數(shù)

12、相似,若用戶不定義拷貝功能構(gòu)造函數(shù),系統(tǒng)自動(dòng)產(chǎn)生一個(gè)缺省的拷貝功能構(gòu)造函數(shù),它把已建立對(duì)象各數(shù)據(jù)成員的值依次賦給新對(duì)象。其定義如下: 類名:類名(類名 &對(duì)象名) *this=對(duì)象名; 用戶通常可以直接使用缺省的拷貝功能構(gòu)造函數(shù),但在以下情況下必須重新定義:(1)新建對(duì)象與已建立對(duì)象的數(shù)據(jù)有差異;如:Ex2 e2(e1); (2)數(shù)據(jù)成員中有指針,并使用了動(dòng)態(tài)內(nèi)存。類的構(gòu)造函數(shù)有兩類、多種形式,使用時(shí)應(yīng)加以區(qū)分。10.3 實(shí)現(xiàn)類型轉(zhuǎn)換和拷貝的構(gòu)造函數(shù)例10-6 用普通構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù)創(chuàng)建對(duì)象。class A public:A(int x=1)coutx“t”;A(A&t)cout“拷貝t

13、”;void main()A a1,a2(2),a3=3;coutn;A a4=A(4),a5=a1,a6(a1); coutn;a1=5;a2=a1; a3=A(0); coutn;10.3 實(shí)現(xiàn)類型轉(zhuǎn)換和拷貝的構(gòu)造函數(shù)運(yùn)行結(jié)果: 1234 拷貝拷貝 拷貝50程序中共創(chuàng)建了幾個(gè)對(duì)象? 1. 對(duì)象成員的概念 類的數(shù)據(jù)成員為其他已定義類的對(duì)象,該成員稱為對(duì)象成員。 2. 初始化對(duì)象成員的方法 在構(gòu)造函數(shù)中以對(duì)象名調(diào)用對(duì)象所屬類的構(gòu)造函數(shù)完成,其基本格式為: 類名:類名(形參表):對(duì)象名(實(shí)參表) /初始化普通成員 3. 當(dāng)前對(duì)象在初始化(構(gòu)造函數(shù)調(diào)用)時(shí)的順序 (1)先完成對(duì)象成員的初始化,有多

14、個(gè)對(duì)象成員時(shí),先說明的先初始化; (2) 再完成普通成員的初始化。 即先調(diào)用對(duì)象成員所屬類的構(gòu)造函數(shù),再執(zhí)行自身類的函數(shù)體。 4. 對(duì)象的撤消(析構(gòu)函數(shù)調(diào)用)順序:與建立順序相反。10.4 構(gòu)造函數(shù)和對(duì)象成員例10-7 含對(duì)象成員類的構(gòu)造函數(shù)。class A int a;public: A(int x=0) a=x; cout“A()n”; A() couta“A()n”; ; class B int b;public: B(int x=0) b=x; cout“B()n”; B () coutb “B()n”; ; class C int c; B b1; A a1; B b2;public

15、: C(int x,int y,int z):a1(x),b1(y),b2(z) c=x+y+z; cout“C()n”; C() coutc “A()n”; ; void main() C c1(1,2,3); 10.4 構(gòu)造函數(shù)和對(duì)象成員對(duì)象說明順序決定構(gòu)造函數(shù)調(diào)用順序?qū)ο笳{(diào)用構(gòu)造函數(shù)語句決定對(duì)象成員的值一、選擇題1、以下有關(guān)析構(gòu)函數(shù)的敘述不正確的是 。A、析構(gòu)函數(shù)沒有任何函數(shù)類型B、析構(gòu)函數(shù)的作用是在撤銷對(duì)象時(shí)收回分配的內(nèi)存空間C、析構(gòu)函數(shù)可以有形參D、一個(gè)類只有一個(gè)析構(gòu)函數(shù)2、關(guān)于類的缺省構(gòu)造函數(shù),下列說法正確的是 。A、類的缺省構(gòu)造函數(shù)沒有參數(shù)B、類的缺省構(gòu)造函數(shù)是由系統(tǒng)自動(dòng)產(chǎn)生的空

16、函數(shù)C、每個(gè)類均可定義缺省的構(gòu)造函數(shù)D、每個(gè)類均有且有一個(gè)缺省的構(gòu)造函數(shù)3、通??截惓跏蓟瘶?gòu)造函數(shù)的參數(shù)是 。A、某個(gè)對(duì)象的名稱 B、某個(gè)對(duì)象的成員名C、指向某個(gè)對(duì)象的指針名 D、某個(gè)對(duì)象的引用名課堂練習(xí)4、設(shè)有如下類的定義:class Ex int *p;public:Ex()delete p;Ex(int x=0)p=new int(x);則下列對(duì)象的定義中,不正確的是 。A、Ex ex; B、Ex ex1(50),ex2=ex1;C、Ex ex=Ex(50); DEx ex=50;5、下列關(guān)于構(gòu)造函數(shù)說法不正確的是 。A、構(gòu)造函數(shù)必須與類同名B、構(gòu)造函數(shù)可以省略不寫C、構(gòu)造函數(shù)必須有返回

17、值D、在構(gòu)造函數(shù)中可以對(duì)類中的成員進(jìn)行初始化6、已定義類A,該類構(gòu)造函數(shù)的參數(shù)都沒有缺省值,執(zhí)行語句:A a1(2),a2(1,2),*p=new A3;則自動(dòng)調(diào)用該類的缺省構(gòu)造函數(shù)的次數(shù)為 。A、1 B、3 C、2 D、5課堂練習(xí)7、下列程序中出現(xiàn)編譯錯(cuò)誤的是 。#include class Aint a,b;public:A(int x,int y) a=x;b=y;void print() coutatbprint(); /DA、A行 B、B行 C、C行 D、D行課堂練習(xí)8、下列程序中不出現(xiàn)編譯錯(cuò)誤的是 。class Aint a,b;A()a=10;b=20;public:A(int

18、x) a=b=x;void main()A a1; / AA a2(1); / BA a3=1,2; / CA a4(1,2); / DA、A行 B、B行 C、C行 D、D行課堂練習(xí)9、下面程序的運(yùn)行結(jié)果為 。 #includeclass Aint num;public:A(int i) num=i;A(A &a) num=a.num+;void print() coutnum;void main()A a(10),b(a);a.print(); b.print();coutendl;A、1010 B、1011 C、1111 D、1110課堂練習(xí)二、填空題1、執(zhí)行下列語句時(shí),系統(tǒng)自動(dòng)調(diào)用了構(gòu)造

19、函數(shù) 次:Myclass p13,*p23,p3,*p4=p1,*p5=new Myclass; 2、當(dāng)類A的成員是類B的對(duì)象時(shí),則把類B中的類A的對(duì)象稱為 成員。 3、對(duì)象成員的初始化是通過 調(diào)用 完成的。 4、缺省的一般構(gòu)造函數(shù),除了系統(tǒng)自動(dòng)生產(chǎn)的外,還有用戶定義的的構(gòu)造函數(shù)或 的構(gòu)造函數(shù)三種形式,但一個(gè)類中最多有 個(gè)缺省的一般構(gòu)造函數(shù)。 5、以同類型的已有對(duì)象初始化新建對(duì)象時(shí),調(diào)用的構(gòu)造函數(shù)是 ,使用時(shí)有兩種具體形式:(1);(2)。課堂練習(xí)6、下面程序段的執(zhí)行結(jié)果是 。#include class Point int x,y; public:Point()x=y=0;Point(int

20、 a,int b)x=a;y=b;Point(Point &P);void show() coutx=x,y=yn; ;Point:Point(Point &P) x=P.x+10;y=P.y+10; void main()Point p1,p2(3,5),p3=p2;p1.show();p2.show();p3.show();課堂練習(xí)7、下面程序段的執(zhí)行結(jié)果是 。#include class Aint a;public:A(int x=0) a=x; coutA()t;A() coutA()t; ;class Bint b;public:B(int x) b=x; coutB()t;B()

21、coutB()t;class CB b1;A a1;public:C(int x,int y):a1(x),b1(y) coutC()t;C()coutC()t;void main()C c1(10,20);coutn;課堂練習(xí)8、下列程序定義點(diǎn)類Point和線段類Line,并求線段的長(zhǎng)度。完善程序。程序的運(yùn)行結(jié)果 點(diǎn):(1,3) 點(diǎn):(2,4) 線段長(zhǎng)度為:1.41421#include #include class Pointint x;public:int y;Point(int=0,int=0);int getx()return x;void print() cout“點(diǎn):(”x,y“

22、)t”; ; x=a; y=b; class LinePoint p1,p2;public:Line(int a,int b,int c,int d):p1(a,c),p2(b,d) void show() p1.print(); p2.print(); double distance() double x= , y=p1.y-p2.y; return sqrt(x*x+y*y); ;void main() Line l(1,2,3,4); l.show();cout“線段長(zhǎng)度為:” n; 課堂練習(xí)9、下列程序的運(yùn)行結(jié)果是 。#include class Aint a, b;public:A(int x, int y) a=x;b=y;void show( ) coutatbn;void main( ) A a13=A(1,2),A(3,4),A(5,6);a10.show( );a11.show( );a12.show( );課堂練習(xí)三、程序設(shè)計(jì)題練習(xí)1、定義一個(gè)類Array,求一個(gè)二維數(shù)組各列元素的平均值,并將所求得的平均值按順序存入一個(gè)一維數(shù)組中,具體要求如下:(1)私有數(shù)據(jù)成員 int a45; float b5; 數(shù)組b依次存放數(shù)組a的各列元素的平均值(2)公有成員函數(shù) Array(int t5,int n):用數(shù)組t初始化數(shù)組a(n為數(shù)組t的行數(shù)),并將數(shù)組b

溫馨提示

  • 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)論