版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第四章 類與對象C+語言程序設計東華理工大學信息工程學院2本章主要內(nèi)容面向?qū)ο蟮乃枷隣OP的基本特點類概念和聲明對象構(gòu)造函數(shù)析構(gòu)函數(shù)內(nèi)聯(lián)成員函數(shù)拷貝構(gòu)造函數(shù)類的組合結(jié)構(gòu)體與聯(lián)合體深度探索3回顧:面向過程的設計方法重點:如何實現(xiàn)的細節(jié)和過程,將數(shù)據(jù)與函數(shù)分開。形式:主模塊+若干個子模塊(main()+子函數(shù))。特點:自頂向下,逐步求精功能分解。缺點:效率低,程序的可重用性差。面向?qū)ο蟮乃枷?面向?qū)ο蟮姆椒康模簩崿F(xiàn)軟件設計的產(chǎn)業(yè)化。觀點:自然界是由實體(對象)所組成。程序設計方法:使用面向?qū)ο蟮挠^點來描述模仿并處理現(xiàn)實問題。要求:高度概括、分類、和抽象。面向?qū)ο蟮乃枷?抽象抽象是對具體對象(問題
2、)進行概括,抽出這一類對象的公共性質(zhì)并加以描述的過程。先注意問題的本質(zhì)及描述,其次是實現(xiàn)過程或細節(jié)。數(shù)據(jù)抽象:描述某類對象的屬性或狀態(tài)(對象相互區(qū)別的物理量)。代碼抽象:描述某類對象的共有的行為特征或具有的功能。抽象的實現(xiàn):通過類的聲明。OOP的基本特點6抽象實例鐘表數(shù)據(jù)抽象:int hour,int minute,int second代碼抽象:setTime(),showTime()OOP的基本特點7抽象實例鐘表類class Clock public: void setTime(int newH, int newM, int newS); void showTime(); private:
3、int hour, minute, second;OOP的基本特點8抽象實例人數(shù)據(jù)抽象:string name,string gender,int age,int id代碼抽象:生物屬性角度:getCloth(), eat(), step(),社會屬性角度:work(), promote() ,OOP的基本特點9封裝將抽象出的數(shù)據(jù)成員、代碼成員相結(jié)合,將它們視為一個整體。目的是曾強安全性和簡化編程,使用者不必了解具體的實現(xiàn)細節(jié),而只需要通過外部接口,以特定的訪問權(quán)限,來使用類的成員。實現(xiàn)封裝:類聲明中的OOP的基本特點10封裝實例:class Clock public:void setTime
4、(int newH, int newM, int newS); void showTime(); private: int hour, minute, second;邊界特定的訪問權(quán)限OOP的基本特點外部接口11繼承與派生是C+中支持層次分類的一種機制,允許程序員在保持原有類特性的基礎(chǔ)上,進行更具體的說明。實現(xiàn):聲明派生類見第7章OOP的基本特點12多態(tài)性多態(tài):同一名稱,不同的功能實現(xiàn)方式。目的:達到行為標識統(tǒng)一,減少程序中標識符的個數(shù)。實現(xiàn):重載函數(shù)和虛函數(shù)見第8章OOP的基本特點13c+中的類類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性
5、和行為兩個主要部分。利用類可以實現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。利用類易于編寫大型復雜程序,其模塊化程度比C中采用函數(shù)更高。類 和 對 象14類的聲明形式 類是一種用戶自定義類型,聲明形式:class 類名稱 public: 公有成員(外部接口) private: 私有成員 protected: 保護型成員類 和 對 象15公有類型成員在關(guān)鍵字public后面聲明,它們是類與外部的接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。類 和 對 象16私有類型成員在關(guān)鍵字private后面聲明,只允許本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。如果緊跟在類名稱的后面聲明私有成員,則關(guān)鍵字priv
6、ate可以省略。類 和 對 象17保護類型與private類似,其差別表現(xiàn)在繼承與派生時對派生類的影響不同,第七章講。類 和 對 象18類的成員class clock public: void setTime(int newH, int newM, int newS); void showTime(); private: int hour, hinute, second;類 和 對 象成員數(shù)據(jù)成員函數(shù)void Clock:setTime(int newH, int newM,int newS) hour = newH; minute = newM; second = newS;void Clo
7、ck:showTime() cout hour : minute : second;1920成員數(shù)據(jù)與一般的變量聲明相同,但需要將它放在類的聲明體中。類 和 對 象21成員函數(shù)在類中說明原型,可以在類外給出函數(shù)體實現(xiàn),并在函數(shù)名前使用類名加以限定。也可以直接在類中給出函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。允許聲明重載函數(shù)和帶默認形參值的函數(shù)類 和 對 象22內(nèi)聯(lián)成員函數(shù)為了提高運行時的效率,對于較簡單的函數(shù)可以聲明為內(nèi)聯(lián)形式。內(nèi)聯(lián)函數(shù)體中不要有復雜結(jié)構(gòu)(如循環(huán)語句和switch語句)。在類中聲明內(nèi)聯(lián)成員函數(shù)的方式:將函數(shù)體放在類的聲明中。使用inline關(guān)鍵字。類 和 對 象23內(nèi)聯(lián)成員函數(shù)舉例(一)cl
8、ass Point public: void init(int initX, int initY) x = initX; y = initY; int getX() return x; int getY() return y; private: int x, y;類 和 對 象24內(nèi)聯(lián)成員函數(shù)舉例(二)class Point public: void init(int initX, int initY); int getX(); int getY(); private: int x, y;類 和 對 象inline void Point: init(int initX,int initY) x
9、 = initX; y = initY;inline int Point:getX() return x;inline int Point:GetY() return y;2526對象類的對象是該類的某一特定實體,即類類型的變量。聲明形式: 類名 對象名;例: Clock myClock;類 和 對 象27類中成員的訪問方式類中成員互訪直接使用成員名類外訪問使用“對象名.成員名”方式訪問 public 屬性的成員類 和 對 象28例4-1類的應用舉例#includeusing namespace std;class Clock ./類的聲明略/.類的實現(xiàn)略int main() Clock my
10、Clock;myClock.setTime(8, 30, 30);myClock.showTime();return 0;類 和 對 象29構(gòu)造函數(shù)構(gòu)造函數(shù)的作用是在對象被創(chuàng)建時使用特定的值構(gòu)造對象,或者說將對象初始化為一個特定的狀態(tài)。在對象創(chuàng)建時由系統(tǒng)自動調(diào)用。如果程序中未聲明,則系統(tǒng)自動產(chǎn)生出一個隱含的參數(shù)列表為空的構(gòu)造函數(shù)允許為內(nèi)聯(lián)函數(shù)、重載函數(shù)、帶默認形參值的函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)30構(gòu)造函數(shù)舉例class Clock public:Clock(int newH,int newM,int newS);/構(gòu)造函數(shù)void setTime(int newH, int newM, int n
11、ewS);void showTime();private:int hour, minute, second;構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)的實現(xiàn):Clock:Clock(int newH, int newM, int newS) hour = newH;minute = newM;second = newS;建立對象時構(gòu)造函數(shù)的作用:int main() Clock c(0,0,0); /隱含調(diào)用構(gòu)造函數(shù),將初始值作為實參。 c.showTime();return 0;3132拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類的對象引用。class 類名 public : 類名(形參);/
12、構(gòu)造函數(shù) 類名(類名 &對象名);/拷貝構(gòu)造函數(shù) .;類名:類(類名 &對象名)/拷貝構(gòu)造函數(shù)的實現(xiàn) 函數(shù)體 構(gòu)造函數(shù)和析構(gòu)函數(shù)33拷貝構(gòu)造函數(shù)(例4-2)class Point public:Point(int xx=0, int yy=0) x = xx; y = yy; Point(Point& p);int getX() return x; int getY() return y; private:int x, y;構(gòu)造函數(shù)和析構(gòu)函數(shù)Point:Point (Point& p) x = p.x; y = p.y; cout Calling the copy constructor en
13、dl;3435拷貝構(gòu)造函數(shù)(例4-2)當用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)實現(xiàn)拷貝賦值。int main() Point a(1,2); Point b = a; /拷貝構(gòu)造函數(shù)被調(diào)用 cout b.getX() endl;構(gòu)造函數(shù)和析構(gòu)函數(shù)36拷貝構(gòu)造函數(shù)(例4-2)若函數(shù)的形參為類對象,調(diào)用函數(shù)時,實參賦值給形參,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)。例如:void fun1(Point p) cout p.getX() endl; int main() Point a(1, 2); fun1(a); /調(diào)用拷貝構(gòu)造函數(shù) return 0; 構(gòu)造函數(shù)和析構(gòu)函數(shù)37拷貝構(gòu)造
14、函數(shù)(例4-2)當函數(shù)的返回值是類對象時,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)。例如:Point fun2() Point a(1, 2); return a; /調(diào)用拷貝構(gòu)造函數(shù)int main() Point b; b = fun2(); return 0; 構(gòu)造函數(shù)和析構(gòu)函數(shù)38隱含的拷貝構(gòu)造函數(shù)如果程序員沒有為類聲明拷貝初始化構(gòu)造函數(shù),則編譯器自己生成一個隱含的拷貝構(gòu)造函數(shù)。這個構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的對象的每個數(shù)據(jù)成員的值,初始化將要建立的對象的對應數(shù)據(jù)成員。構(gòu)造函數(shù)和析構(gòu)函數(shù)39析構(gòu)函數(shù)完成對象被刪除前的一些清理工作。在對象的生存期結(jié)束的時刻系統(tǒng)自動調(diào)用它,然后再釋放此對象所屬的空
15、間。如果程序中未聲明析構(gòu)函數(shù),編譯器將自動產(chǎn)生一個隱含的析構(gòu)函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)40構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例#include using namespace std;class Point public: Point(int xx,int yy); Point(); /.其他函數(shù)原型private: int x, y;構(gòu)造函數(shù)和析構(gòu)函數(shù)Point:Point(int xx,int yy) x = xx; y = yy;Point:Point() /.其他函數(shù)的實現(xiàn)略4142類的應用舉例(例4-3)一圓形游泳池如圖所示,現(xiàn)在需在其周圍建一圓形過道,并在其四周圍上柵欄。柵欄價格為35元/米,過道
16、造價為20元/平方米。過道寬度為3米,游泳池半徑由鍵盤輸入。要求編程計算并輸出過道和柵欄的造價。游泳池過道#include using namespace std;const float PI = 3.141593;/給出p的值const float FENCE_PRICE = 35;/柵欄的單價const float CONCRETE_PRICE = 20;/過道水泥單價class Circle /聲明定義類Circle 及其數(shù)據(jù)和方法public:/外部接口Circle(float r);/構(gòu)造函數(shù)float circumference();/計算圓的周長float area();/計算圓
17、的面積private:/私有數(shù)據(jù)成員float radius;/圓半徑;43/類的實現(xiàn)/構(gòu)造函數(shù)初始化數(shù)據(jù)成員radiusCircle:Circle(float r) radius = r;/計算圓的周長float Circle:circumference() return 2 * PI * radius;/計算圓的面積float Circle:area() return PI * radius * radius;44int main () float radius;cout radius;Circle pool(radius);/游泳池邊界Circle poolRim(radius + 3)
18、;/柵欄 /計算柵欄造價并輸出 float fenceCost = poolRim.circumference() * FENCE_PRICE; cout Fencing Cost is $ fenceCost endl;45/計算過道造價并輸出float concreteCost = (poolRim.area() - pool.area() * CONCRETE_PRICE;cout Concrete Cost is $ concreteCost endl;return 0;運行結(jié)果Enter the radius of the pool: 10Fencing Cost is $2858.
19、85Concrete Cost is $4335.44647組合的概念類中的成員數(shù)據(jù)是另一個類的對象??梢栽谝延谐橄蟮幕A(chǔ)上實現(xiàn)更復雜的抽象。類 的 組 合48舉例class Point private: float x, y; /點的坐標public: Point(float h, float v); /構(gòu)造函數(shù) float getX(); /取X坐標 float getY(); /取Y坐標 void draw(); /在(x,y)處畫點;/.函數(shù)的實現(xiàn)略類 的 組 合class Line private: Point p1, p2; /線段的兩個端點public: Line(Point a
20、, Point b); /構(gòu)造函數(shù) void draw(void); /畫出線段;/.函數(shù)的實現(xiàn)略4950類組合的構(gòu)造函數(shù)設計原則:不僅要負責對本類中的基本類型成員數(shù)據(jù)賦初值,也要對對象成員初始化。聲明形式:類名:類名(對象成員所需的形參,本類成員形參) :對象1(參數(shù)),對象2(參數(shù)),. 本類初始化 類 的 組 合51類組合的構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)調(diào)用順序:先調(diào)用內(nèi)嵌對象的構(gòu)造函數(shù)(按內(nèi)嵌時的聲明順序,先聲明者先構(gòu)造)。然后調(diào)用本類的構(gòu)造函數(shù)。(析構(gòu)函數(shù)的調(diào)用順序相反)初始化列表中未出現(xiàn)的內(nèi)嵌對象,用默認構(gòu)造函數(shù)(即無形參的)初始化系統(tǒng)自動生成的隱含的默認構(gòu)造函數(shù)中,內(nèi)嵌對象全部用默認構(gòu)造函
21、數(shù)初始化類 的 組 合52類的組合舉例(二)class Part /部件類public: Part(); Part(int i); Part(); void Print();private: int val;類 的 組 合class Whole public: Whole(); Whole(int i, int j, int k); Whole(); void Print();private: Part one; Part two; int date;53Whole:Whole() date=0;Whole:Whole(int i, int j, int k) : two(i), one(j)
22、, date(k)/.其他函數(shù)的實現(xiàn)略5455前向引用聲明類應該先聲明,后使用如果需要在某個類的聲明之前,引用該類,則應進行前向引用聲明。前向引用聲明只為程序引入一個標識符,但具體聲明在其他地方。類 的 組 合56前向引用聲明舉例class B; /前向引用聲明class A public: void f(B b);class B public: void g(A a);類 的 組 合57前向引用聲明注意事項使用前向引用聲明雖然可以解決一些問題,但它并不是萬能的。需要注意的是,盡管使用了前向引用聲明,但是在提供一個完整的類聲明之前,不能聲明該類的對象,也不能在內(nèi)聯(lián)成員函數(shù)中使用該類的對象。請看
23、下面的程序段:class Fred; /前向引用聲明class Barney Fred x; /錯誤:類Fred的聲明尚不完善;class Fred Barney y;類 的 組 合58前向引用聲明注意事項class Fred;/前向引用聲明 class Barney public: void method() x.yabbaDabbaDo();/錯誤:Fred類的對象在定義之前被使用 private: Fred &x;/正確,經(jīng)過前向引用聲明,可以聲明Fred類的對象引用; class Fred public: void yabbaDabbaDo();private: Barney &y;
24、類 的 組 合59前向引用聲明注意事項應該記?。寒斈闶褂们跋蛞寐暶鲿r,你只能使用被聲明的符號,而不能涉及類的任何細節(jié)。類 的 組 合60UML簡介UML語言是一種可視化的的面向?qū)ο蠼UZ言。UML有三個基本的部分事物(Things)UML中重要的組成部分,在模型中屬于最靜態(tài)的部分,代表概念上的或物理上的元素關(guān)系(Relationships)關(guān)系把事物緊密聯(lián)系在一起圖(Diagrams)圖是很多有相互相關(guān)的事物的組UML圖形標識61UML中有4種類型的事物結(jié)構(gòu)事物(Structural things)動作事物(Behavioral things)分組事物(Grouping things)注釋事
25、物(Annotational things)UML圖形標識62UML中的關(guān)系依賴(Dependencies) 關(guān)聯(lián)(Association) 泛化(Generalization) 實現(xiàn)(Realization)UML圖形標識63UML中的9種圖類圖(Class diagram)對象圖(Object diagram)用例圖(Use case diagram)順序圖(Sequence diagram)協(xié)作圖(Collaboration diagram)狀態(tài)圖(Statechart diagram)活動圖(Activity diagram)組件圖(Component diagram)實施圖(Depl
26、oyment diagram)UML圖形標識64類圖舉例:Clock類的完整表示Clock類的簡潔表示Clock- hour : int- minute : int- second : int+ showTime() : void+ setTime(newH:int=0,newM:int=0,newS:int=0):voidClockUML圖形標識65對象圖myClock : Clock- hour : int- minute : int- second : intmyClock : ClockUML圖形標識66類與對象關(guān)系的圖形標識依賴關(guān)系圖中的“類A”是源,“類B”是目標,表示“類A”使用
27、了“類B”,或稱“類A”依賴“類B”類 A類 BUML圖形標識67類與對象關(guān)系的圖形標識作用關(guān)系關(guān)聯(lián)圖中的“重數(shù)A”決定了類B的每個對象與類A的多少個對象發(fā)生作用,同樣“重數(shù)B”決定了類A的每個對象與類B的多少個對象發(fā)生作用。類 A重數(shù)A類 B重數(shù)BUML圖形標識68類與對象關(guān)系的圖形標識包含關(guān)系聚集和組合類 A類 B重數(shù)A重數(shù)B類 A類 B重數(shù)A重數(shù)B聚集表示類之間的關(guān)系是整體與部分的關(guān)系,“包含”、“組成”、“分為部分”等都是聚集關(guān)系。UML圖形標識69類與對象關(guān)系的圖形標識繼承關(guān)系泛化父類 A父類 B子類 1子類 2UML圖形標識70注釋在UML圖形上,注釋表示為帶有褶角的矩形,然后用虛
28、線連接到UML的其他元素上,它是一種用于在圖中附加文字注釋的機制。注釋文字UML圖形標識結(jié)構(gòu)體結(jié)構(gòu)體是一種特殊形態(tài)的類與類的唯一區(qū)別:類的缺省訪問權(quán)限是private,結(jié)構(gòu)體的缺省訪問權(quán)限是public結(jié)構(gòu)體存在的主要原因:與C語言保持兼容什么時候用結(jié)構(gòu)體而不用類定義主要用來保存數(shù)據(jù)、而沒有什么操作的類型人們習慣將結(jié)構(gòu)體的數(shù)據(jù)成員設為公有,因此這時用結(jié)構(gòu)體更方便71結(jié)構(gòu)體與聯(lián)合體結(jié)構(gòu)體的定義和初始化結(jié)構(gòu)體定義struct 結(jié)構(gòu)體名稱 公有成員protected: 保護型成員private: 私有成員;一些結(jié)構(gòu)體變量的初始化可以用以下形式類型名 變量名 = 成員數(shù)據(jù)1初值, 成員數(shù)據(jù)2初值, ;
29、72結(jié)構(gòu)體與聯(lián)合體結(jié)構(gòu)體舉例(例4-7)#include #include #include using namespace std;struct Student /學生信息結(jié)構(gòu)體int num;/學號string name;/姓名,字符串對象,將在第6章詳細介紹char sex;/性別int age;/年齡;73結(jié)構(gòu)體與聯(lián)合體結(jié)構(gòu)體舉例(例4-7)int main() Student stu = 97001, Lin Lin, F, 19 ;cout Num: stu.num endl;cout Name: endl;cout Sex: stu.sex endl;cout Age: stu.
30、age endl;return 0;運行結(jié)果:Num: 97001Name: Lin LinSex: FAge: 1974結(jié)構(gòu)體與聯(lián)合體聯(lián)合體聲明形式union 聯(lián)合體名稱 公有成員protected: 保護型成員private: 私有成員;特點:成員共用相同的內(nèi)存單元任何兩個成員不會同時有效75結(jié)構(gòu)體與聯(lián)合體聯(lián)合體的內(nèi)存分配union Mark /表示成績的聯(lián)合體char grade;/等級制的成績bool pass;/只記是否通過課程的成績int percent;/百分制的成績;76Markgradepercentpass結(jié)構(gòu)體與聯(lián)合體77無名聯(lián)合無名聯(lián)合沒有標記名,只是聲明一個成員項的集
31、合,這些成員項具有相同的內(nèi)存地址,可以由成員項的名字直接訪問。例:union int i; float f;在程序中可以這樣使用:i = 10;f = 2.2;結(jié)構(gòu)體與聯(lián)合體聯(lián)合體舉例(例4-8)#include #include using namespace std;class ExamInfo private:string name;/課程名稱enum GRADE, PASS, PERCENTAGE mode;/采用何種計分方式union char grade;/等級制的成績bool pass;/只記是否通過課程的成績int percent;/百分制的成績;78結(jié)構(gòu)體與聯(lián)合體聯(lián)合體舉例(
32、例4-8)public:/三種構(gòu)造函數(shù),分別用等級、是否通過和百分初始化ExamInfo(string name, char grade): name(name), mode(GRADE), grade(grade) ExamInfo(string name, bool pass): name(name), mode(PASS), pass(pass) ExamInfo(string name, int percent): name(name), mode(PERCENTAGE), percent(percent) void show();79結(jié)構(gòu)體與聯(lián)合體聯(lián)合體舉例(例4-8)void Ex
33、amInfo:show() cout name : ;switch (mode) case GRADE: cout grade; break; case PASS: cout (pass ? PASS : FAIL); break; case PERCENTAGE: cout percent; break;cout endl;80結(jié)構(gòu)體與聯(lián)合體聯(lián)合體舉例(例4-8)int main() ExamInfo course1(English, B);ExamInfo course2(Calculus, true);ExamInfo course3(C+ Programming, 85);course
34、1.show();course2.show();course3.show();return 0;運行結(jié)果:English: BCalculus: PASSC+ Programming: 8581結(jié)構(gòu)體與聯(lián)合體位域位域的聲明形式 數(shù)據(jù)類型說明符 成員名 : 位數(shù);位域的作用通過“打包”,使類的不同成員共享相同的字節(jié),從而節(jié)省存儲空間。注意事項具體的打包方式,因編譯器而異;只有bool、char、int和枚舉類型的成員,允許定義為位域;節(jié)省空間,但可能增加時間開銷。82深 度 探 索例4-9設計一個結(jié)構(gòu)體存儲學生的成績信息,需要包括學號、年級和成績?nèi)梼?nèi)容,學號的范圍是0到99,999,999,年
35、級分為freshman、sophomore、junior、senior四種,成績包括A、B、C、D四個等級。83深 度 探 索例4-9#include using namespace std;enum Level FRESHMAN, SOPHOMORE, JUNIOR, SENIOR ;enum Grade A, B, C, D ;class Student public:Student(unsigned number, Level level, Grade grade): number(number), level(level), grade(grade) void show();priva
36、te:unsigned number : 27;Level level : 2;Grade grade : 2;84深 度 探 索例4-9void Student:show() cout Number: number endl;cout Level: ;switch (level) case FRESHMAN: cout freshman; break;case SOPHOMORE: cout sophomore; break;case JUNIOR: cout junior; break;case SENIOR: cout senior; break;cout endl;cout Grade
37、: ;switch (grade) case A: cout A; break;case B: cout B; break;case C: cout C; break;case D: cout D; break;cout endl;85深 度 探 索例4-9int main() Student s(12345678, SOPHOMORE, B);cout Size of Student: sizeof(Student) endl;s.show();return 0;運行結(jié)果:(運行結(jié)果第一行會因編譯環(huán)境的不同而有所差異)Size of Student: 4Number: 12345678Lev
38、el: sophomoreGrade: B86深 度 探 索臨時對象與類型轉(zhuǎn)換( 例4-2中Point構(gòu)造函數(shù):Point(int xx = 0, int yy = 0) )臨時對象的顯式創(chuàng)建可以直接調(diào)用類的構(gòu)造函數(shù)顯式創(chuàng)建臨時對象例:Line x(Point(1, 1), Point(4, 5);臨時對象到表達式執(zhí)行完畢后即銷毀單參數(shù)構(gòu)造函數(shù)可以設立類型轉(zhuǎn)換Point(1)表示創(chuàng)建一個臨時對象,同時也表示顯式類型轉(zhuǎn)換與Point(1)等價的形式:(Point) 1static_cast(1)無論形式為何,執(zhí)行轉(zhuǎn)換時都會創(chuàng)建臨時對象87深 度 探 索隱含轉(zhuǎn)換由構(gòu)造函數(shù)確立的類型轉(zhuǎn)換,可以隱含執(zhí)
39、行例:Line x(1, 4);效果:構(gòu)造以(1,0)和(4,0)兩坐標為端點的線段,這里Point的構(gòu)造函數(shù)被隱含調(diào)用避免隱含轉(zhuǎn)換的發(fā)生在構(gòu)造函數(shù)中使用explicit關(guān)鍵字,explicit要寫在類定義中的構(gòu)造函數(shù)前88深 度 探 索例4-10#include using namespace std;class Complex /復數(shù)類private: float real, imag;/復數(shù)的實部和虛部public: /構(gòu)造函數(shù),可以當作隱式類型轉(zhuǎn)換使用 Complex(float real = 0, float imag = 0) : real(real), imag(imag) Co
40、mplex add(Complex c) /復數(shù)加法,生成臨時對象并返回 return Complex(real + c.real, imag + c.imag); Complex sub(Complex c) /復數(shù)減法,生成臨時對象并返回 return Complex(real - c.real, imag - c.imag); Complex mul(Complex c) /復數(shù)乘法,生成臨時對象并返回 return Complex(real * c.real - imag * c.imag, real * c.imag + imag * c.real); 89深 度 探 索例4-10
41、void show() /顯示復數(shù) if (imag = 0) cout real + imag i endl; else cout real - -imag i endl; ;int main() Complex z(1, 2);/z = 1 + 2iz.add(Complex(3, 4).show(); /Complex(3, 4)是臨時對象static_cast(5).sub(z).show(); /輸出5 z,使用了顯示類型轉(zhuǎn)換z.mul(-3.0f).show(); /輸出z * (-3),使用了隱含類型轉(zhuǎn)換return 0;運行結(jié)果:4 + 6i4 - 2i-3 - 6i90深 度 探 索成員函數(shù)的調(diào)用成員函數(shù)調(diào)用的實現(xiàn)機制問題的關(guān)鍵:如何傳遞調(diào)用的目的對象解決辦法:把目的對象的引用當作參數(shù)傳遞91void Clock:setTime(int newH, int newM, int newS) hour = newH; minute
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度生物醫(yī)藥領(lǐng)域基因編輯技術(shù)研發(fā)合同3篇
- 2025年度物業(yè)服務合同管理與維護條款研究6篇
- 二零二五年度戶外廣告牌安全檢測與維護合同3篇
- 二零二五年度弱電工程環(huán)境保護合同2篇
- 2025年度旅行社旅游紀念品開發(fā)承包合同3篇
- 二零二五年度有限合伙基金代持協(xié)議書3篇
- 二零二五年度學生宿舍租賃協(xié)議范文2篇
- 海南醫(yī)學院《中醫(yī)文獻檢索》2023-2024學年第一學期期末試卷
- 軸套編程課程設計
- 軸流式葉輪課程設計
- 超星爾雅學習通《通航空與航天(復旦大學上海大學)》章節(jié)測試附答案
- 寒假學習計劃表
- 糖尿病酮癥酸中毒病例討論-文檔資料
- 電力建設安全工作規(guī)程解析(線路部分)課件
- 軟膠囊生產(chǎn)工藝流程
- 液相色譜質(zhì)譜質(zhì)譜儀LCMSMSSYSTEM
- 派克與永華互換表
- 宣傳廣告彩頁制作合同
- 【語法】小學英語語法大全
- 除濕機說明書
- 優(yōu)雅清新浪漫簡潔的PPT模板背景(免費)
評論
0/150
提交評論