C++程序設計教程全書課件完整版ppt全套教學教程最全電子教案教學設計(最新)_第1頁
C++程序設計教程全書課件完整版ppt全套教學教程最全電子教案教學設計(最新)_第2頁
C++程序設計教程全書課件完整版ppt全套教學教程最全電子教案教學設計(最新)_第3頁
C++程序設計教程全書課件完整版ppt全套教學教程最全電子教案教學設計(最新)_第4頁
C++程序設計教程全書課件完整版ppt全套教學教程最全電子教案教學設計(最新)_第5頁
已閱讀5頁,還剩1005頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第1章 初識C+ 默認參數 函數重載 引用 命名空間 控制臺輸入輸出 類型增強 字符串類 new/delete 強制類型轉換1.1.1 C+發展史C+是由Bjarne Stroustrup(比雅尼斯特勞斯特魯普)博士在貝爾實驗室工作期間發明并實現的。最初C+被稱為new C,后來為了體現它是一種帶類的面向對象語言,將其改名為C with class。直到1982年,Bjarne Stroustrup博士將C with class命名為C+。1.1.1 C+發展史C+的發展大致可以分為三個階段:第一階段從C+語言出現到1995年,這一階段C+語言基本上是傳統類型上的面向對象語言,并且依靠接近C語

2、言的效率,在計算機中占據著相當大的比重。在這期間Bjarne Stroustrup博士完成了經典巨著The C+ Programming Language第一版;誕生了一個傳世經典ARM;之后模板、異常、命名空間等相繼被加入。1.1.1 C+發展史第二階段從1995到2000年,這一階段由于STL庫和后來的Boost庫等程序庫的出現,泛型編程設計在C+中的比重越來越大。同時由于Java、C#等語言的出現和硬件的影響,C+受到了一定的沖擊。第三階段從2000年至今,以Loki、MPL等程序庫為代表的產生式編程和模板元編程的出現,使C+迎來了發展史上的又一個高峰。這些新技術和原有技術的融合,使C+

3、成為當今主流程序設計語言中最復雜的語言。1.1.2 C+的特點1.保持與C兼容C+既保留了C語言的所有優點,又克服了C語言的缺點,其編譯系統能檢查出更多的語法錯誤,因此C+比C語言更安全。絕大多數C語言程序可以不經修改直接在C+環境中運行,用C語言編寫的眾多庫函數可以用于C+程序中。C+設計成與C兼容,完成了從C到C+的平滑過渡。1.1.2 C+的特點2.支持面向對象編程C+引入了面向對象的概念,使得開發人機交互類型的應用程序更為簡單、快捷。通過類的層級關系進行編程,實現功能可擴展和增強的接口。具有諸如JAVA、PHP、Python等面向對象編程語言的特性。1.1.2 C+的特點3.擁有豐富的

4、庫利用C+中的標準模板庫STL,如set、map、hash等容器,可以快速編寫代碼。除此之外,數不勝數的第三方庫,如擴充C+標準庫的Boost庫、圖形庫QT、圖像處理庫OpenCV、機器學習庫Tensorflow、線性代數庫Eigen、游戲庫OpenGL等,這些優秀的庫為企業的項目開發提供了非常大的支持,是必不可少的部分。1.1.2 C+的特點4.支持嵌入式開發C+在嵌入式開發領域有重要的地位,智能設備在生活隨處可見,如智能手表、機器人等,這些智能設備的底層驅動和上層應用開發離不開C+語言的支持。C+11標準中增加的新特性,如原子操作、常量表達式、線程同步機制等,能夠更加緊密的和硬件結合。1.

5、1.2 C+的特點5.類型安全增強C+和C語言屬于強類型語言,C語言中可以進行強制類型轉換,相對自由靈活。在C中強制類型轉換被認為是設計的不合理,為了兼容C語言提供了三種類型轉換形式。1.1.2 C+的特點6.支持垃圾回收機制大多數面向對象編程語言具有垃圾回收機制,而C+語言不具備垃圾回收機制,意味著申請的內存資源在使用完成后要自己釋放還給系統。C+11標準的新特性智能指針,實現了內存資源的自動管理,使指針更加靈活并避免了內存泄漏。1.2 第一個C+程序1 #include 2 using namespace std;3 int main()4 5cout hello C+ endl;6 re

6、turn 0;7 例1-1 hello.cpp1.2 第一個C+程序C+程序文件以.cpp為擴展名,頭文件仍然以.h為擴展名。但是,C+標準程序庫頭文件,一般不以.h結尾。例如,包含數學函數的頭文件時,一般使用“#include”,而不使用“#include”。1.2 第一個C+程序第1行代碼:包含了輸入輸出頭文件 iostream,它是C+標準庫頭文件。第2行代碼:引用標準命名空間std。第37行代碼:定義main()函數。第5行代碼:在屏幕上輸出“hello C+”。第6行代碼:通過return返回0。1.3.1 命名空間命名空間是C+語言的新特性,它能夠解決命名沖突問題。例如,小明定義了

7、一個函數swap(),C+標準程序庫中也存在一個swap()函數。此時,為了區分調用的是哪個swap()函數,可以通過命名空間進行標識。1.3.1 命名空間1.標準命名空間std是C+標準命名空間,由于C+標準庫幾乎都定義在std命名空間中,所以編寫的所有C+程序都需要引入下列語句。要使用標準命名空間的內容必須先聲明才能使用,聲明方式如下:using namespace std;1.3.1 命名空間2.自定義命名空間自定義命名空間使用namespace定義,其格式如下:namespace空間名 /可以是變量、函數、類、其他命名空間1.3.1 命名空間命名空間的使用有三種方式:(1)命名空間名加

8、上作用域標識符“:”標識要使用的實體。在引用處指明變量所屬的空間,例如,使用標準命名空間的標準輸出和換行符,示例代碼如下:std:coutC+std:endl;1.3.1 命名空間(2)使用using關鍵字,在要使用空間實體的上面,使用using關鍵字引入要使用的空間變量。例如,使用標準命名空間的標準輸出,示例代碼如下:using std:cout;cout”結合使用,用于讀入用戶輸入,以空白(包括空格、回車、TAB)為分隔符。# 讀入單個變量char c1,c2;cinc1;cinc2;# 讀入多個變量string s,y;float f;cinsy; /一次讀入多個相同類型的變量cinsf

9、; /一次讀入多個不同類型的變量1.3.2 控制臺輸入輸出2.coutcout與運算符“”結合使用,用于向控制臺輸出信息,稱作標準輸出對象或屏幕輸出對象,但cout也可以重定向輸出到磁盤文件。1.3.2 控制臺輸入輸出(1)cout輸出常量值cout10endl;coutaendl;coutC+endl;(2)cout輸出變量值/輸出單個變量int a =10;coutaendl; /輸出多個變量int a = 10;char *str = abc;couta,strendl;1.3.2 控制臺輸入輸出(3)cout輸出指定格式的數據使用cout輸出指定格式的數據時,可以通過C+標準庫提供的標

10、志位和操作符控制格式,使用這些操作需要包含iomanip頭文件。輸出八進制、十進制、十六進制數據int a =10;coutoct:octaendl;/以八進制輸出coutdec:decaendl;/以十進制輸出couthex:hexaendl;/以十六進制輸出1.3.2 控制臺輸入輸出輸出指定精度數據doublef=3.1415926;cout默認輸出:fendl;cout精度控制setprecision(7)setiosflags(ios:fixed)fendl;輸出指定域寬、對齊、填充方式的數據coutsetw(10)3.1415endl;coutsetw(10)setfill(0)3.

11、1415endl;coutsetw(10)setfill(0)setiosflags(ios:left)3.1415endl;coutsetw(10)setfill(-)setiosflags(ios:right)3.1415 y;1.3.3 類型增強3.枚舉類型enumC語言中枚舉類型只能是整數類型,且枚舉變量可以用任意整數賦值,使用自由靈活。在C+中,枚舉變量只能使用枚舉出來的元素進行賦值。enumtemperatureWARM,COOL,HOT;enumtemperaturet=WARM;t=10;1.3.4 默認參數C+支持默認參數,即在定義或聲明函數時給形參一個初始值,在調用函數時,

12、如果不傳遞實參就使用默認參數值。/例1-3 defaultPara.cppvoid add(int x,int y=1,int z=2) coutx+y+zendl;int main()add(1); add(1,2); add(1,2,3); return 0;1.3.4 默認參數在使用默認參數時需要注意以下規則:(1)默認參數只可在函數聲明中出現一次,如果沒有函數聲明,只有函數定義,才可以在函數定義中設定。(2)默認參數賦值的順序是自右向左,即如果一個參數設定了默認參數,則其右邊不能存在未賦值的形參。(3)默認參數調用時,遵循參數調用順序,即有參數傳入它會先從左向右依次匹配。(4)默認參數

13、值可以是全局變量、全局常量,甚至可以是一個函數。1.3.5 函數重載重載(overload)函數就是在同一個作用域內幾個函數名字相同但形參列表不同。/例1-4 overloadFunc.cppvoid add(int x, int y)cout int: x + y endl;void add(float x)cout float: 10 + x endl;double add(double x, double y)return x + y;int main()add(10.2); /一個實型參數add(1, 3); /兩個整型參數return 0;1.3.5 函數重載當重載函數中的形參都是普

14、通形參,定義和調用不會出現問題,當重載函數有默認參數值時,需要注意參數傳遞的問題。注 意1.3.5 函數重載當使用具有默認參數的函數重載形式時,須注意防止調用的二義性,例如,下面的兩個函數:int add(int x, int y = 1);void add(int x);當調用add()函數時,如果只有一個參數就會產生歧義,編譯器無法確認調用哪一個函數,這就產生了調用的二義性。在使用時要杜絕一個函數既有默認參數又是重載函數,避免二義性的發生。1.3.6 引用引用是C+引入的新語言特性,它是某一變量的別名,C+引入引用的目的是簡化指針的使用,靈活的使用引用可以使程序簡潔高效。1.3.6 引用引

15、用就是給一個變量起一個別名,用“&”標識符來標識,其定義格式如下:數據類型 & 引用名 = 變量名;上述格式中,“&”并不是取地址操作符,而是起標識作用,標識所定義的標識符是一個引用。引用聲明完成以后,定義的變量會有兩個名稱,定義多個則有多個名稱。1.3.6 引用/例1-5 reference.cppint a=10;int &ra=a;cout變量a的地址hex&aendl;cout引用ra的地址:hex&raendl;cout引用ra的值:decraendl;1.3.6 引用在定義引用時需要注意以下方面: 引用在定義時必須初始化,且與變量類型保持一致。 引用在初始化時不能綁定常量值,如in

16、t &b = 10,是錯誤的。 引用在初始化后,其值就不能再更改,即不能用作其它變量的引用。 不能定義引用的引用,即不能定義引用再次引用一個引用。即int &rb=ra,是錯誤的用法。 有指針類型、數組類型的引用,而沒有引用的指針和引用的數組。1.3.6 引用C+增加引用類型,主要的應用就是把它作為函數的參數,以擴充函數傳遞數據的功能。/例1-6 quote.cpp#include using namespace std;void exchange(int& x, int& y)int temp = x;x = y;y = temp;int main() int a, b; cout plea

17、se input two nums: a b; exchange(a, b); cout exchange: a b s2.size();1.3.7 字符串類C語言沒有字符串這一數據類型,都是用字符數組處理字符串,C+支持C風格的字符串,還提供了一種自定義數據類型string,用于表示字符串,string是定義在頭文件string中的類,使用前需要包含頭文件string。使用string類型定義字符串,不必擔心字符串長度、內存不足等情況,而且string類重載的運算符和成員函數足以完成字符串的處理操作。1.3.7 字符串類String定義字符串方式:string s1;s1=hello C+;

18、/第一種方式string s2=hello C+;/第二種方式string s3(hello C+);/第三種方式string s4(6,a);/第四種方式1.3.7 字符串類1.訪問字符串中的字符string類重載了“”操作符,可以用索引訪問和操作字符串中指定位置的字符。string s=hello,C+;s7=P;s8=P;2.字符串連接string重載了“+”運算符,可以使用“+”運算符連接兩個string類型的字符串。string s1,s2;s1=我在學習;s2=C+;couts1+s2、s1s2;if(s1s2)cout字符串s1大于s2endl;else if (s1s2)cou

19、t字符串s2大于s1endl;elsecout字符串s1于s2相等endl;1.3.7 字符串類4.字符串長度計算string類也提供了一些獲取字符串長度的函數,length()函數函數,用于獲取字符串長度。string s = hello C+;coutlength():s.length()endl;1.3.7 字符串類5.字符串交換string類提供了成員函數swap(),用于交換兩個字符串的值。string s1=hello C+;string s2=I Love China!;s1.swap(s2);string的成員函數swap()只能交換string類型的字符串,不能交換C語言風格

20、的字符串。1.3.8 new/delete1.newnew運算符用來申請一塊連續的內存,其格式如下:new 數據類型(初始化列表);new在分配存儲空間時指定了類型信息,并能根據初始化列表中給出的值進行初始化,new分配的內存空間直接可以使用,這個過程,稱為new一個對象。new創建動態對象時不必為對象命名,直接指定數據類型即可。如果申請內存成功,返回一個類型指針;如果內存申請失敗,則返回NULL。1.3.8 new/delete(1)創建基本數據類型對象使用new創建數據對象可以有不同的初始化方式:char* pc = new char; /申請空間存儲char類型數據,內存中沒有初始值in

21、t* pi = new int(10); /申請空間存儲int類型數據,初始值為10float* pd = new float(); /申請空間存儲float類型的數據,默認初始值為01.3.8 new/delete(2)創建數組類型對象new 數據類型數組長度;new數組時,后面可以加小括號(),括號中不可以指定任何初始值,由編譯器提供默認初始值,不加小括號時不提供初始值。int *pi = new int10();char *pc = new char10;1.3.8 new/delete2.delete用new運算符分配內存,使用后要及時釋放以免造成內存泄露,C+提供了delete運算符

22、釋放new出來的內存空間,其格式如下:delete 指針名;delete運算符直接作用于指針就可以刪除由new創建的對象,釋放指針所指向的內存空間。但在釋放數組對象時要在指針名前加上,其格式如下:delete 指針名;如果漏掉了,編譯器在編譯時無法發現錯誤,導致內存泄露。1.3.8 new/deleteint *pi = new int(10); /new 一個int對象,初始值為10cout*pi=*piendl;*pi = 20; /通過指針改變變量的值cout*pi = *piendl;char *pc = new char10;for (int i = 0;i 10;i+)pci =

23、i + 65; /向數組中存入元素for (int i = 0;i 10;i+)coutpci ;coutendl;delete pi; /釋放int對象delete pc; /釋放數組對象例1-7 allocMeorry.cpp1.3.9 extern “C”在C+程序中,可以使用extern “C”標注C語言代碼,編譯器會將extern “C”標注的代碼以C語言的方式編譯。externC / C語言代碼1.3.9 extern “C”例1-8 mallocStr.h#include #include char* func(int,char*);例1-9 mallocStr.c#define

24、 _CRT_SECURE_NO_WARNINGS#includemallocStr.hchar* func(int size,char *str)char *p =malloc(size);strcpy(p,str);return p;1.3.9 extern “C”例1-10 main.cpp#ifdef _cplusplusextern C#endif #includemallocStr.h#ifdef _cplusplus#endif int main() char str=C+; char *p=func(sizeof(str)+1,str); coutpendl; free (p);

25、 return 0; 1.3.10 強制類型轉換1.static_cast(expression)static_cast類型轉換運算符可以實現下列轉換: 基本數據類型之間的轉換。 將任何類型轉換為void類型。 把空指針轉換成目標類型的指針。 用于類層次結構中基類和派生類之間指針或引用的轉換。向上轉換(派生類轉換為基類)是安全的,向下轉換(基類轉為派生類)沒有動態類型檢查,是不安全的。1.3.10 強制類型轉換int a=1;float b=3.14;a=static_cast(b); / 將float類型轉為int類型b=static_cast(a); / 將void *p=NULL; in

26、t *q=NULL;q=p; / 空指針轉為int類型,C語言允許,C+不允許p=q;q=static_cast(p); / 空指針轉為int1.3.10 強制類型轉換2.reinterpret_cast(expression)reinterpret_cast通常為操作數的位模式提供較底層的重新解釋,重新解釋指的是將二進制數據重新解釋,在向上轉換或者向下轉換不可以進行隱式轉換時,則需要重新解釋類型轉換,reinterpret_cast要轉換的type類型必須是指針類型、引用或算術類型。1.3.10 強制類型轉換char c = a;int d = reinterpret_cast(c);int

27、 *p=NULL; float *q=NULL;p = q; /C語言允許,C+語言不允許q = p; /C語言允許,C+語言不允許p = static_cast(q); /static_cast無法轉換q = static_cast(p); /static_cast無法轉換p = reinterpret_cast(q);q = reinterpret_cast(p);1.3.10 強制類型轉換3.const_cast(expression)const_cast用于移除const對象的引用或指針具有的常量性質,可以去除const對引用和指針的限定,const_cast只能用于轉換指針或引用。C

28、+中使用const修飾的變量只能被讀取而無法被修改,而C語言中能通過指針方式修改const修飾的變量。為了兼容C語言,具有C語言的功能而比C語言更完善,C+語言提出了const_cast轉換方式,能夠修改const修飾的變量。1.3.10 強制類型轉換int num = 100;const int* p1 = #/將常量指針轉換為普通類型指針,去除const屬性 int* p2 = const_cast(p1);*p2 = 200;int a=100;const int & ra=a;/將常量引用轉化為普通類型引用,去除const屬性const_cast(ra)=200;1.3.10

29、強制類型轉換4.dynamic_cast(expression)dynamic_cast用于運行時檢查類型轉換是否安全,可以在運行期間確定類型,如類的指針、類的引用和void*。dynamic_cast主要應用于類層次間的向上轉換和向下轉換,以及類之間的交叉轉換。在類層次間進行上行轉換時,它和static_cast作用一致,與static_cast相比,dynamic_cast能夠在運行時檢查類型轉換是否安全。當向下轉換時,基類指針或引用指向派生類對象時,dynamic_cast運算符會返回轉換后類型的指針,這樣的轉換是安全的。如果基類指針或引用沒有指向派生類對象則轉換是不安全的,并返回NUL

30、L。多學一招:Bjarne Stroustrup對編寫C+的建議 1.在 C+中幾乎不需要用宏。2.用 const 或 enum 定義顯式的常量。3.用 inline 避免函數調用的額外開銷。4.用模板去定義函數或類型。5.用 namespace 去避免命名沖突。6.確保聲明的變量初始化,而不要在需要使用之前去聲明。多學一招:Bjarne Stroustrup對編寫C+的建議 7.使用new和delete會比malloc()和free()函數更好,對于realloc()函數,可以用vector()代替。8.避免使用 void*、指針算術、聯合和強制轉換。9.盡量少用數組和 C 風格的字符串,標

31、準庫中的 string 和 vector 可以簡化程序。10.試著將程序考慮為一組由類和對象表示的相互作用的概念。1.4 本章小結本章首先講解了C+語言的發展歷史、特點,然后帶領大家編寫了第一個C+程序,最后講解了C+語言相對于C語言在基礎語法上的擴充,如命名空間、類型增強、默認參數、引用等新知識點。通過本章的學習,大家會對C+語言有基礎的認識,在編寫C+語言程序中使用這些特性,為后續學習新的內容奠定基礎。第2章 類與對象 this指針 構造函數 析構函數 類的定義 對象的創建與使用 類的封裝 拷貝構造函數 const與static修飾類成員 友元2.1 面向對象程序設計思想在程序中使用對象映

32、射現實中的事物,利用對象之間的關系描述事物之間的聯系,這種思想就是面向對象。面向對象則是把構成問題的事物按照一定規則劃分為多個獨立的對象,然后通過調用對象的方法解決問題。當然,一個應用程序會包含多個對象,通過多個對象的相互配合即可實現應用程序所需的功能,這樣當應用程序功能發生變動時,只需要修改個別對象就可以了,使代碼更容易維護。2.1 面向對象程序設計思想面向對象三大特征封裝繼承多態2.1 面向對象程序設計思想1.封裝封裝是面向對象程序設計最重要的特征之一,封裝就是隱藏,它將數據和數據處理過程封裝成一個整體,以實現獨立性很強的模塊,避免外界直接訪問對象屬性而造成耦合度過高及過度依賴。2.1 面

33、向對象程序設計思想2.繼承繼承主要描述的是類與類之間的關系,通過繼承無須重新編寫原有類,就能對原有類的功能進行擴展。繼承2.1 面向對象程序設計思想3.多態多態是事物的多種表現形態。例如,上課鈴聲響起后,各科老師準備去不同的班級上課,上體育課的班級在操場站好了隊等體育老師發布口令、上文化課的學生聽到鈴聲后回到各自的班級,這就是多態。在面向對象程序設計中,多態就是不同的對象對同一個消息產生不同的行為。2.2.1 類的定義類是對象的抽象,是一種自定義數據類型,它用于描述一組對象的共同屬性和行為。類的定義格式如下所示:class 類名權限控制符: 成員;2.2.1 類的定義 class是定義類的關鍵

34、字。 類名是類的標識符,其命名遵循標識符的命名規范。 類名后面的一對大括號,用于包含類的成員,類的所有成員要在這一對大括號中聲明。類中可以定義成員變量(描述對象特征)和成員函數(描述對象行為)。 聲明類的成員時,通常需要使用權限控制符限定成員的訪問規則,權限控制符包括public、private和protected,這三種權限控制符的權限依次遞減。 大括號的后面的一個分號“;”表示類定義的結束。2.2.1 類的定義class Student/定義類Studentpublic:/公有權限 void study();/聲明表示學習的成員函數 void exam();/聲明表示考試的成員函數priv

35、ate:/私有權限 string _name;/姓名 int _age;/年齡;代碼定義了一個簡單的學生類Student,該類中有兩個成員變量:_name、_age,它們是類的私有成員;除了成員變量,該類還定義了兩個成員函數:study()和exam(),它們是類的公有成員。2.2.1 類的定義通常情況下,類的成員函數在類中聲明,在類外實現。在類外實現成員函數,必須在返回值之后、函數名之前加上所屬的類作用域,即“類名:”,表示函數屬于哪個類。其格式如下所示:返回值類型 類名:函數名稱(參數列表)函數體2.2.1 類的定義例如,實現類Student的成員函數,示例代碼如下:void Studen

36、t:study()/類外實現studey()成員函數cout 學習C+ endl;void Student:exam()/類外實現exam()成員函數cout C+考試成績100分 endl;2.2.1 類的定義類的訪問權限控制符: public(公有類型):被public修飾的成員也稱為公有成員。公有成員是類的外部接口,可以被所屬類的成員函數、類對象、派生類對象、友元函數、友元類訪問。 private(私有類型):被private修飾的成員稱為私有成員,只能被所屬類的成員函數、友元函數、友元類訪問。 protected(保護類型):被protected修飾的成員稱為保護成員,其訪問權限介于私

37、有和公有之間,可以被所屬類的成員函數、派生類、友元類和友元函數訪問。2.2.2 對象的創建與使用定義了類,就相當于定義了一個數據類型,它與int、char等數據類型是一樣的,可以定義具體的變量,使用類定義的變量通常稱為該類的對象。對象的定義格式如下所示:類名 對象名;Student stu; 2.2.2 對象的創建與使用創建了類的對象,系統就要為對象分配內存空間,用于存儲對象成員。在存儲時,對象的成員變量都有獨自的內存空間,但成員函數是所有對象共享的。2.2.2 對象的創建與使用對象的成員變量和成員函數的訪問可以通過“.”運算符實現。對象名.成員變量對象名.成員函數對象的成員訪問2.2.2 對

38、象的創建與使用class Student public: void study(); void exam(); string _name; int _age;void Student:study() cout 學習C+ endl; void Student:exam() cout C+考試成績100分 endl;int main() Student stu; stu._name = 張三; stu._age = -20; cout stu._name stu._age 歲 endl; stu.study(); stu.exam(); return 0;例2-1 Student.cpp2.3 封

39、裝C+中的封裝是通過類實現的,通過類把具體事物抽象為一個由屬性和操作行為結合的獨立單位,通過類的對象對屬性和行為進行操作。在類的封裝設計中通過權限控制方式實現類成員的訪問,目的是為了隱藏對象的內部實現細節,只對外提供訪問的接口。封 裝2.3 封裝通過權限控制符可以限制外界對類的成員變量的訪問,將對象的狀態信息隱藏在對象內部,通過類提供的函數(接口)實現對類中成員的訪問。其具體實現過程為:在定義類時,將類中的成員變量設置為私有或保護屬性,即使用private或protected關鍵字修飾成員變量。使用類提供的公有成員函數(public修飾的成員函數),如getXxx()函數和用于設置成員變量值的

40、setXxx()函數,操作成員變量的值。封 裝2.3 封裝/例2-2 package.cppclass Studentpublic: void study(); void exam(); void setName(string name); void setAge(int age); string getName(); int getAge();private: string _name; int _age;void Student:study() cout 學習C+ endl;void Student:exam() cout C+考試成績100分 endl;void Student:setN

41、ame(string name) _name = name;void Student:setAge(int age) if (age 100) cout _name 年齡輸入錯誤 endl; _age = 0; else _age = age;string Student:getName()return _name;int Student:getAge()return _age; 2.3 封裝int main()Student stu;/創建Student類對象stustu.setName(張三);/設置對象stu的姓名stu.setAge(-20);/設置對象stu的年齡cout stu.g

42、etName() stu.getAge() 歲 endl;stu.study();/調用成員函數study()stu.exam();/調用成員函數exam() Student stu1;/創建Student類對象stu1stu1.setName(李四);stu1.setAge(22);cout stu1.getName() stu1.getAge() 歲 _name = name;string Student:getName(Student* this)return this-_name;2.4 this指針上述過程是隱含的,由編譯器完成。當對象stu調用成員函數時,指向對象stu的this指

43、針作為成員函數的第一個參數,在成員函數內部使用對象屬性時,編譯器會通過this指針訪問該屬性。2.4 this指針在實現類的成員函數時,如果形參與類的屬性重名,可以用this指針解決。例如,Student類的成員變量為name和age,則成員變量和setName()函數、setAge()函數在賦值時無法區分形參和實參,可使用this指針:void Student:setName(string name)this-_name = name; string Student:getName()return this-_name; 如果類的成員函數返回值為一個對象,則可以使用return *this返

44、回對象本身。2.5 構造函數構造函數是類的特殊成員函數,用于初始化對象。構造函數在創建對象時由編譯器自動調用。C+中的每個類至少要有一個構造函數,如果類中沒有定義構造函數,系統會提供一個默認的無參構造函數,默認的無參構造函數體也為空,不具有實際的初始化意義。因此,在C+程序中要顯式定義構造函數。2.5.1 自定義構造函數構造函數是類的特殊成員函數,C+編譯器嚴格規定了構造函數的接口形式,其定義格式如下所示:class 類名權限控制符:構造函數名(參數列表)函數體 /其他成員;2.5.1 自定義構造函數 構造函數名稱必須與類名相同。 構造函數名稱的前面不需要設置返回值類型。 構造函數中無返回值,

45、不能使用return返回。 構造函數的成員權限控制符一般設置為public。2.5.1 自定義構造函數1.自定義無參構造函數自定義無參構造函數時,可以在函數內部直接給成員變量賦值。/例2-3 noPara.cppclass Clockpublic: Clock(); void showTime();private: int _hour; int _min; int _sec; ;Clock:Clock() _hour=0; _min=0; _sec=0; void Clock:showTime() coutsetw(2)setfill(0)_hour: setw(2)setfill(0)_mi

46、n: setw(2)setfill(0)_secendl;int main()Clock clock;coutclock:;clock.showTime();return 0;2.5.1 自定義構造函數2.自定義有參構造函數如果希望在創建對象時提供有效的初始值,可以通過定義帶參數的構造函數實現。/例2-4 parameter.cppclass Clock/定義時鐘類Clockpublic:Clock(int hour, int min, int sec); /聲明有參構造函數void showTime();/用于顯示時間的成員函數2.5.1 自定義構造函數private:int _hour;

47、int _min; int _sec; /聲明時分秒變量;Clock:Clock(int hour, int min, int sec) /類外實現有參構造函數_hour=hour;_min=min; _sec=sec;void Clock:showTime() /類外實現成員函數coutsetw(2)setfill(0)_hour:setw(2)setfill(0)_min :setw(2)setfill(0)_secendl; 2.5.1 自定義構造函數int main()Clock clock1(10,20,30); /創建對象clock1,傳入初始值coutclock1:;clock1

48、.showTime(); /通過對象調用成員函數showTime()顯示時間Clock clock2(22,16,12); /創建對象clock2,傳入初始值coutclock2:;clock2.showTime(); /通過對象調用成員函數showTime()顯示時間return 0;2.5.1 自定義構造函數在實現構造函數時,還可以通過“:”運算符,在構造函數后面初始化成員變量,這種方式稱為列表初始化,其格式如下所示:類:構造函數(參數列表): 成員變量1(參數1), 成員變量的2(參數2), 成員變量n(參數n)構造函數體Clock:Clock(int hour, int min, in

49、t sec):_hour(hour),_min(min),_sec(sec)2.5.2 重載構造函數在C+中,構造函數允許重載,例如,Clock類可以定義多個構造函數。2.5.2 重載構造函數class Clock /定義時鐘類public:Clock();Clock(int hour);Clock(int hour, int min);Clock(int hour, int min, int sec);void showTime();/顯示時間private:int _hour;/小時int _min;/分鐘int _sec;/秒;2.5.2 重載構造函數當定義具有默認參數的重載構造函數時,

50、要防止調用的二義性。/例2-5 overload.cppclass Clockpublic: Clock(int hour, int min); Clock(int hour, int min, int sec=0); /有默認參數 void showTime();private: int _hour; int _min; int _sec; ;Clock:Clock(int hour, int min):_hour(hour),_min(min) cout調用兩個參數的構造函數endl; _sec=10; 2.5.2 重載構造函數Clock:Clock(int hour, int min,

51、int sec=0) cout調用三個參數的構造函數endl; _hour=hour; _min=min; _sec=sec;void Clock:showTime() coutsetw(2)setfill(0)_hour: setw(2)setfill(0)_min: setw(2)setfill(0)_secendl; int main() Clock clock(8,0); coutclock:; clock.showTime(); return 0;2.5.2 重載構造函數運行上述代碼,由于構造函數調用不明確,程序會報錯。2.5.2 重載構造函數上述代碼中,Clock類定義了兩個重載構

52、造函數,其中,第一個構造函數有兩個參數;第二個構造函數有三個參數,最后一個參數有一個默認值。在main()函數中創建一個對象clock,傳入兩個參數,編譯器無法確認調用的是哪個構造函數,因此程序會報錯。2.5.3 含有類成員對象的構造函數C+中允許將一個已定義的對象作為另一個類的成員變量,即類中的成員變量可以是其他類的對象,這樣的成員變量稱為類的子對象或成員對象。2.5.3 含有類成員對象的構造函數含有成員對象的類的形式如下所示:class BA a;/對象a作為類B的成員變量2.5.3 含有類成員對象的構造函數創建含有成員對象的對象時,先執行成員對象的構造函數,再執行類的構造函數。例如,上述

53、格式中,類B包含一個類A對象作為成員變量,在創建類B對象時,先執行類A的構造函數,將類A對象創建出來,再執行類B的構造函數,創建類B對象。如果類A構造函數有參數,其參數要從類B的構造函數中傳入,且必須以“:”運算符初始化類A對象。2.5.3 含有類成員對象的構造函數/例2-6 Student.cppclass Birthpublic:Birth(int year,int month, int day); void show();private:int _year; int _month; int _day;Birth:Birth(int year, int month, int day):_y

54、ear(year),_month(month),_day(day)coutBirth類構造函數endl; void Birth:show()cout出生日期:_year-_month-_dayendl;2.5.3 含有類成員對象的構造函數class Student /定義學生類Studentpublic:Student(string name, int id, int year, int month, int day);void show();private:string _name; int _id; Birth birth; ;Student:Student(string name, in

55、t id, int year, int month, int day):birth(year,month,day)coutStudent類構造函數endl;_name=name; id=id; void Student:show()cout姓名:_nameendl;cout學號:_idendl;birth.show(); 2.5.3 含有類成員對象的構造函數int main() Student stu(lili,10002,2000,1,1);/創建學生對象stustu.show();/顯示學生信息return 0;2.5.3 含有類成員對象的構造函數上述代碼,定義了兩個類:日期類Birth:

56、該類中有三個成員變量:_year、_month、_day,并且定義了有參數的構造函數;學生類Student:該類有三個成員變量:_name、_id、birth,其中,birth是類Birth的對象。此外,Student類還定義了一個構造函數。由于成員對象birth的構造函數有三個參數,這三個參數要從類Student的構造函數中獲取,因此Student類的構造函數共有5個參數。2.5.3 含有類成員對象的構造函數在實現Student類的構造函數,birth成員對象必須通過“:”運算符在Student構造函數后面初始化,無法在Student構造函數體中賦值。在main()函數中創建Student類

57、對象stu,可以通過對象stu調用成員函數show()顯示學生信息,包括學生出生日期。2.6 析構函數創建對象時,系統會為對象分配所需要的內存空間等資源,當程序結束或對象被釋放時,系統為對象分配的資源也需要回收,以便可以重新分配給其他對象使用。在C+中,對象資源的釋放通過析構函數完成。析構函數的作用是在對象被釋放之前,完成一些清理工作。析構函數調用完成之后,對象占用的資源也被釋放,對象也就消失了。2.6 析構函數與構造函數一樣,析構函數也是類的一個特殊成員函數,其定義格式如下所示:class 類名析構函數名稱();2.6 析構函數關于析構函數的定義,有以下注意事項: 析構函數的名稱與類名相同,

58、在析構函數名稱之前添加“”符號。 析構函數沒有參數。因為沒有參數,所以析構函數不能重載,一個類中只有一個析構函數。 析構函數沒有返回值,不能在析構函數名稱前添加任何返回值類型。在析構函數內部,也不能通過return返回任何值。2.6 析構函數當程序結束時,編譯器會自動調用析構函數完成對象的清理工作,如果類中沒有定義析構函數,編譯器會提供一個默認的析構函數,但默認的析構函數只能完成棧上對象的資源清理,無法完成堆內存對象的資源清理。因此,在程序中往往需要自定義析構函數。2.6 析構函數析構函數的調用情況主要有以下幾種:(1)在一個函數中定義了一個對象,當函數調用結束時,對象應當被釋放,對象釋放之前

59、,編譯器會調用析構函數釋放資源。(2)static修飾的對象和全局對象,只有在程序結束時才會調用析構函數。(3)new運算符創建的對象,在調用delete釋放對象時,編譯器會調用析構函數釋放資源。2.6 析構函數析構函數的調用順序與構造函數的調用順序是相反的。在構造對象和析構對象時,C+遵循的原則是:先構造的后析構,后構造的先析構。注 意2.6 析構函數/例2-7 Rabbit.cppclass Rabbit/定義兔子類Rabbitpublic:Rabbit(string name,const char *pf);void eat();Rabbit();private:string _name

60、;char *_food;2.6 析構函數Rabbit:Rabbit(string name, const char* pf)cout調用構造函數endl;_name=name;_food=new char50;memset(_food,0,50);strcpy(_food,pf);void Rabbit:eat() cout_name is eating _foodendl; Rabbit:Rabbit()cout調用析構函數,析構_nameendl;if(_food != NULL)delete _food; 2.6 析構函數int main()Rabbit A(A,luobo);A.ea

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論