工程化程序設(shè)計(jì)(VCNET)第2章C語言基礎(chǔ)_第1頁
工程化程序設(shè)計(jì)(VCNET)第2章C語言基礎(chǔ)_第2頁
工程化程序設(shè)計(jì)(VCNET)第2章C語言基礎(chǔ)_第3頁
工程化程序設(shè)計(jì)(VCNET)第2章C語言基礎(chǔ)_第4頁
工程化程序設(shè)計(jì)(VCNET)第2章C語言基礎(chǔ)_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

工程化程序設(shè)計(jì)〔VisualC++.NET〕第2章C++語言根底課程描述:C++提出了把數(shù)據(jù)和在數(shù)據(jù)之上的操作封裝在一起的類、對(duì)象和方法的機(jī)制,并通過派生、繼承、重載和多態(tài)性等特征,實(shí)現(xiàn)了人們期待已久的軟件重用和程序自動(dòng)生成,從而大大提高了軟件的開發(fā)效率和質(zhì)量。VisualC++并非代表一種新的語言,而是一種C++的編程方式。因此,掌握C++是學(xué)習(xí)VisualC++的前提。第2章C++語言根底

了解C++程序結(jié)構(gòu)

掌握引用的有關(guān)內(nèi)容。

熟練操作運(yùn)用3種不同方式傳遞函數(shù)參數(shù)。理解類與對(duì)象的概念及特性。熟練聲明一個(gè)類和對(duì)象的方法。知識(shí)點(diǎn)及技能點(diǎn)知識(shí)點(diǎn)及技能點(diǎn)熟練掌握類的構(gòu)造函數(shù)和析構(gòu)函數(shù)。掌握類的靜態(tài)數(shù)據(jù)成員和成員函數(shù)、友元函數(shù)。理解類的繼承和派生。理解重載函數(shù)和重載運(yùn)算符、多態(tài)性。熟練操作虛函數(shù)。主要內(nèi)容2.1創(chuàng)立Win32控制臺(tái)應(yīng)用程序2.2C++概述2.3引用2.4函數(shù)的參數(shù)傳遞2.5new與delete2.6類與對(duì)象2.7類的繼承2.8重載2.9多態(tài)性重點(diǎn)和難點(diǎn)討論本章小結(jié)作業(yè)及練習(xí)所謂控制臺(tái)應(yīng)用程序是指那些需要與傳統(tǒng)DOS操作系統(tǒng)保持某種程度的兼容,同時(shí)又不需要為用戶提供完善界面的程序;簡(jiǎn)單地講,就是指在Windows環(huán)境下運(yùn)行的DOS程序。2.1創(chuàng)立Win32控制臺(tái)應(yīng)用程序案例:創(chuàng)立一個(gè)簡(jiǎn)單的Win32應(yīng)用程序目標(biāo):通過創(chuàng)立一個(gè)Win32應(yīng)用程序框架,了解如何在集成開發(fā)環(huán)境下建立C++語言編程環(huán)境。任務(wù):使用VisualC++.NET工具,創(chuàng)立一個(gè)Win32控制臺(tái)應(yīng)用工程,要求在屏幕上顯示“HelloWorld!〞字樣。案例分析案例分析圖2-1創(chuàng)立Win32控制臺(tái)應(yīng)用程序步驟:1〕創(chuàng)立一個(gè)空的工程。在圖2-1中選擇“Win32工程〞,工程名稱可以用Win32App。然后單擊“確定〞按鈕,就會(huì)出現(xiàn)圖2-2。圖2-2應(yīng)用程序向?qū)У哪J(rèn)狀態(tài)案例分析選擇“應(yīng)用程序設(shè)置〞選項(xiàng),進(jìn)入如圖2-3所示的界面。選擇“控制臺(tái)應(yīng)用程序〞單項(xiàng)選擇按鈕,并選中“空工程〞復(fù)選框。圖2-3“應(yīng)用程序設(shè)置〞選項(xiàng)卡案例分析2〕編寫代碼假設(shè)要在顯示器上顯示“HelloWorld!〞,首先要?jiǎng)?chuàng)立一個(gè)能編寫代碼的文件。請(qǐng)選擇集成開發(fā)環(huán)境的“工程〞→“添加新項(xiàng)〞命令,翻開“添加新項(xiàng)〞對(duì)話框如圖2-4所示。選擇“C++文件(.cpp)〞選項(xiàng),然后將其命名為Win32App,與工程名稱相同。圖2-4添加文件工程案例分析單擊圖2-4中的“翻開〞按鈕,在集成開發(fā)環(huán)境中可以看到一個(gè)翻開的空白的文件〔Win32APP.cpp〕,然后開始向這個(gè)文件中添加顯示“HelloWorld!〞的代碼。#include<iostream.h>voidmain(){//輸出一行文本cout<<"HelloWorld!"<<endl;}案例分析3〕編譯運(yùn)行。寫完代碼后就可以編譯運(yùn)行了。結(jié)果如圖2-5所示。

圖2-5Win32App運(yùn)行結(jié)果至此,已經(jīng)完成了簡(jiǎn)單Win32控制臺(tái)應(yīng)用程序的創(chuàng)立,讀者不難發(fā)現(xiàn),同MFC應(yīng)用程序相比,控制臺(tái)應(yīng)用程序的運(yùn)行結(jié)果顯示在DOS環(huán)境下。案例分析1.C++程序結(jié)構(gòu)下面是一個(gè)簡(jiǎn)單的C++程序://這是一個(gè)簡(jiǎn)單的C++程序#include<iostream.h>voidmain(void){inti;cout<<〞歡送使用?工程化程序設(shè)計(jì)---VisualC++.NET教程?!\n〞;cout<<〞請(qǐng)輸入要返回的值:\n〞;cin>>i;}分析2.2C++概述1〕第1條語句是C++語言的注釋語句。其中,“//〞是C++語言的注釋符號(hào),表示以“//〞開始的一行語句為注釋行。2〕第2條語句用于將定義輸入/輸出函數(shù)〔cin、cout〕的頭文件iostream.h包含到程序中。3〕第3條語句說明主程序的開始,表示主程序返回的是void類型的數(shù)據(jù),其傳遞值也是void類型。4〕第5條語句聲明了一個(gè)整型變量i。2.2C++概述5〕第6條和第7條語句是C++語言的輸出語句,可以將指定的字符串輸出到屏幕上。cout函數(shù)在頭文件iostream.h中定義。6〕第8條語句是C++語言的輸入語句,表示向變量i中輸入一個(gè)值。cin函數(shù)也是在頭文件iostream.h中定義的從以上例子中可以看出,一個(gè)C++程序往往是由預(yù)處理命令、函數(shù)、語句、變量和對(duì)象、輸入與輸出以及注釋等幾個(gè)根本局部組成的。2.2C++概述表2-1C++運(yùn)算符參見主教材表2-1。1、引用的概念。2、引用的操作。2.3引用引用是個(gè)別名,當(dāng)建立引用時(shí),程序用另一個(gè)變量或?qū)ο蟆材繕?biāo)〕的名字初始化它。從那時(shí)起,引用作為目標(biāo)的別名而使用,對(duì)引用的改動(dòng)實(shí)際就是對(duì)目標(biāo)的改動(dòng)。為建立引用,先寫上目標(biāo)的類型,后跟引用運(yùn)算符“&〞,然后是引用的名字。引用能使用任何合法變量名。例如,引用一個(gè)整型變量:intsomeInt;int&rInt=someInt;聲明rInt是對(duì)整數(shù)的引用,初始化為引用someInt。在此,要求someInt已經(jīng)有聲明或定義,而引用僅僅是它的別名。引用的概念例2-1下面的程序建立和使用引用#include<iostream.h>voidmain(){intintOne;int&rInt=intOne;intOne=5;cout<<“intOne:〞<<intOne<<endl;cout<<“rInt:〞<<rInt<<endl;rInt=7;cout<<“intOne:〞<<intOne<<endl;cout<<“rInt:〞<<rInt<<endl;}程序的運(yùn)行結(jié)果如下:intOne:5rInt:5intOne:7rInt:7引用的概念如果程序?qū)ふ乙玫牡刂罚荒苷业剿玫哪繕?biāo)的地址。例2-2下面的程序取引用的地址。#include<iostream.h>voidmain(){intintOne;int&rInt=intOne;intOne=5;cout<<“intOne:〞<<intOne<<endl;cout<<“rInt:〞<<rInt<<endl;cout<<“&intOne:〞<<&intOne<<endl;cout<<“&rInt:〞<<&rInt<<endl;}程序的運(yùn)行結(jié)果如下:intOne:5rInt:5&intOne:00F3:5300&rInt:00F3:5300引用的操作1.按值傳遞所謂按值傳遞,是指當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),C++根據(jù)實(shí)際和形式參數(shù)的對(duì)應(yīng)關(guān)系將實(shí)際參數(shù)的值一一傳遞給形式參數(shù),供函數(shù)執(zhí)行時(shí)使用。函數(shù)本身不對(duì)實(shí)際參數(shù)進(jìn)行操作,也就是說,即使形式參數(shù)的值在函數(shù)中發(fā)生了變化,實(shí)際參數(shù)的值不會(huì)受到影響。2.地址傳遞所謂地址傳遞,是指在函數(shù)定義時(shí),將形式參數(shù)聲明成指針,這樣調(diào)用函數(shù)時(shí)就需要指定地址值形式的參數(shù)。3.引用傳遞

傳遞引用給函數(shù)與傳遞指針的效果一樣,傳遞的是原來的變量或?qū)ο?,而不是在函?shù)作用域內(nèi)建立變量或?qū)ο蟮母北尽?.4函數(shù)的參數(shù)傳遞例題分析例2-3按值傳遞例2-4地址傳遞例2-5引用傳遞請(qǐng)看例題2.4函數(shù)的參數(shù)傳遞例2-3下面是想通過swap()函數(shù)調(diào)用來交換兩個(gè)整數(shù)值的程序#include<iostream.h>voidswap(int,int);voidmain(){inta=3,b=8;cout<<“a=〞<<a<<“,b=〞<<b<<endl;swap(a,b);cout<<“afterswapping…\n〞;cout<<“a=〞<<a<<“,b=〞<<b<<endl;}voidswap(intx,inty){inttemp=x;//交換兩個(gè)形參x=y;y=temp;}程序的運(yùn)行結(jié)果如下:a=3,b=8afterswapping…a=3,b=8按值傳遞例2-4下面的程序通過傳遞指針來實(shí)現(xiàn)整數(shù)值的交換#include<iostream.h>voidswap(int*,int*);voidmain(){inta=3,b=8;cout<<“a=〞<<a<<“,b=〞<<b<<endl;swap(&a,&b);cout<<“afterswapping…\n〞;cout<<“a=〞<<a<<“,b=〞<<b<<endl;}voidswap(int*x,int*y){inttemp=*x;//交換兩個(gè)形參*x=*y;*y=temp;}運(yùn)行結(jié)果為:a=3,b=8afterswapping…

a=8,b=3地址傳遞例2-5下面的程序用引用改寫swap()函數(shù)的定義及調(diào)用#include<iostream.h>voidswap(int&rx,int&ry);voidmain(){intx=5;inty=6;cout<<“beforeswap,x:〞<<x<<“,y:〞<<y<<endl;swap(x,y);cout<<“afterswap,x:〞<<x<<“,y:〞<<y<<endl;}voidswap(int&rx,int&ry){inttemp;temp=rx;rx=ry;ry=temp;}運(yùn)行結(jié)果為:beforeswap,x:5,y:6afterswap,x:6,y:5引用傳遞在C++中,用new與delete進(jìn)行動(dòng)態(tài)內(nèi)存的分配與釋放。運(yùn)算符new返回指定類型的一個(gè)指針,如果分配失敗(如沒有足夠的內(nèi)存空間)時(shí)那么返回0。例如:double*p;p=newdouble;系統(tǒng)自動(dòng)根據(jù)double類型的空間大小開辟一個(gè)內(nèi)存單元,并將地址放在指針p中。運(yùn)算符delete操作是釋放new請(qǐng)求到的內(nèi)存。例如:deletep;2.5new與delete面向過程編程與面向?qū)ο缶幊瘫容^。定義類。定義對(duì)象。構(gòu)造函數(shù)與析構(gòu)函數(shù)。對(duì)象與成員函數(shù)。2.6類與對(duì)象面向?qū)ο蟪绦蛟O(shè)計(jì)方法的主要思想是將數(shù)據(jù)(數(shù)據(jù)成員)及處理這些數(shù)據(jù)的相應(yīng)函數(shù)(成員函數(shù))封裝到類中,而使用類的變量那么稱為對(duì)象。在對(duì)象內(nèi),只有屬于該對(duì)象的成員函數(shù)才可以存取該對(duì)象的數(shù)據(jù)成員。這樣,其他函數(shù)就不會(huì)無意中破壞其內(nèi)容,從而到達(dá)保護(hù)和隱藏?cái)?shù)據(jù)的效果。面向過程編程與面向?qū)ο缶幊瘫容^類是一種用戶自定義的數(shù)據(jù)類型。聲明一個(gè)類時(shí),以關(guān)鍵字class開始,然后是類的名字。其語法結(jié)構(gòu)如下:class<類名稱>{private:[<私有數(shù)據(jù)和函數(shù)>]public:[<公有數(shù)據(jù)和函數(shù)>]};定義類例2-6以下是應(yīng)用類的簡(jiǎn)單例子#include<iostream.h>#include<math.h>classcounter{ doubledata_value;//聲明一個(gè)私有類型數(shù)據(jù)public: voidset_value(double);//聲明一個(gè)公有類型的成員函數(shù) doubleget_value(void);//聲明一個(gè)公有類型的成員函數(shù) intget_num(void);//聲明一個(gè)公有類型的成員函數(shù)}sam;//聲明類對(duì)象sam例題分析voidcounter::set_value(doublev)//成員函數(shù)的定義{ data_value=v;}doublecounter::get_value(void)//成員函數(shù)的定義{ doubledd; dd=sin(10.0*data_value); return(dd);}intcounter::get_num(void)//成員函數(shù)的定義{ intii; ii=int(data_value); return(ii);}main(){sam.set_value(50.0);//設(shè)置初值cout<<"Thevalueis“<<sam.get_value()<<endl;cout<<"Thenumis“<<sam.get_num()<<endl;return(0);}例題分析

提示:與結(jié)構(gòu)一樣,類也是一種數(shù)據(jù)類型。要想使用類,還必須聲明對(duì)象(object)。對(duì)象是類的實(shí)例,在前面的例子中,實(shí)際上已涉及到了對(duì)象的聲明,即在聲明類時(shí)直接定義對(duì)象。此外,還可以在聲明類之后再單獨(dú)聲明類對(duì)象。請(qǐng)看下面例子:例如:classexample//聲明類example{inti;public:floatf;voidfun();};exampleA;//聲明類對(duì)象A定義對(duì)象

提示:1)對(duì)象聲明后即可使用,使用方法是:對(duì)象名.成員函數(shù)名或?qū)ο竺?數(shù)據(jù)成員名例如,可以按以下方式調(diào)用類example中的成員函數(shù)fun()

A.fun();2)在本例中,對(duì)象A所能使用的數(shù)據(jù)和函數(shù)只有變量f和成員函數(shù)fun。變量i為類example的私有數(shù)據(jù),不能通過A.i使用,如何訪問i,請(qǐng)思考。定義對(duì)象C++的構(gòu)造函數(shù)和析構(gòu)函數(shù),使類對(duì)象能夠輕松地被創(chuàng)立和撤銷。構(gòu)造函數(shù)創(chuàng)立類對(duì)象,初始化其成員,析構(gòu)函數(shù)撤銷類對(duì)象。構(gòu)造函數(shù)和析構(gòu)函數(shù)都是類的特殊成員函數(shù)。構(gòu)造函數(shù)與析構(gòu)函數(shù)構(gòu)造函數(shù)與析構(gòu)函數(shù)提示:1〕構(gòu)造函數(shù)是與類同名的類的特殊成員函數(shù),在該類的對(duì)象創(chuàng)立時(shí),自動(dòng)被調(diào)用。構(gòu)造函數(shù)也可以在類的外部定義,方法同普通的類的成員函數(shù)。2〕構(gòu)造函數(shù)沒有返回類型,函數(shù)體中也不允許返回值,但可以有無值返回語句“return;〞。因?yàn)闃?gòu)造函數(shù)專門用于創(chuàng)立對(duì)象和為其初始化,所以它不能隨意被調(diào)用。3〕如果一個(gè)類對(duì)象是另一個(gè)類的數(shù)據(jù)成員,那么在那個(gè)類的對(duì)象創(chuàng)立所調(diào)用的構(gòu)造函數(shù)中,對(duì)該成員(對(duì)象)自動(dòng)調(diào)用其構(gòu)造函數(shù)。例2-7下面的程序,一個(gè)“幫教派對(duì)〞類TutorPair中,包含有學(xué)生類對(duì)象和老師類對(duì)象#include<iostream.h>classStudent{public:Student(){cout<<“constructingstudent.\n〞;someHours=100;gpa=3.5;}/*~Student(){cout<<“destructingstudent.\n〞;}*/protected:intsomeHours;floatgpa;};未完待續(xù)例題分析classTeacher{public:Teacher(){cout<<“constructingteacher.\n〞;}/*~Teacher(){cout<<“destructingteacher.\n〞;}*/};classTutorPair{public:TutorPair(){cout<<“construcingtutorpair.\n〞;noMettings=0;}/*~TutorPair(){cout<<“destructingtutorpair.\n〞;}*/protected:Studentstudent;Teacherteacher;intnoMettings;//會(huì)晤次數(shù)};例題分析未完待續(xù)voidmain(){TutorPairtp;cout<<“backinmain.\n〞;}程序運(yùn)行結(jié)果如下:constructingstudent.constructingteacher.constructingtutorpair.backinmain./*destructingtutorpair.destructingteacher.destructingstudent.*/例題分析提示例題分析提示:1〕一個(gè)類可能在構(gòu)造函數(shù)中分配資源,這些資源需要在對(duì)象不復(fù)存在以前被釋放。例如,如果構(gòu)造函數(shù)翻開了一個(gè)文件,文件就需要被關(guān)閉。析構(gòu)函數(shù)允許類自動(dòng)完成這些清理工作,不必調(diào)用其他成員函數(shù)。2〕析構(gòu)函數(shù)也是特殊的類成員函數(shù),它沒有返回類型,沒有參數(shù),不能隨意調(diào)用,也沒有重載。只是在類對(duì)象生命期結(jié)束的時(shí)候,由系統(tǒng)自動(dòng)調(diào)用。構(gòu)造函數(shù)可以有參數(shù),可以重載。3〕析構(gòu)函數(shù)以調(diào)用構(gòu)造函數(shù)相反的順序被調(diào)用。即當(dāng)主函數(shù)運(yùn)行到結(jié)束的花括號(hào)處時(shí),析構(gòu)函數(shù)依次被調(diào)用??蓞⒖祭}2-7中的加注釋(/*…*/)的斜體局部

前面介紹了成員函數(shù)與對(duì)象的聲明方式。事實(shí)上,成員函數(shù)的參數(shù)和返回值不僅可以是整型、字符型和指針類型等,而且可以把對(duì)象作為參數(shù)和返回值。下面通過例子進(jìn)行說明:

對(duì)象與成員函數(shù)例2-8對(duì)象作為參數(shù)和返回值的例子。#include<iostream.h>classDistance//聲明類Distance{intmile,yard;public:Distance();//聲明構(gòu)造函數(shù)Distance(int,int);//聲明重載的構(gòu)造函數(shù)voidget_value();//聲明成員函數(shù)Distanceadd_value(Distance);//聲明成員函數(shù)add_value//參數(shù)為Distance類的對(duì)象,返回值也是Distance類的對(duì)象voiddisplay();//聲明成員函數(shù)};未完待續(xù)例題分析Distance::Distance()//定義構(gòu)造函數(shù)體{mile=0;yard=0;}Distance::Distance(intv1,intv2)//定義重載的構(gòu)造函數(shù)體{mile=v1;yard=v2;}voidDistance::get_value()//定義成員函數(shù)體{cout<<“Entermile:〞;cin>>mile;cout<<“Enteryard:〞;cin>>yard;}未完待續(xù)例題分析DistanceDistance::add_value(DistanceA)//定義成員函數(shù)體{DistanceB;B.yard=yard+A.yard;B.mile=0;if(B.yard>=1760){B.mile=1;B.yard=-1760;}B.mile+=mile+A.mile;returnB;}voidDistance::display()//定義成員函數(shù)體{cout<<mile<<“miles〞<<yard<<“yards〞<<endl;}未完待續(xù)例題分析voidmain(){DistanceD(10,100);//定義對(duì)象D,并傳入初值DistanceF,G;//定義對(duì)象F和GF.get_value();G=D.add_value(F);//G=D+Fcout<<“Thefirstdistance:〞;D.display();cout<<“Theseconddistance:〞;F.display();cout<<“Thethirddistance:〞;G.display();}例題分析Endthis指針。靜態(tài)數(shù)據(jù)成員和成員函數(shù)。this指針和靜態(tài)成員this指針this指針是一個(gè)隱含的指針,每個(gè)成員函數(shù)都有一個(gè)this指針變量。this指針用于指向以該成員函數(shù)所屬類定義的對(duì)象,當(dāng)某個(gè)對(duì)象調(diào)用成員函數(shù)時(shí),成員函數(shù)的this指針便指向該對(duì)象。因此,不同的對(duì)象調(diào)用同一個(gè)成員函數(shù)時(shí),編譯器便依成員函數(shù)this指針?biāo)赶虻牟煌瑢?duì)象來確定應(yīng)該引用哪一個(gè)對(duì)象的數(shù)據(jù)成員。(例如,2-8中對(duì)成員函數(shù)display()的調(diào)用)靜態(tài)數(shù)據(jù)成員和成員函數(shù)在C++中,當(dāng)用一個(gè)類定義多個(gè)對(duì)象時(shí),每個(gè)對(duì)象都擁有各自的數(shù)據(jù)成員,而所有對(duì)象共享同一個(gè)成員函數(shù)。當(dāng)我們調(diào)用成員函數(shù)時(shí),系統(tǒng)會(huì)根據(jù)不同的對(duì)象去使用相應(yīng)的數(shù)據(jù)成員。C++中還有另一類數(shù)據(jù)成員---靜態(tài)數(shù)據(jù)成員,它與前面所介紹的類成員不同。這種數(shù)據(jù)成員對(duì)類的所有對(duì)象只有一個(gè)。靜態(tài)數(shù)據(jù)成員可以解決數(shù)據(jù)共享問題。這里需要注意的是,用全局變量解決數(shù)據(jù)共享有不平安的一面。靜態(tài)數(shù)據(jù)成員不僅可以實(shí)現(xiàn)多個(gè)對(duì)象之間的數(shù)據(jù)共享,而且使用靜態(tài)數(shù)據(jù)成員也不會(huì)破壞數(shù)據(jù)隱藏的原那么,即保證了數(shù)據(jù)的平安。靜態(tài)數(shù)據(jù)成員和成員函數(shù)靜態(tài)數(shù)據(jù)成員的特點(diǎn)如下:1〕靜態(tài)數(shù)據(jù)成員是類中所有對(duì)象共享的成員,而不是某個(gè)對(duì)象的成員。2〕應(yīng)用靜態(tài)數(shù)據(jù)成員可以節(jié)省內(nèi)存,因?yàn)樗撬袑?duì)象所共有的。對(duì)于多個(gè)對(duì)象來說,靜態(tài)數(shù)據(jù)成員只存儲(chǔ)在一處,供所有對(duì)象共用。3〕靜態(tài)數(shù)據(jù)成員的值對(duì)每個(gè)對(duì)象都是一樣的。它的值可以更新,只要對(duì)靜態(tài)數(shù)據(jù)成員的值更新一次,即可保證所有對(duì)象存取更新后的值相同。定義類的靜態(tài)數(shù)據(jù)成員方法是,在變量定義的前面加上關(guān)鍵字static。定義為靜態(tài)數(shù)據(jù)成員的變量應(yīng)在定義類的對(duì)象前進(jìn)行初始化。幾點(diǎn)提示靜態(tài)數(shù)據(jù)成員和成員函數(shù)提示:靜態(tài)數(shù)據(jù)成員在類中說明。靜態(tài)數(shù)據(jù)成員在類外聲明,并初始化。其初始化格式為:數(shù)據(jù)類型類名::靜態(tài)變量=初值;例如:classA{private:

inta,b,c;public:staticints;//說明靜態(tài)數(shù)據(jù)成員

staticvoidfun();//靜態(tài)成員函數(shù)};intA::s=0;//靜態(tài)數(shù)據(jù)成員在類外聲明,并初始化靜態(tài)數(shù)據(jù)成員和成員函數(shù)例題分析例2-9靜態(tài)數(shù)據(jù)成員初始化的例子。#include<iostream.h>classobjcount{private:staticintcount;public:objcount(){count++;}intget(){returncount;}程序的運(yùn)行結(jié)果如下:34voidmain(){objcounta1,a2,a3;cout<<a1.get()<<endl;objcounta4;cout<<a3.get<<endl;}在類中,值使用靜態(tài)數(shù)據(jù)成員的函數(shù)可以定義為靜態(tài)成員函數(shù)。靜態(tài)成員函數(shù)的定義方法是:在原函數(shù)定義前加static關(guān)鍵字。靜態(tài)成員函數(shù)也是屬于類的靜態(tài)成員,而非對(duì)象的成員。因此,對(duì)靜態(tài)成員的引用不需要用對(duì)象名。在靜態(tài)成員函數(shù)的實(shí)現(xiàn)中不能直接引用類中說明的非靜態(tài)成員,其格式如下:static數(shù)據(jù)類型函數(shù)名〔〕{函數(shù)體}幾點(diǎn)提示靜態(tài)成員函數(shù)

提示:靜態(tài)成員沒有this指針,即靜態(tài)成員函數(shù)不與某個(gè)具體對(duì)象相聯(lián)系。在靜態(tài)成員函數(shù)中只能訪問靜態(tài)數(shù)據(jù)成員。靜態(tài)數(shù)據(jù)成員函數(shù)不通過對(duì)象而直接調(diào)用。而非靜態(tài)成員函數(shù),必須與某個(gè)對(duì)象相聯(lián)系。成員函數(shù)是屬于類的。在main()函數(shù)中,調(diào)用靜態(tài)成員函數(shù)時(shí)使用如下格式:<類名>::<靜態(tài)成員函數(shù)名>(<參數(shù)表>)靜態(tài)成員函數(shù)例題例2-10分析以下程序的輸出結(jié)果#include<iostream.h>classperson{public:person(inta){A=a; B+=a;} staticvoidf1(personm);private:intA;staticintB;};voidperson::f1(personm){cout<<"A="<<m.A<<endl;cout<<"B="<<B<<endl;}intperson::B=0;voidmain(){personp(10),Q(20);person::f1(p);person::f1(Q);}友元函數(shù)前面介紹過,只有類中的成員函數(shù)才可以訪問類中的私類型數(shù)據(jù)和保護(hù)類型數(shù)據(jù)。為了方便使用,C++語言提供了一種特殊的函數(shù),允許訪問類的私有和保護(hù)類型數(shù)據(jù),即友元函數(shù)(friendfunction)。友元函數(shù)的聲明方式如下:class類名稱{typevars;…..public:

friend函數(shù)類型函數(shù)名稱();//友元函數(shù)…..};例題分析例2-11下面是關(guān)于友元函數(shù)的例如#include<iostream.h>classCPoint{public:CPoint(){m_x=m_y=0;}CPoint(unsignedx,unsignedy){ m_x=x; m_y=y;}voidPrint(){ cout<<"Point("<<m_x<<","<<m_y<<")"<<endl;}friendCPointInflate(CPoint&pt,intnOffset);//聲明一個(gè)友元函數(shù)private:unsignedm_x,m_y;};未完待續(xù)CPointInflate(CPoint&pt,intnOffset){CPointptTemp=pt;ptTemp.m_x+=nOffset;ptTemp.m_y+=nOffset;returnptTemp;}voidmain(){CPointpt(10,20);pt.Print();pt=Inflate(pt,3);pt.Print();}例題分析2.7類的繼承

面向?qū)ο蟪绦蛟O(shè)計(jì)中,允許某個(gè)類繼承其他類的屬性。被繼承的類稱為基類或父類,繼承的類稱為派生類或子類。繼承是C++語言的一種重要機(jī)制,這種機(jī)制自動(dòng)地為一個(gè)類提供來自另一個(gè)類的操作和數(shù)據(jù)結(jié)構(gòu),從而使得程序員只需在新類中定義已有類中沒有的成分來建立新類。1、派生類與基類

從一個(gè)基類定義一個(gè)派生類的格式如下:class<派生類名>:[<繼承方式>]<基類名>{[<派生類的成員>]};例題分析例2-12以下是一個(gè)簡(jiǎn)單的類繼承的例子classParent{inti;protected:intx;public:Parent();voidchange();voiddisplay();};Parent::Parent(){x=0;i=0;}voidParent::change(){x++;i++;}voidParent::display(){cout<<“x=“<<x<<endl;}classSon:publicParent{public:voidmodify();};voidSon::modify(){x++;}幾點(diǎn)說明經(jīng)過類繼承,派生類Son具有以下特性:保護(hù)數(shù)據(jù)x。公有成員函數(shù)Parent〔〕。公有成員函數(shù)change〔〕。公有成員函數(shù)modify〔〕。公有成員函數(shù)display〔〕。從這個(gè)例子可以看出,盡管派生類Son中只聲明了一個(gè)函數(shù),但卻繼承了基類的很多特性。此外,派生類可以使用基類中的公有和保護(hù)數(shù)據(jù),但基類卻不可以使用派生類的函數(shù)。例題分析派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)

提示:在建立派生類對(duì)象時(shí),先執(zhí)行基類的構(gòu)造函數(shù),然后執(zhí)行派生類的構(gòu)造函數(shù)。但對(duì)于析構(gòu)函數(shù)來說,其順序則相反,先執(zhí)行派生類的析構(gòu)函數(shù),而后執(zhí)行基類的析構(gòu)函數(shù)。如果在對(duì)派生類進(jìn)行初始化時(shí),需要對(duì)基類設(shè)置初值,可按下列格式進(jìn)行:

<派生類名>([<構(gòu)造函數(shù)形式參數(shù)表>]):<基類構(gòu)造函數(shù)>([<形式參數(shù)表>]){…}

多重派生類基類派生類1派生類N繼承繼承……圖2-6多重派生類前面介紹的類繼承都是基類、派生類的一對(duì)一關(guān)系。事實(shí)上,基類與派生類之間可以有復(fù)雜的多對(duì)多關(guān)系。這里將要介紹的多重派生類就是從一個(gè)基類派生出多個(gè)不同派生類的一對(duì)多關(guān)系,如圖2-6所示。類的多繼承基類1派生類基類N繼承繼承……圖2-7類的多繼承2.8重載重載包含函數(shù)重載和操作符重載,是C++語言所提供的一個(gè)重要特性。函數(shù)重載函數(shù)重載是指在一個(gè)程序內(nèi)聲明多個(gè)名稱相同的函數(shù),這些函數(shù)可以完成不同的功能,并可以帶有不同類型、不同數(shù)目的參數(shù)及返回值。使用函數(shù)重載可以減輕用戶的記憶負(fù)擔(dān),使程序結(jié)構(gòu)簡(jiǎn)單、易懂。請(qǐng)看例題操作符重載操作符重載與函數(shù)重載的功能一致。操作符重載是將C++語言中的已有操作符賦予新的功能,但與該操作符的本來含義不沖突,使用時(shí)只需根據(jù)操作符出現(xiàn)的位置來判斷其具體執(zhí)行哪一種運(yùn)算。使用操作符重載時(shí),必須用以下的方式來聲明成員函數(shù):

函數(shù)類型operator#(形參表)其中,operator是關(guān)鍵字,#表示欲定義的運(yùn)算符,函數(shù)類型指明返回值類型,通常與類類型一致或?yàn)関oid類型。請(qǐng)看例題2.9多態(tài)性多態(tài)性指的是一個(gè)接口名稱具有多種功能,是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要特性。前面介紹的函數(shù)重載和操作符重載都是用來表示名稱相同而功能不同的,因此屬于程序編譯時(shí)的多態(tài)性。在C++語言中,還有一種運(yùn)行時(shí)的多態(tài)性,又稱為虛函數(shù)。以下介紹的就是這種多態(tài)性。虛函數(shù)虛函數(shù)指的是某個(gè)函數(shù)在基類中被聲明為virtual,而在派生類中又重新定義了此函數(shù)。聲明虛函數(shù)的語法形式為:

virtual函數(shù)類型函數(shù)名稱(){……}純虛函數(shù)知識(shí)要點(diǎn):在實(shí)際應(yīng)用中,C++語言設(shè)計(jì)虛擬函數(shù)通常都是用基類定義某事件的接口及數(shù)據(jù)定義,而在派生類中定義處理該事件的方法,這樣就可以實(shí)現(xiàn)單一接口,多種功能。由于在基類中定義的虛擬函數(shù)通常只是完成初始化或定義接口的目的,一般不執(zhí)行具體功能,所以為了降低程序的復(fù)雜程度并節(jié)省內(nèi)存空間,可以讓此函數(shù)等于零,又稱為純虛函數(shù)。重點(diǎn)和難點(diǎn)引用的使用。

傳遞函數(shù)參數(shù)的方式。對(duì)象的概念及特性。構(gòu)造函數(shù)和析構(gòu)函數(shù)。類的靜態(tài)數(shù)據(jù)成員和成員函數(shù)、友元函數(shù)。類的繼承和派生。重載、多態(tài)性。虛函數(shù)。討論

在例子2-3運(yùn)行結(jié)果中是否實(shí)現(xiàn)了變量a和b的交換,為什么?在例子2-4和例子2-5的運(yùn)行結(jié)果中是否實(shí)現(xiàn)了變量a和b的交換,為什么??jī)蓚€(gè)例子有何異同?為什么要對(duì)運(yùn)算符重載?虛函數(shù)在實(shí)現(xiàn)多態(tài)性方面同重載函數(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. 人人文庫(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)論