高程——第一部分+C++基礎_第1頁
高程——第一部分+C++基礎_第2頁
高程——第一部分+C++基礎_第3頁
高程——第一部分+C++基礎_第4頁
高程——第一部分+C++基礎_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、高級程序設計語言高級程序設計語言C+基礎 授課教師:楊佳授課教師:楊佳 聯系方式:聯系方式: 課件密碼:課件密碼:yangjia類和對象初步認知類和對象初步認知u 類的定義類的定義l類定義格式類定義格式l成員函數的定義成員函數的定義 inline成員函數成員函數u 對象的定義與成員訪問對象的定義與成員訪問l成員函數的存儲方式成員函數的存儲方式this指針指針u 對象的初始化與釋放對象的初始化與釋放l構造函數與析構函數構造函數與析構函數l動態(tài)分配對象動態(tài)分配對象 類定義的格式類定義的格式 類定義的一般格式為:類定義的一般格式為: class 類名類名 private: 數據成員或成員函數數據成員

2、或成員函數 protected: 數據成員或成員函數數據成員或成員函數 public: 數據成員或成員函數數據成員或成員函數 ;在類外不能存取,只有類中在類外不能存取,只有類中的成員函數或友元可以訪問的成員函數或友元可以訪問(默認)(默認)可被程序中的任何函數或語可被程序中的任何函數或語句存取。多為成員函數,用句存取。多為成員函數,用來提供一個與外界的接口,來提供一個與外界的接口,外界只有通過這個接口才可外界只有通過這個接口才可以訪問類。以訪問類。不能在類之外存取,只有類不能在類之外存取,只有類的成員函數、友元及其派生的成員函數、友元及其派生類(子類)可以存取類(子類)可以存取protecte

3、d 成員。成員。類的定義實例類的定義實例class CStuScore public: / 公有類型聲明公有類型聲明 string m_strName; / 姓名姓名 string m_strStuNO; / 學號學號 void SetScore(float s0, float s1,float s2) ; / 設置三門課成績設置三門課成績 float GetAverage(); /求平均成績求平均成績 private: / 私有類型聲明私有類型聲明 float m_fScore; / 三門課程成績三門課程成績 ; / 注意分號不能省略注意分號不能省略類的定義注意事項類的定義注意事項定義類時還

4、應注意: (1) 在“public:”或“private:”后面成員都是公有或私有的,直到下一個“public:”或“private:”出現為止。 (2)關鍵字public和private在類中出現多次,前后的順序沒有關系。 (3)除了public和private外,關鍵字protected也可修飾成員的類型。 (4)數據成員的類型可以是任意的,包含整型、浮點型、字符型、數組、指針等。 (5)將類單獨存放在一個文件中或將類的聲明放在.h文件中而將成員函數的實現放在與.h文件同名的.cpp文件中。 成員函數的定義:可以直接寫在類中(適合于函數成員函數的定義:可以直接寫在類中(適合于函數體較小時)

5、,也可以在類定義中只給出函數原型,將函體較小時),也可以在類定義中只給出函數原型,將函數定義寫在類定義之外。一般格式為:數定義寫在類定義之外。一般格式為:返回值類型返回值類型 類名類名:成員函數名(形參表)成員函數名(形參表) 函數體;函數體; 成員函數的定義成員函數的定義: 作用域運算符,表示作用域運算符,表示該成員函數歸某類所該成員函數歸某類所有有inline成員函數成員函數 在類體中定義的成員函數的規(guī)模一般都很小,為了減少函在類體中定義的成員函數的規(guī)模一般都很小,為了減少函數調用的時間開銷,數調用的時間開銷,C+系統(tǒng)會自動將它們作為內聯系統(tǒng)會自動將它們作為內聯(inline)函數來處理函

6、數來處理,即把函數代碼嵌入程序的調用點。,即把函數代碼嵌入程序的調用點。 當類的成員函數規(guī)模很小,且不含有復雜的數據類型和語當類的成員函數規(guī)模很小,且不含有復雜的數據類型和語句,對類內定義的成員函數,可以省略句,對類內定義的成員函數,可以省略inline,因為這些成員函,因為這些成員函數已被隱含地指定為內聯函數。數已被隱含地指定為內聯函數。類的定義類的定義含成員函數的定義含成員函數的定義class CStuScore public: string m_strName; / 姓名姓名 string m_strStuNO; / 學號學號 void SetScore(float s0, float

7、s1,float s2) /在類中定義函數在類中定義函數 m_fScore0 = s0; m_fScore1 = s1; m_fScore2 = s2; float GetAverage();private: float m_fScore3; ; float CStuScore:GetAverage() /在類體外定義函數在類體外定義函數 return (float)(m_fScore0 + m_fScore1 + m_fScore2)/3.0); 對象的定義與成員訪問對象的定義與成員訪問 在程序中經常需要訪問對象中的成員。訪問對象在程序中經常需要訪問對象中的成員。訪問對象中的成員可以有中的成

8、員可以有3種方法:種方法: 通過通過對象名和成員運算符對象名和成員運算符訪問對象中的成員訪問對象中的成員; 通過通過指向對象的指針指向對象的指針訪問對象中的成員訪問對象中的成員; 通過通過對象的引用對象的引用變量訪問對象中的成員。變量訪問對象中的成員。1、對象的定義格式、對象的定義格式對象是類的實例,用類定義對象的一般格式為:對象是類的實例,用類定義對象的一般格式為:類名類名 對象名;對象名; 如如: CStuScore stuScore;2、對象成員的訪問、對象成員的訪問 對象名對象名.成員名成員名 如:如: stuScore.GetAverage(); 通過對象名和成員運算符訪問對象中的成

9、員通過對象名和成員運算符訪問對象中的成員通過指向對象的指針訪問對象中的成員通過指向對象的指針訪問對象中的成員1、對象指針的定義格式、對象指針的定義格式 類名類名 *對象指針名;對象指針名;如:如: CStuScore * pScore;2、對象成員的訪問、對象成員的訪問 對象指針名對象指針名-成員名成員名 或者或者 (*對象指針名對象指針名).成員名成員名 (對象指針必須指向某個已知對象)(對象指針必須指向某個已知對象) 如:如: CStuScore stuScore; pScore=&stuScore; pScore- GetAverage(); (*pScore). GetAverage(

10、);通過對象的引用變量來訪問對象中的成員通過對象的引用變量來訪問對象中的成員CStuScore stuScore;CStuScore &re_stuScore=stuScore;re_stuScore. GetAverage();注意:一個對象定義了一個引用變量,它們是共占同一段注意:一個對象定義了一個引用變量,它們是共占同一段存儲單元的,實際上它們是同一個對象,只是用不同的名存儲單元的,實際上它們是同一個對象,只是用不同的名字表示而已字表示而已#include #include using namespace std;class CStuScore public: string m_strN

11、ame; string m_strStuNO; void SetScore(float s0, float s1,float s2) m_fScore0 = s0; m_fScore1 = s1; m_fScore2 = s2; float GetAverage(); private: float m_fScore3; ; float CStuScore:GetAverage() return (float)(m_fScore0 + m_fScore1 + m_fScore2)/3.0); void main() CStuScore stuScore1,stuScore2,*pScore; p

12、Score=&stuScore1; CStuScore &reScore=stuScore2; pScore- SetScore(80,100,90); reScore.SetScore(90,100,95); coutstuScore1的平均分是:的平均分是:GetAverage()endl; coutstuScore2的平均分是:的平均分是:reScore.GetAverage()m_fScore0 = s0; this-m_fScore1 = s1; this-m_fScore2 = s2; reScore.SetScore(90,100,95);被編譯為:被編譯為:CStuScore

13、:SetScore(90,100,95, (CStuScore*)&reScore);此時此時 :this指向指向reScore首地址首地址(1)作用域運算符的功能是作用域運算符的功能是 A. 標示作用域的級別標示作用域的級別 B.指出作用域的范圍指出作用域的范圍 C. 給定作用域的大小給定作用域的大小 D.標識某個成員是屬于哪個類的標識某個成員是屬于哪個類的(2)下列說法中不正確的是下列說法中不正確的是A. 在類中,成員的默認訪問權限是私有在類中,成員的默認訪問權限是私有(private)的的;B. 類封裝了數據和操作類封裝了數據和操作;C. 類中數據類型可以是任意的;類中數據類型可以是任意

14、的;D. 在類的定義中必須包含在類的定義中必須包含private、public、protected三部分三部分DD概念鞏固概念鞏固(3)以下說法不正確的是:)以下說法不正確的是:A. 程序中可以定義指向某個類的對象的指針變量;程序中可以定義指向某個類的對象的指針變量;B. 類中的數據成員不能為指針類型;類中的數據成員不能為指針類型;C.成員函數必須在類體外定義成員函數必須在類體外定義 D. 當使用指針變量訪問類的成員時,必須先使指針變量指向該當使用指針變量訪問類的成員時,必須先使指針變量指向該 類的某個對象。類的某個對象。 (4) 下列說法不正確的是下列說法不正確的是 A.要在類的外部直接使用

15、類中的私有成員是錯誤的;要在類的外部直接使用類中的私有成員是錯誤的; B. 類的公有成員函數是類與外界的接口;類的公有成員函數是類與外界的接口; C. 在類的定義體中,決定成員訪問權的符號在類的定義體中,決定成員訪問權的符號private、public 和和protected在類體內出現的次序是一定的,且只能出現一次在類體內出現的次序是一定的,且只能出現一次; D. 類的封裝機制實現了數據隱藏。類的封裝機制實現了數據隱藏。BCC (5)下列說法中不正確的是:下列說法中不正確的是: A . 同一個類的兩個對象占用相同的內存空間;同一個類的兩個對象占用相同的內存空間; B .在類中不能對所定義的數

16、據成員進行初始化;在類中不能對所定義的數據成員進行初始化; C . 一個對象數組中的所有數組元素屬于同一個類;一個對象數組中的所有數組元素屬于同一個類; D . 當在類的外部定義成員函數時,必須在函數名前加上當在類的外部定義成員函數時,必須在函數名前加上 類名和類名和 作用域運算符作用域運算符“:”。 (6)下列說法中不正確的是下列說法中不正確的是 A. 對象是類的一個實例對象是類的一個實例 B. 任何一個對象必屬于某個類任何一個對象必屬于某個類 C. 一個類只能有一個對象一個類只能有一個對象 D. 類與對象間的關系,和數據類型與變量間的關系類似。類與對象間的關系,和數據類型與變量間的關系類似

17、。AC對象的初始化和釋放對象的初始化和釋放思考:思考:1、為什么要初始化?、為什么要初始化? 對象是一個實體,它反映了客觀事物的屬性,是應該有確對象是一個實體,它反映了客觀事物的屬性,是應該有確定的值。定的值。2、初始化的方式:、初始化的方式:注意:類的數據成員是不能在聲明注意:類的數據成員是不能在聲明 類時初始化的類時初始化的 1)若數據為公有成員)若數據為公有成員 可通過對象名、對象指針或引用在類外部直接賦初值。可通過對象名、對象指針或引用在類外部直接賦初值。 2)若數據為)若數據為private或或protected成員:成員: 可以通過調用成員函數賦初值可以通過調用成員函數賦初值 前兩

18、種存在的弊端:不希望在類外部賦初值,程序員很前兩種存在的弊端:不希望在類外部賦初值,程序員很可能忘記賦初值。可能忘記賦初值。 3)構造函數的好處)構造函數的好處 程序結構更清晰程序結構更清晰;專款專用:目的明確,專門對對象進行專款專用:目的明確,專門對對象進行初始化初始化;在對象第一次使用前初始化。在對象第一次使用前初始化。 構造函數(構造函數(constructor)1.與類同名與類同名,是類的一個特殊的是類的一個特殊的成員函數。成員函數。2.構造函數構造函數不能有返回值不能有返回值,因而因而不能指定包括不能指定包括void在內在內的任何返回值類型的任何返回值類型。3.當當使用該類定義對象使

19、用該類定義對象時,時,構造函數將構造函數將被系統(tǒng)自動調用被系統(tǒng)自動調用。class CStuScore public: CStuScore();void SetScore(.) ;float GetAverage(); ; class CStuScore public: CStuScore() m_strName=; m_strStuNO=; stringm_strName;/ 姓名姓名stringm_strStuNO; / 學號學號;帶參數的構造函數帶參數的構造函數class CStuScore public:CStuScore(string name) / 第一個構造函數第一個構造函數 m

20、_strName=name; CStuScore(string name, string NO) / 第二個構造函數第二個構造函數 m_strName=name; m_strStuNO=NO; string m_strName; string m_strStuNO; .;class CStuScore public: /利用默認參數的構造函數,簡化類定義利用默認參數的構造函數,簡化類定義 CStuScore(string name=, string NO=11111111) m_rName=name; m_strStuNO=NO; string m_strName; string m_strS

21、tuNO;.;用參數初始化表對數據成員初始化CStuScore(string name=, string NO=11111111) m_strName=name; m_strStuNO=NO; 等價于:等價于:CStuScore(string name=, string NO=11111111) :m_strName(name),m_strStuNO(NO) #include #include using namespace std;class CStuScore public: CStuScore(string name=student, string NO=11111111) m_strN

22、ame=name; m_strStuNO=NO; void SetScore(float s0, float s1,float s2); / 設置三門課成績設置三門課成績 float GetAverage();public: string m_strName; string m_strStuNO; private: / 私有類型聲明私有類型聲明 float m_fScore3; / 三門課程成績三門課程成績 ;Ex1.h文件文件#include Ex1.hvoid CStuScore:SetScore(float s0, float s1,float s2) / 設置三門課成績設置三門課成績

23、m_fScore0 = s0; m_fScore1 = s1; m_fScore2 = s2; float CStuScore:GetAverage() return (float)(m_fScore0 + m_fScore1 +m_fScore2)/3.0); void main() CStuScore Score1(LiMing, 21020501); Score1.SetScore(80,90,70); CStuScore Score2(zhangxiao); Score2.SetScore(99,90,85); coutScore1.m_strName 平均成績平均成績Score1.G

24、etAverage()endl; coutScore2.m_strName 平均成績平均成績Score2.GetAverage()endl;Ex1.cpp文件文件默認構造函數默認構造函數(default constructor) 默認構造函數是指不需要用戶指定實參就能夠被調用的構默認構造函數是指不需要用戶指定實參就能夠被調用的構造函數。一個類只能有一個默認構造函數。造函數。一個類只能有一個默認構造函數。 CStuScore() /第一種類型第一種類型 CStuScore() m_strName=; CStuScore(string name= , string NO=11111111) 默認函

25、數可由用戶定義。如果在一個類體中,用戶沒有定默認函數可由用戶定義。如果在一個類體中,用戶沒有定義任何構造函數,系統(tǒng)會自動創(chuàng)建一個隱式默認構造函數(結義任何構造函數,系統(tǒng)會自動創(chuàng)建一個隱式默認構造函數(結構如第一種類型),僅是對象創(chuàng)建語法需要。構如第一種類型),僅是對象創(chuàng)建語法需要??截悩嬙旌瘮悼截悩嬙旌瘮?、同類對象賦值、同類對象賦值 對象名對象名1 =對象名對象名2; 用一個類對象初始化該類的另一個對象被稱為缺省按成用一個類對象初始化該類的另一個對象被稱為缺省按成員初始化員初始化(default memberwise initialization)。 在概念上一個類對象向該類的另一個對象作拷

26、貝是通過依在概念上一個類對象向該類的另一個對象作拷貝是通過依次拷貝每個非靜態(tài)數據成員來實現的。次拷貝每個非靜態(tài)數據成員來實現的。void main() CStuScore Score1(LiMing, 21020501); Score1.SetScore(80,90,70); CStuScore Score2=Score1; coutScore1.m_strStuNO 的平均成績?yōu)榈钠骄煽優(yōu)镾core1.GetAverage()endl; coutScore2.m_strStuNO 的平均成績?yōu)榈钠骄煽優(yōu)镾core2.GetAverage()endl;2021020501的平均成績?yōu)榈钠骄?/p>

27、成績?yōu)?021020501的平均成績?yōu)榈钠骄煽優(yōu)?0同類對象賦值的探討同類對象賦值的探討 缺省按成員的初始化對于類的正確行為常常是不合適的缺省按成員的初始化對于類的正確行為常常是不合適的 如上例如兩個對象有相同的學號如上例如兩個對象有相同的學號 解決的方法:解決的方法: 拷貝構造函數拷貝構造函數 通過定義拷貝構造函數的顯式實例我們可以改變缺省的行為通過定義拷貝構造函數的顯式實例我們可以改變缺省的行為 拷貝構造函數定義的一般形式:拷貝構造函數定義的一般形式: 類名(類名(const 類名類名 &對象)對象) 調用時的一般形式:調用時的一般形式: 類名類名 對象對象2(對象(對象1););CSt

28、uScore(const CStuScore & score) for(int i=0;i3;i+) m_fScorei=score.m_fScorei; void main() CStuScore Score1(LiMing, 21020501); Score1.SetScore(80,90,65); CStuScore Score2(Score1); coutScore1.m_strStuNO Score1.GetAverage()endl; coutScore2.m_strStuNO Score2.GetAverage()endl; 析構函數析構函數 析構函數也要與相應的類同名,并在名稱

29、前面加上析構函數也要與相應的類同名,并在名稱前面加上一個一個“”符號。符號。class CStuScorepublic:. CStuScore ( ) / 析構函數析構函數. 析構函數只有在兩種情況下才會被自動調用:析構函數只有在兩種情況下才會被自動調用: (1) 當對象定義在一個函數體中,該函數調用結束后,當對象定義在一個函數體中,該函數調用結束后,析構函數被自動調用。析構函數被自動調用。 (2) 用用new為對象分配動態(tài)內存后,當使用為對象分配動態(tài)內存后,當使用delete釋放釋放對象時,析構函數被自動調用。對象時,析構函數被自動調用。 注意:它不返回任何值也沒有任何參數注意:它不返回任何

30、值也沒有任何參數所以它也不能被重載。所以它也不能被重載。調用構造函數和析構函數的順序調用構造函數和析構函數的順序注意:調用構造函數和析構函數的順序剛好是相反的注意:調用構造函數和析構函數的順序剛好是相反的對象數組對象數組定義一般格式:類名定義一般格式:類名 對象名對象名 ; 如:如:CStuScore Score100; /調用默認構造函數調用默認構造函數 在建立數組時,同樣要調用構造函數在建立數組時,同樣要調用構造函數。如果有。如果有100個元素,個元素,需要調用需要調用100次構造函數。次構造函數。析構函數析構函數負責數空間的釋放和回收。負責數空間的釋放和回收。 下列調用帶參數的構造函數下

31、列調用帶參數的構造函數: CStuScore Score3=CStuScore(王一王一,2011001), CStuScore(李二李二,2011002), CStuScore(張三張三,2011003) ; 對象數組對象數組CStuScore Score3= CStuScore(王一王一,2011001), CStuScore(李二李二,2011002), ; 調用調用默認構造函數默認構造函數對象數組對象數組void main()CStuScore Score3= CStuScore(王一王一,2011001), CStuScore(李二李二,2011002), CStuScore(張三張

32、三,2011003); for(int i=0;i3;i+) Scorei.SetScore(100,100,100); coutScorei.m_strNameScorei.m_strStuNOendl; 動態(tài)分配對象動態(tài)分配對象 CStuScore *pScore=new CStuScore;CStuScore *pScore=new CStuScore(張三張三, 21020502); 兩種都是動態(tài)分配對象,并自動調用構造函數對其初始兩種都是動態(tài)分配對象,并自動調用構造函數對其初始化。第一種要求默認構造函數,第二種要求帶參數的構造函化。第一種要求默認構造函數,第二種要求帶參數的構造函數。

33、數。創(chuàng)建堆對象時,先分配空間,然后調用對象的構造函數;創(chuàng)建堆對象時,先分配空間,然后調用對象的構造函數;刪除堆對象時,先調用對象的析構函數,然后回收空間。刪除堆對象時,先調用對象的析構函數,然后回收空間。#include #include using namespace std;class CStuScore public: CStuScore(string name=, string NO=11111111) m_strName=name; m_strStuNO=NO; void SetScore(float s0, float s1,float s2); / 設置三門課成績設置三門課成績

34、float GetAverage();public: string m_strName; string m_strStuNO; private: / 私有類型聲明私有類型聲明 float m_fScore3; / 三門課程成績三門課程成績 ;Ex1.h文件文件#include Ex1.h void CStuScore:SetScore(float s0, float s1,float s2) / 設置三門課成績設置三門課成績 m_fScore0 = s0; m_fScore1 = s1; m_fScore2 = s2; float CStuScore:GetAverage() return (

35、float)(m_fScore0 + m_fScore1 + m_fScore2)/3.0); void main() CStuScore *pScore=new CStuScore(張三張三, 21020502); if(NULL!=pScore) pScore-SetScore(80,95,90); coutm_strStuNO 的平均成績?yōu)榈钠骄煽優(yōu)镚etAverage()endl; delete pScore; pScore=NULL; Ex1.cpp文件文件#include #include using namespace std;class CStuScore public: CStuScore(string name=, string NO=11111111) m_strName=new string(name); m_strStuNO=new string(NO); CStuScore() if(NULL!=m_strName)

溫馨提示

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

最新文檔

評論

0/150

提交評論