版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
本章主要知識點
(1)
C++面向對象程序實例(2)
類與對象(3)
繼承與派生(4)
運算符重載本章導讀
C語言是一個結構化程序設計語言,它是面向過程,在處理較小規(guī)模程序時普通比較輕易實現,而當程序規(guī)模較大時,C語言就顯示出了它不足。在這種情況下C++應運而生,C++語言是從C語言演變而來,它保留了C語言全部優(yōu)點,同時也增加了面向對象功效?,F在C++已成為程序設計中應用最廣泛一個語言?!禖語言程序設計》
(VisualC++6.0環(huán)境)返回本書目錄第10章C++面向對象程序設計1/90第10章C++面向對象程序設計《C語言程序設計》
(VisualC++6.0環(huán)境)返回本章導讀10.2類與對象10.3繼承與派生10.5綜合實訓10.4運算符重載10.1
C++面向對象程序實例2/90《C語言程序設計》
(VisualC++6.0環(huán)境)返回本章目錄10.1.2C++語言概述10.1.1C++面向對象程序實例10.1C++面向對象程序實例3/9010.1.1C++面向對象程序實例《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄2.C++程序實例(2)3.C++程序實例(3)1.C++程序實例(1)4/90【例10.1】定義一個矩形類。(程序名為l10_1.cpp。)#include<iostream.h>classrectangle//定義一個矩形類{public:rectangle(floatlen,floatwid)//結構函數 {length=len; width=wid; } floatGetArea();//申明組員函數,計算矩形面積 floatGetPerimeter();//申明組員函數,計算矩形周長~rectangle(){}//析構函數private:floatlength;//私有數據 floatwidth;
};10.1.1C++面向對象程序實例《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄1.C++程序實例15/90floatrectangle::GetArea()//組員函數詳細實現{ returnlength*width;}floatrectangle::GetPerimeter()//組員函數詳細實現{ return2*(length+width);}voidmain(){floatl,w; cout<<"請輸入矩形長和寬:"; cin>>l>>w; rectanglex(l,w);//定義一個矩形類對象cout<<x.GetArea()<<endl; cout<<x.GetPerimeter()<<endl;//調用組員函數} 10.1.1C++面向對象程序實例《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄6/9010.1.1C++面向對象程序實例《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄實例1功效是定義一個矩形類,該類有長和寬兩個數據組員,用來描述矩形靜態(tài)特征(屬性),有結構函數用來用初始化類對象,另外還有計算面積和周長兩個組員函數作為該類外部接口,供類外程序訪問。當用戶輸入矩形長和寬之后,將結構一個實例矩形,并輸出矩形面積和周長。比如用戶輸入5,6<CR>,則輸出結果為:
30
227/90【例10.2】類派生。(程序名為l10_2.cpp。)#include<iostream.h>classrectangle//定義矩形類{public:voidInitRect(floatlen,floatwid)//定義類組員函數 {length=len; width=wid; } floatGetArea(); floatGetPerimeter();private://定義私有組員變量floatlength; floatwidth;};floatrectangle::GetArea()//組員函數實現{ returnlength*width;}10.1.1C++面向對象程序實例《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄2.C++程序實例28/90floatrectangle::GetPerimeter()//組員函數實現{ return2*(length+width);}classsquare:publicrectangle//從矩形類中派生新類(正方形類){public: voidInitSquare(floatb){InitRect(b,b);}//新增組員函數(初始化};//正方形)voidmain(){ squarex;//申明正方形類對象 x.InitSquare(8);//調用正方形類新增組員函數cout<<x.GetArea()<<endl;//調用從矩形類中繼承下來組員函數cout<<x.GetPerimeter()<<endl;//調用從矩形類中繼承下來組員}//函數(GetPerimeter)10.1.1C++面向對象程序實例《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄9/9010.1.1C++面向對象程序實例《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄實例2功效是先定義一個矩形類,然后從該矩形類中派生出一個新正方形類(正方形是矩形一個特例)。程序中先申明一個正方形類對象,然后將其初始化為邊長為8正方形,再調用從矩形類中繼承下來計算面積和周長兩個函數,計算出正方形面積和周長。該程序輸出結果為:64
3210/90【例10.3】“+”運算符重載。(程序名為l10_3.cpp。)#include<iostream.h>classrectangle//定義一個矩形類{public:rectangle(floatlen=0,floatwid=0)//結構函數 { length=len; width=wid; } floatGetArea(){returnlength*width;}//組員函數(計算面積) rectangleoperator+(rectanglea2)//將"+"運算符重載 {rectanglea;//用于兩個矩形對象相加 a.length=length; a.width=width+a2.GetArea()/length;returnrectangle(a.length,a.width); }10.1.1C++面向對象程序實例《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄3.C++程序實例311/90private://私有組員變量floatlength; floatwidth;};voidmain(){rectanglex(5,9),y(5,6),z;//申明類對象 cout<<"第一個矩形面積為:"<<x.GetArea()<<endl; cout<<"第二個矩形面積為:"<<y.GetArea()<<endl;z=x+y;//對兩個矩形相加cout<<"兩個矩形面積之和為:"<<z.GetArea()<<endl; }10.1.1C++面向對象程序實例《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄實例3功效是先定義一個矩形類,然后將“+”運算符重載為能夠使兩個矩形類對象相加。該程序輸出結果為:
第一個矩形面積為:45
第二個矩形面積為:30
兩個矩形面積之和為:7512/9010.1.2C++語言概述《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄因為結構化程序設計本身不足,在20世紀80年代出現了面向對象程序設計方法,C++語言也由此而產生。面向對象程序設計(Object-Orientedprogramming,簡稱OOP)設計出發(fā)點就是為了能更直接描述客觀世界中存在事物(即對象)以及它們之間關系。面向對象程序設計是對結構化程序設計繼承和發(fā)展,它認為現實世界是由一系列彼此相關且能相互通信實體組成,這些實體就是面向對象方法中對象,而對一些對象共性抽象描述,就是面向對象方法中類。類是面向對象程序設計關鍵。13/9010.1.2C++語言概述《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄C++是當前最流行面向對象程序設計語言。它在C語言基礎上進行了改進和擴充,并增加了面向對象程序設計功效,更適合于開發(fā)大型軟件。C++是由貝爾試驗室在C語言基礎開發(fā)成功,C++保留了C語言原有全部優(yōu)點,同時與C語言又完全兼容。它既能夠用于結構化程序設計,又可用于面向對象程序設計,所以C++是一個功效強大混合型程序設計語言。C++最有意義方面是支持面向對象程序設計特征。即使與C語言兼容性使得C++含有雙重特點,但它在概念上和C語言是完全不一樣,學習C++應該按照面向對象程序思維去編寫程序。14/90《C語言程序設計》
(VisualC++6.0環(huán)境)返回本章目錄10.2.2類結構與封裝10.2.1面向對象基本概念10.2類與對象10.2.3創(chuàng)建對象10.2.4友元10.2.5模板10.2.6程序實訓15/9010.2.1面向對象基本概念《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄1.對象從普通意義上講,客觀世界中任何一個事物都能夠看成是一個對象。比如一本書,一名學生等。對象含有自己靜態(tài)特征和動態(tài)特征。靜態(tài)特征能夠用某種數據來描述,如一名學生身高、年紀、性別等;動態(tài)特征是對象所表現行為或含有功效,如學生學習、運動、休息等。面向對象方法中對象是系統(tǒng)中用來描述客觀事物一個實體,它是用來組成系統(tǒng)一個基本單位,對象由一組屬性和一組行為組成。屬性是用來描述對象靜態(tài)特征數據項,行為是用來描述對象動態(tài)特征操作序列。16/90許多對象含有相同結構和特征,比如不論是數學書還是化學書,它們都含有大小、定價、編者等特征。在現實生活中,我們通常將含有相同性質事物歸納、劃分成一類,比如數學書和化學書都屬于書這一類。一樣在面向對象程序設計中也會采取這種方法。面向對象方法中類是含有相同屬性和行為一組對象集合。類代表了一組對象共性和特征,類是對象抽象,而對象是類詳細實例。比如,家俱設計師按照家俱設計圖做成一把椅子,那么設計圖就好比是一個類,而做出來椅子則是該類一個對象,一個詳細實例。拿【例10.1】中定義矩形類來說,該類只是全部矩形一個藍本,它只是代表了矩形一些特征,而該類實例則是一個特定矩形。10.2.1面向對象基本概念《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄2.類17/9010.2.2類結構與封裝《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄1.類封裝類封裝就是將對象屬性和行為結合成一個獨立實體,并盡可能隱蔽對象內部細節(jié),對外形成一道屏障,只保留有限對外接口使之和外界發(fā)生聯絡。類組員包含數據組員和組員函數,分別描述類所表示問題屬性和行為。對類組員訪問加以控制就形成了類封裝,這種控制是經過設置組員訪問權限來實現。在面向對象程序設計中,經過封裝將一部分行為作為外部接口,而將數據和其它行為進行有效隱蔽,就能夠到達對數據訪問權限合理控制。把整個程序中不一樣部分相互影響降低到最低程度。18/9010.2.2類結構與封裝《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄2.類定義類定義普通格式為:class類名稱
{
public:
公有數據和組員函數/*外部接口*/protected:
保護數據組員函數private:
私有數據和組員函數
};19/9010.2.2類結構與封裝《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄關鍵字class說明了類定義開始,類中全部內容用大括號括起來。類組員可分為三種級別訪問權限:public(公有):說明該組員是公有,它不但能夠被類組員函數訪問,而且能夠被外界訪問,所以說公有類型定義了類外部接口。Protected(保護):說明該組員只能被該類組員函數和該類派生類組員函數訪問。Private(私有):說明該組員只能被類組員函數訪問,外界不能直接訪問它。類數據組員普通都應該申明為私有組員。20/9010.2.2類結構與封裝《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄3.類組員函數類組員函數描述是類行為。定義類時在類定義體中給出函數申明,說明函數參數列表和返回值類型,而函數詳細實現普通在類定義體之外給出。下面是類外定義組員函數普通格式:返回值類型類名::類組員函數名(參數列表){
函數體
}
其中::稱為作用域分辨符。用它能夠限制要訪問組員所在類名稱。21/90在建立一個對象時,經常需要作一些初始化工作,而當對象使用結束時,又需要作一些清理工作。在C++中提供了兩個特殊組員函數來完成這兩項工作,那就是結構函數和析構函數。結構函數作用就是在對象在被創(chuàng)建時利用特定值結構對象,將對象初始化。結構函數完成是一個從普通到詳細過程。需要注意是結構函數同其它組員函數不一樣,它不需要用戶觸發(fā),而是在創(chuàng)建對象時由系統(tǒng)自動調用,其它任何過程都無法再調用結構函數。結構函數函數名必須與類名相同,而且不能有返回值,也不需加void類型申明。結構函數能夠帶參數也能夠不帶參數。結構函數普通定義為公有類型。10.2.2類結構與封裝《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄4.結構函數和析構函數22/9010.2.2類結構與封裝《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄析構函數也是類一個公有組員函數,其作用與結構函數恰好相反,它是用來在對象被刪除前進行一些清理工作。析構函數調用之后,對象被撤消了,對應內存空間也將被釋放。析構函數名也應與類名相同,只是函數名前加一個波浪符“~”,以區(qū)分于結構函數。析構函數不能有任何參數,且不能有返回值。假如不進行顯式說明,系統(tǒng)會自動生成缺省析構函數,所以一些簡單類定義中沒有顯式析構函數。5.結構函數與析構函數應用實例23/9010.2.2類結構與封裝《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄【例10.4】程序名為l10_4.cpp。
#include<iostream.h>
classA//定義類A
{public:
A()
{cout<<“結構函數被調用”<<endl;//結構函數
}
voiddisp()//組員函數
{cout<<“結構函數與析構函數應用舉例”<<endl;
}
~A()//析構函數
{cout<<"析構函數被調用"<<endl;
}
};24/90程序在申明A類對象時,系統(tǒng)會自動調用結構函數,因而先執(zhí)行結構函數中輸出語句,輸出“結構函數被調用”,接下來調用disp組員函數,執(zhí)行disp組員函數中輸出語句,輸出“結構函數與析構函數應用舉例”,最終程序在退出前由系統(tǒng)自動調用析構函數,執(zhí)行析構函數中輸出語句,輸出“析構函數被調用”,所以程序輸出結果為:
結構函數被調用結構函數與析構函數應用舉例析構函數被調用10.2.2類結構與封裝《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄voidmain()
{Aa;//申明類對象,自動調用結構函數
a.disp();//調用組員函數,對象使用結束時
//自動調用析構函數
}6.實例分析25/9010.2.3創(chuàng)建對象《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄經過使用數組,我們能夠對大量數據和對象進行有效管理,但對于許多程序,在運行之前,我們并不能確切地知道數組中會有多少個元素。比如,一個網絡中有多少個可用節(jié)點,一個CAD系統(tǒng)中會用到多少個形狀等。假如數組開太大會造成很大浪費,假如數組較小則又影響大量數據處理。在C++中,動態(tài)內存分配技術能夠確保我們在程序運行過程中按實際需要申請適量內存,使用結束后再進行釋放。這種在程序運行過程中申請和釋放存放單元過程稱為創(chuàng)建對象和刪除對象。1.new運算符26/90C++用new運算符來創(chuàng)建對象。
運算符new功效是動態(tài)創(chuàng)建對象,其語法形式為:
new類型名(初值列表);
該語句功效是在程序運行過程中申請用于存放指定類型內存空間,并用初值列表中給出值進行初始化。
假如創(chuàng)建對象是普通變量,初始化工作就是賦值,假如創(chuàng)建對象是某一個類實例對象,則要依據實際情況調用該類結構函數。
比如:int*p;
p=newint(100);//賦值給指針變量
比如:rectangle*r;
r=newrectangle(5,6);//調用矩形類結構函數
假如創(chuàng)建對象是數組類型,則應按照數組結構來創(chuàng)建,其語法形式為:10.2.3創(chuàng)建對象《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄27/9010.2.3創(chuàng)建對象《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄一維數組:new類型名[下標];
當數組為一維數組時,下標為數組為元素個數,動態(tài)分配內存時不能指定數組元素初值。假如內存申請成功,返回一個指向新分配內存首地址指定類型指針,假如失敗返回0。
比如:int*p;
p=newint[10];
多維數組:new類型名[下標1][下標2]……;
當數組為多維數組時,返回一個指向新分配內存首地址指針,但該指針類型為指定類型數組。數組元素個數為除最左邊一維外下標乘積。
比如:int(*p)[5];
p=newint[10][5];28/9010.2.3創(chuàng)建對象《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄2.delete運算符運算符delete功效是刪除由new運算符創(chuàng)建對象,釋放指針指向內存空間,其語法形式為:
delete指針名;
比如:int*p;
p=newint(100);
deletep;
假如new運算符創(chuàng)建對象是數組,則刪除對象時應使用語法形式為:
delete[]指針名;
比如:int*p;
p=newint[10];
delete[]p;29/9010.2.3創(chuàng)建對象《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄3.C++程序實例【例10.5】類對象創(chuàng)建與刪除。(程序名為l10_5.cpp。)
#include<iostream.h>
classrectangle//定義一個矩形類{public:
rectangle(floatlen,floatwid)//結構函數
{length=len;
width=wid;
}
floatGetArea();//組員函數
private:
floatlength;
floatwidth;
};30/9010.2.3創(chuàng)建對象《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄floatrectangle::GetArea()//組員函數實現{returnlength*width;
}
voidmain()
{rectangle*r;//定義指向rectangle類指針變量r
r=newrectangle(10,5);//創(chuàng)建rectangle類對象
cout<<r->GetArea()<<endl;
deleter;//刪除對象
}4.C++程序實例分析程序中先建立了一個rectangle類,然后在主函數中定義了一個指向rectangle類指針變量r,用new在內存中開辟一段空間以存放rectangle類對象,這時會自動調用結構函數來初始化該對象,接下來使用指向rectangle類指針變量r得到矩形面積,最終用delete刪除對象,釋放該空間。31/9010.2.4友元《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄2.友元函數3.友元類1.友元概述32/9010.2.4友元《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄在程序設計過程中,假如用戶建立了一個類,這個類數據組員被定義為私有,這時假如想把該數據存取到某個函數(非該類組員函數)中,那么這么作必定是不被允許。不過有時候一些非組員函數需要親自訪問類中一些私有數據,那么這時候就需要用到友元。友元提供了不一樣類或對象組員函數之間、類組員函數與普通函數之間進行數據共享機制。經過友元,一個普通函數或類組員函數能夠訪問到封裝于其它類中數據。友元作用在于提升程序運行效率,但同時它也破壞了類封裝性和隱藏性,使得非組員函數能夠訪問類私有組員。1.友元概述33/9010.2.4友元《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄友元函數是在類定義中由關鍵字friend修飾非組員函數。友元函數能夠是一個普通函數,也能夠其它類中一個組員函數,它不是本類組員函數,但它能夠訪問本類私有組員和保護組員。友元函數需要在類內部進行申明。其格式以下:
class類名稱{類組員申明
friend返回類型友元函數名(參數列表);類組員申明}2.友元函數34/9010.2.4友元《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄【例10.6】使用友元函數計算兩點間距離。程序名為l10_6.cpp。#include<iostream.h>
#include<math.h>
classPoint//定義Point類(點)
{public:
Point(doublexx,doubleyy)//結構函數
{x=xx;
y=yy;}
voidGetxy();//組員函數申明
frienddoubleDistance(Point&a,Point&b);//友元函數申明
private:
doublex,y;//私有組員(點坐標)
};35/90voidPoint::Getxy()//組員函數實現{cout<<“(”<<x<<“,”<<y<<“)”;//輸出點坐標
}
doubleDistance(Point&a,Point&b)//友元函數實現
{doubledx=a.x-b.x;//訪問私有組員
doubledy=a.y-b.y;
returnsqrt(dx*dx+dy*dy);//兩點距離
}
voidmain()
{Pointp1(3.0,4.0),p2(6.0,8.0);//定義Point類對象
p1.Getxy();//調用組員函數
p2.Getxy();
cout<<“\nTheistanceis”<<Distance(p1,p2)<<endl;
//調用友元函數
}
10.2.4友元《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄36/9010.2.4友元《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄實例說明:程序在類定義體內申明了友元函數原形,在申明時函數名前加friend關鍵字進行修飾,友元函數詳細實現在類外給出,能夠看出友元函數經過對象名可直接訪問Point類私有組員,而不需要借用外部接口Getxy。在調用友元函數時同調用普通函數一樣,采取直接調用方法,而不需要像調用類組員函數那樣必須經過對象。
該程序輸出結果為:(3,4)(6,8)Thedistanceis537/9010.2.4友元《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄3.友元類同函數一樣,類也能夠申明為另一個類友元,這時稱為友元類。當一個類作為另一個類友元時,這個類全部組員函數都將是另一個類友元函數。友元類普通格式為:class類A{類A組員申明friendclass類B;類A組員申明}38/90【例10.7】程序名為l10_7.cpp。#include<iostream.h>classA//定義類A{public: A(intxx,intyy)//類A結構函數 { x=xx; y=yy;
} friendclassB;//申明類B為類A友元類private:
intx,y;};classB//定義類B{public: voiddisp1(As){cout<<"disp1調用了類A私有組員x:"<<s.x<<endl;} //類B組員函數訪問類A私有組員
10.2.4友元《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄39/90程序中定義了A和B兩個類,其中類B為類A友元類,定義時在類A內部申明類B,而類B詳細實現過程是在類A外部。類B中有兩個組員函數disp1和disp2,依據友元類概念,這兩個組員函數都成為類A友元函數,所以它們都能夠訪問類A私有組員x和y。該程序輸出結果為:disp1調用了類A私有組員x:5disp2調用了類A私有組員y:910.2.4友元《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄 voiddisp2(As) {cout<<"disp2調用了類A私有組員y:"<<s.y<<endl;} //類B組員函數訪問類A私有組員
};
voidmain(){Aa(5,9);//申明A類對象Bb;//申明B類對象b.disp1(a);//調用B類組員函數b.disp2(a);}40/9010.2.5模板《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄前面章節(jié)中我們學習了重載函數,使用重載函數能夠處理各種數據類型,不過即使設計為重載函數也只是使用相同函數名,函數體依然要分別定義。使用函數模板則不一樣了,函數模板能夠用來創(chuàng)建一個通用功效函數,以支持各種不一樣參數,簡化重載函數函數體設計。函數模板定義形式為:
template<typename標識符>函數定義1.函數模板41/9010.2.5模板《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄【例10.8】使用函數模板。(程序名為l10_8.cpp。)#include<iostream.h>template<typenameT>Tmax(Tx,Ty)//定義模板函數{returnx>y?x:y;}voidmain(){inta=6,b=8;cout<<max(a,b)<<endl;doublem=10.5,n=8.5;cout<<max(m,n)<<endl;}程序中首先定義模板函數max用來取得兩個數中相對較大一個,然后主函數調用該函數,此時編譯器將依據實參類型推導出函數模板類型參數。比如,當調用max(a,b)時,因為a,b為整型變量,所以模板中類型參數T為int,而調用max(m,n)時,因為m,n為double類型,所以模板中類型參數T為double。42/9010.2.5模板《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄2.類模板使用類模板使用戶能夠為類定義一個模式,使得類中一些數據組員、一些組員函數參數、一些組員函數返回值能取任意類型,包含用戶自定義或系統(tǒng)預定義。
為了定義類模板,應在類申明之前加上一個模板參數表,參數表里形式類型名用來說明組員數據和組員函數類型。類模板定義形式為:
template<class類型說明符>
類定義
類模板本身不產生代碼,它指定類一個家族,當被其它代碼引用時,類模板才依據引用需要產生代碼。43/90【例10.9】使用類模板。(程序名為l10_9.cpp。)
#include<iostream.h>
template<classT>//類模板,實現對任意數據類型存取classrectangle//定義一個矩形類rectangle
{public:
rectangle(Tlen,Twid)//結構函數
{length=len;
width=wid;
}
TGetArea();//申明組員函數,計算矩形面積
TGetPerimeter();//申明組員函數,計算矩形周長private:
Tlength;//私有數據,用于任意類型
Twidth;
};
template<classT>
Trectangle<T>::GetArea()//組員函數詳細實現
{returnlength*width;}10.2.5模板《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄44/90template<classT>
Trectangle<T>::GetPerimeter()//組員函數詳細實現
{return2*(length+width);}
voidmain()
{rectangle<int>x(4,6);//定義rectangle對象(組員函數返回值為int型)
rectangle<double>y(5.5,3.8);//定義rectangle對象(組員函數返回值為double型)
cout<<“x面積是:”<<x.GetArea()<<endl;
cout<<“x周長是:”<<x.GetPerimeter()<<endl;
cout<<“y面積是:"<<y.GetArea()<<endl;
cout<<"y周長是:"<<y.GetPerimeter()<<endl;
}程序執(zhí)行結果為:
x面積是:24
x周長是:20
y面積是:20.9
y周長是:18.610.2.5模板《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄45/90【例10.10】日期類應用程序舉例。(程序名為l10_10.cpp。)
#include<iostream.h>
classTDate//日期類定義
{public:
TDate(inty,intm,intd);//結構函數
intIsLeapYear();//判斷閏年
voidshow();//顯示日期
friendintGetyear(TDatedate);//友元函數,返回年
private:
intyear,month,day;
};
TDate::TDate(inty,intm,intd)//結構函數實現
{year=y;
month=m;
day=d;
}10.2.6程序實訓《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄1.C++程序實例46/90intTDate::IsLeapYear()
{return(year%4==0&&year%100!=0)||(year%400==0);}
voidTDate::show()
{cout<<year<<“年”<<month<<“月”<<day<<“日”<<endl;}
intGetyear(TDatedate)//友元函數實現
{returndate.year;}
voidmain()
{TDate*date;//申明指向TDate類型指針變量
date=newTDate(,10,28);//創(chuàng)建對象
date->show();//調用組員函數
if(date->IsLeapYear())
cout<<Getyear(*date)<<“年是閏年”<<endl;//調用友元函數
else
cout<<Getyear(*date)<<“年不是閏年"<<endl;
deletedate;//刪除對象
}10.2.6程序實訓《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄47/9010.2.6程序實訓《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄程序能夠分為三個部分,第一部分是CDate類定義,第二部分是組員函數實現,第三部分是主函數。類定義中依然是由組員數據和組員函數組成,其中組員函數作為外部接口。程序中為了說明友元應用,引入了友元函數,這里能夠換成類組員函數,讀者能夠自己試一試。主函數中,在定義了指向TDate類型指針變量之后,使用new運算符創(chuàng)建對象,程序結束時又使用delete運算符刪除了對象,釋放了內存空間。這種編程方法在以后程序設計中會經常碰到,讀者應該習慣于使用new和delete進行動態(tài)內存管理。2.C++程序實例分析48/90《C語言程序設計》
(VisualC++6.0環(huán)境)返回本章目錄10.3.2派生類10.3.1
繼承與派生概念10.3繼承與派生10.3.4虛函數10.3.3
派生類結構函數與析構函數10.3.5程序實訓49/90面向對象程序設計過程中,一個很主要特點就是代碼可重用性。C++是經過繼承這一機制來實當代碼重用。所謂繼承指是類繼承,就是在原有類基礎上建立一個新類,新類將從原有類那里得到已經有特征。比如,現有一個學生類,定義了學號、姓名、性別、年紀四項內容,假如我們除了用到以上四項內容外,還需要用到電話和地址等信息,我們就能夠在學生類基礎上再增加相關內容,而無須重頭再定義一個類。換個角度來說,從已經有類產生新類過程就是類派生。類繼承與派生允許在原有類基礎上進行更詳細、更詳細修改和擴充。新類由原有類產生,包含了原有類關鍵特征,同時也加入了自己所特有性質。新類繼承了原有類,原有類派生出新類。原有類我們稱為基類或父類,而派生出類我們稱為派生類或子類。比如:全部windows應用程序都有一個窗口,能夠說它們都是從一個窗口類中派生出來,只不過有應用程序用于文字處理,有則應用于圖像顯示。10.3.1繼承與派生概念《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄50/9010.3.1繼承與派生概念《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄類繼承與派生層次結構是人們對自然界中事物進行分類分析認識過程在程序設計中表達?,F實世界中事物都是相互聯絡、相互作用,人們在認識過程中,依據它們實際特征,抓住其共同特征和細小差異,利用分類方法進行分析和描述。
以下列圖是生物類一個繼承圖,最高層次生物類是抽象程度最高,是最含有普遍意義概念,下層含有上層特征,同時也加入了自己新特征,而最下層是最詳細。這個層次結構中,由上到下,是一個詳細化、特殊化過程,由下到上,是一個抽象化過程。上下層之間就能夠看作是基類與派生類關系。51/9010.3.1繼承與派生概念《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄52/9010.3.2派生類《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄定義派生類普通形式為:
class派生類名:繼承方式基類名
{派生類組員定義};
繼承方式指派生類訪問控制方式,能夠是public(公有繼承),protected(保護繼承)和private(私有繼承)。繼承方式能夠省略不寫,缺省值為private。
派生類在派生過程中,需要經歷吸收基類組員、改造基類組員和添加新組員三個步驟。其中,吸收基類組員主要目標是實當代碼重用,但應該注意是基類結構函數和析構函數是不能被繼承下來;改造基類組員則主要是對基類數據組員或組員函數覆蓋,就是在派生時定義一個和基類數據或函數同名組員,這么基類中組員就被替換為派生類中同名組員;添加新組員是對類功效擴展,添加必要數據組員和組員函數來實現新增功效。53/9010.3.2派生類《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄在繼承中,派生類繼承了除結構函數和析構函數以外全部組員。對于從基類繼承過來組員訪問并不是簡單把基類私有組員、保護組員和公有組員直接作為私有組員、保護組員和公有組員,而是要依據基類組員訪問權限和派生類繼承方式共同決定。
1.公有繼承
當類繼承方式為public時,基類公有(public)組員和保護(protected)組員依然成為派生類公有組員和保護組員,而基類私有組員不能被派生類訪問。
2.保護繼承
當類繼承方式為protected時,基類公有(public)組員和保護(protected)組員將成為派生類保護組員,而基類私有組員不能被派生類訪問。54/9010.3.2派生類《C語言程序設計》
(VisualC++6.0環(huán)境)3.私有繼承
當類繼承方式為private時,基類公有(public)組員和保護(protected)組員將成為派生類私有組員,而基類私有組員不能被派生類訪問。(看下列圖:)返回本節(jié)目錄55/90如10.1.1中實例2先定義了一個矩形類,然后又從矩形類中派生出正方形類,正方形是矩形一個特例,矩形類實例化一個矩形對象時需要用到長和寬兩個參數,而正方形則只需要用到邊長一個參數,所以在派生過程中新增了組員函數InitSquare用來完成初始化工作。InitSquare函數實現過程中用到了基類組員函數InitRect,因為InitRect函數為基類公有組員,所以在派生類中能夠被訪問。假如InitSquare函數實現過程改為以下語句:
voidInitSquare(floatb)
{length=b;
width=b;}
該程序是不能被編譯經過,因為派生類是不能訪問基類私有組員。另外,該程序使用繼承方式為公有繼承,所以基類中公有組員都被派生類吸收并成為公有組員。10.3.2派生類《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄56/9010.3.3派生類結構函數與析構函數《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄繼承目標是為了發(fā)展,派生類繼承了基類組員,實現了代碼重用,這只是一部分,而代碼擴充才是最主要,只有添加新組員,加入新功效,類派生才有實際意義。我們知道,基類結構函數和析構函數是不能被繼承,所以假如要對新增組員進行初始化,就必須加入新結構函數。一樣,對派生類對象掃尾、清理工作也需要引入新析構函數。1.派生類結構函數假如基類對象包含對組員初始化,而在建立派生類對象時,因為基類結構函數不能被繼承而無法執(zhí)行,所以會使基類組員未初始化,所以在設計派生類結構函數57/9010.3.3派生類結構函數與析構函數《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄時,不但要考慮派生類新增數據組員初始化,還應該考慮基類數據組員初始化。
派生類結構函數普通格式為:
派生類結構函數名(參數列表):基類結構函數名(參數列表)
{
派生類新增組員初始化語句;
}
將【例10.2】改為使用結構函數進行初始化:【例10.11】程序名為l10_11.cpp。
#include<iostream.h>
classrectangle//定義矩形類(基類)
{public:
rectangle(floatlen,floatwid)//基類結構函數 {length=len;
width=wid;
}58/90floatGetArea();
floatGetPerimeter();
private://定義私有組員變量
floatlength;
floatwidth;
};
floatrectangle::GetArea()//基類組員函數實現
{returnlength*width;
}
floatrectangle::GetPerimeter()//基類組員函數實現
{return2*(length+width);
}
classrect:publicrectangle//從矩形類中派生新類(正方形類)
{public:
rect(floatb):rectangle(b,b)//派生類結構函數
{}
};10.3.3派生類結構函數與析構函數《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄59/9010.3.3派生類結構函數與析構函數《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄voidmain()
{rectx(8);//申明正方形類對象
cout<<x.GetArea()<<endl;//調用從矩形類中繼承
//下來組員函數(GetArea)
cout<<x.GetPerimeter()<<endl;//調用從矩形類中繼承下來
//組員函數(GetPerimeter)
}程序輸出結果為:64
3260/9010.3.3派生類結構函數與析構函數《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄2.派生類析構函數在派生過程中,基類析構函數也不能被繼承下來,這就需要在派生類中自行定義。派生類析構函數定義與沒有繼承關系類析構函數完全相同,只要負責把派生類新增組員清理工作做好就夠了,系統(tǒng)會自動調用基類析構函數對基類對象組員進行清理。同結構函數相同,析構函數在執(zhí)行過程中也要對基類進行操作,它首先對派生類新增組員進行清理,然后對基類進行清理。這些清理工作分別是調用派生類析構函數和調用基類析構函數來完成。
61/90【例10.12】程序名為l10_12.cpp。
#include<iostream.h>
classcolor//定義color類
{public:
voidpaint(){cout<<“Nocolor.”<<endl;}
};
classgreen:publiccolor//由color派生出green類
{public:
voidpaint(){cout<<"Thecolorisgreen."<<endl;}
};10.3.4虛函數《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄虛函數就是在前面使用virtual關鍵字來限定普通組員函數。虛函數是為實現某種功效而假設函數,它是類一個組員函數。當在派生類中定義了一個同名組員函數時,只要該組員函數參數類型及返回類型與基類中同名虛函數完全一樣,那么不論是否用virtual關鍵字,它都將成為一個虛函數。
我們先看一個例子:62/9010.3.4虛函數《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄voidmain()
{ colorc,*p;//申明color類變量及指針變量
greeng;//申明green類變量
p=&g;//將指向color類指針p指向green類
c.paint();
g.paint();
p->paint();
}程序執(zhí)行結果如右圖:63/9010.3.4虛函數《C語言程序設計》
(VisualC++6.0環(huán)境)程序中對象c和對象g輸出結果都不難了解,但指針p已經指向了green類對象,然而從輸出結果看調用卻是color類paint()函數。處理這個問題方法就是使用虛函數。
將上例color類改為以下使用虛函數方法:classcolor//定義color類
{public:
virtualvoidpaint(){cout<<"Nocolor."<<endl;}//定義虛函數
};輸出結果如右圖:返回本節(jié)目錄64/9010.3.4虛函數《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄以上實例說明在C++中,假如一個函數被定義成虛函數,那么,即使是使用指向基類對象指針來調用該組員函數,C++也能確保所調用是正確特定于實際對象組員函數。65/9010.3.5程序實訓《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄使用類派生編程實現在屏幕上顯示某學生選課信息。學生包含姓名和學號兩個屬性,選課信息包含課程名稱、任課教師和上課時間三個屬性,每名學生最多可選三門課。因為學生包含兩個屬性,選課信息包含三個屬性,而這些屬性都能夠用字符數組表示,那么抓住這個共性我們就能夠考慮建立一個基類(base),使其含有兩個字符數組類型組員變量,接下來我們就能夠由該基類派生出學生類(student)和選課信息類(classes)。為了顯示相關信息,在派生過程中,需要增加對應外部接口。程序詳細實當代碼以下:66/9010.3.5程序實訓《C語言程序設計》
(VisualC++6.0環(huán)境)【例10.14】程序名為l10_14.cpp。#include<iostream.h>
#include<string.h>
classbase//定義基類base
{private:
charstr1[20];
charstr2[10];
public:
base(){}
base(chars1[],chars2[])
{strcpy(str1,s1);
strcpy(str2,s2);
}
voidshow1()
{cout<<str1;
}返回本節(jié)目錄67/9010.3.5程序實訓《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄voidshow2()
{cout<<str2;
}
};
classclasses:publicbase//從基類派生課程類
{private:
charcname[20];//課程名稱
public:
classes(){}
classes(charcna[],charcweek[],charctea[]):base(cweek,ctea)
//課程名稱、上課時間、任課教師
{strcpy(cname,cna);}68/90voidshow()
{cout<<cname<<“(”;
show1();//課程名稱(任課教師,上課時間)
cout<<“,”;
show2();
cout<<“)”;
}
};
classstudent:publicbase//從基類派生學生類
{private:
classescls[3];//每名學生最多項選擇修3門課
intmax;
public:
student(){}
student(charsname[],charsno[]):base(sname,sno){max=0;}10.3.5程序實訓《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄69/9010.3.5程序實訓《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄voidselectcls(classesc)//選課 { cls[max]=c;
max++;
}
voidshowcls()//顯示選課信息
{cout<<“學生:”;
show1();
cout<<"(";
show2();
cout<<")"<<endl<<"選修課程:"<<endl;
for(inti=0;i<max;i++)
{cout<<i+1<<":";
cls[i].show();
cout<<endl;
}
}
};70/9010.3.5程序實訓《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄voidmain(){studentstu("黃雪菲","12345678");classescls1("數據庫應用","曲子研","星期三");classescls2("C++程序設計","胡小燕","星期二");classescls3("數據結構","江山","星期五");stu.selectcls(cls1);stu.selectcls(cls2);stu.selectcls(cls3);stu.showcls(); }程序執(zhí)行結果如右圖:71/90《C語言程序設計》
(VisualC++6.0環(huán)境)返回本章目錄10.4.2運算符重載規(guī)則10.4.1重載運算符10.4運算符重載10.4.3類型轉換與轉換函數72/9010.4.1重載運算符《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄運算符重載增強了C++語言可擴充性。在C++中,定義一個類就是定義了一個新類型。所以,類對象和變量一樣,能夠作為參數傳遞,也能夠作為返回類型。在基本數據類型中,系統(tǒng)提供了許多預定義運算符,而實際上,對于用戶自定義類型(比如類),也需要有類似運算操作,這就提出了對運算符進行重新定義,賦于已經有符號以新功效要求。運算符重載實質是函數重載。所謂函數重載簡單地說就是賦給同一個函數名多個含義,C++中允許在相同作用域內以相同名字定義幾個不一樣函數,能夠是組員函數,也能夠是非組員函數,定義重載函數時要求函數參數或者最少有一個類型不一樣,或者個數不一樣,而對于返回值類型能夠相同,也能夠不一樣。對于每一個運算符@,都對應于一個73/9010.4.1重載運算符《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄運算符函數operator@,比如“+”對應運算符函數是operator+。運算符重載在實現過程中首先把指定運算符轉化為對運算符函數調用,再把運算對象轉化為運算符函數實參,然后依據實參類型來確定需要調用運算符函數。
比如在10.1.1實例3中,我們把“+”重載為矩形類組員函數,那么就可直接進行兩個矩形類對象相加了。能夠看出,運算符重載除了在函數申明時使用了關鍵字operatore之外,其它地方與類普通組員函數沒什么區(qū)分,只不過它能夠直接經過運算符和操作數方式來完成函數調用。運算符重載擴充了運算符原有功效,如10.1.1實例3中對“+”進行了運算符重載之后,“+”原有功效不變,對整型、浮點型數據運算依然遵照C++預定義規(guī)則,同時又增加了針對矩形類運算功效?!?”作用于不一樣對象上,就會造成不一樣操作行為,含有了更廣泛功效。74/9010.4.2運算符重載規(guī)則《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄運算符重載規(guī)則以下:1)C++中運算符除了少數幾個外,全部能夠重載,而且只能重載已經有這些運算符。
2)重載之后運算符優(yōu)先級和結合性保持不變。
3)運算符重載是針對新類型數據實際需要,對原有運算符進行適當改造。普通來講,重載功效應與原有功效相類似,不能改變原有運算符操作對象個數,同時最少有一個操作對象是自定義類型。
不能重載運算符有五個,它們是是類屬關系運算符“.”、指針運算符“*”、作用域運算符“::”、三目運算符“?:”和sizeof運算符。
運算符重載形式有兩種,重載為類組員函數和重載為友元函數。重載為類組員函數普通形式為:75/90《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄類名稱operator運算符(參數表)
{
函數體
}重載為友元函數普通形式為:
friend函數類型operator運算符(參數表)
{
函數體
}10.4.2運算符重載規(guī)則76/9010.4.2運算符重載規(guī)則《C語言程序設計》
(VisualC++6.0環(huán)境)返回本節(jié)目錄函數類型指定了重載運算符返回值類型,operator是定義運算符重載函數關鍵字,運算符是C++中可重載運算符。當運算符重載為類組員函數時,雙目運算符僅有一個參數,而單目運算符則不能顯式說明參數。普通情況下,單目運算符最好重載為組員函數,雙目運算符最好重載為友元函數,雙目運算符重載為友元函數比重載為組員函數更方便操作,不過,有雙目運算符重載為組員
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《結直腸癌診治進展》課件
- 平安自查報告范文集錦10篇
- 小學數學二年級上冊《乘除混合運算》教學設計
- 小學三年級多位數加減法,脫式計算練習題
- 2025年1月八省聯考高考綜合改革適應性測試-高三地理(內蒙古卷)
- 湖南省長沙市三中1月高三月考語文試題
- 《實驗動物學緒論》課件
- 《灰色系統(tǒng)理論簡介》課件
- 遼寧省鞍山市普通高中2023-2024學年高三上學期期末聯考英語試題
- 教育機構人才招聘總結
- 專題01 名詞的種類精講課件初中英語語法課件
- 醫(yī)療器械監(jiān)督管理條例培訓2024
- 2024年海南省公務員考試《行測》真題及答案解析
- 旅游度假村分成協(xié)議
- 醫(yī)療技術管理總結
- 艦艇損害管制與艦艇損害管制訓練
- 常見年宵花春節(jié)期間養(yǎng)護攻略
- 安全安全技術交底模板
- 床上用品材料采購合同
- 2021年河南學業(yè)水平考試 pyton操作題代碼以及 Python基礎知識點
- 整本書閱讀《鄉(xiāng)土中國》課件+2024-2025學年統(tǒng)編版高中語文必修上冊
評論
0/150
提交評論