




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第五章
類與對象
第五章類與對象
§5.1面向對象方法
§5.2類的定義
§5.3對象的創建
§5.4對象的初始化
§5.5特殊的類成員
§5.1面向對象方法
?面向對象的基本思想
?面向對象思想的由來與發展
.面向對象的基本4既念
◎
§5.1面向對象方法
面向對象的基本思想
■從現實世界中客觀存在的事物(對象)出發
來構造系統
對象:對問題領域內人、物、事情等的抽象
■并在系統構造中運用人類的自然思維方式
(抽象、分類、組合、繼承、封裝)
§5.1面向對象方法
面向對象不僅是一些具體的軟件開發
技術,它是一整套關于如何看待軟件系
統與現實世界關系,以何種觀點來研究
問題并進行求解,以及如何進行系統構
造的軟件方法學
§5.1面向對象方法
?用面向對象思想構造軟件的主要內容
①對象是系統的基本單位
②對象的屬性和操作的有機結合組成一個完
整的對象
③具有共同特征的對象抽象成類
④對類進一步抽象,形成類簇
⑤對象之間存在靜態關系和動態關系(組合、
繼承、消息等)
§5.1面向對象方法
面向對象基本思想——抽象
?現實世界的事物抽象成對象
?現實世界事物之間的關系抽象成軟件系統中
對象之間的關系
?具有共同特征的對象抽象成類
?具有共同特征的類抽象成基類和派生類
§5.1面向對象方法
面向對象基本思想——封裝
?對象是屬性和操作的組合
?對象的表現(服務,接口)和實現細節分開
§5.1面向對象方法
?面向對象方法的定義
利用抽象、封裝等機制,借助于對
象、類、繼承、消息傳遞等概念進行軟
件系統構造的軟件開發方法
§5.1面向對象方法
?面向對象的由來與發展
面向對象方法起源于面向對象的編程語言
在編程語言得到充分發揮和應用的同時,面向
對象方法得到了發展。
反過來又為面向對象編程提供了先期的設計和
指導
§5.1面向對象方法
?面向對象方法是軟件理論的返璞歸真
?軟件開發的發展過程
面向過程
程序員面向數據
的智慧
面向功能
和技巧面向對象
面向應用
面向數據流
§5.1面向對象方法
面向對象基本概念
?對象
?消息
?類
?類與對象的關系
§5.1面向對象方法
對象
?對象是對問題域中客觀存在的事物的抽象,它
是一組屬性和在這些屬性上的操作的封裝體
?對象的兩大要素:屬性和操作
-屬性:狀態,特征,組成成員
-操作:修改屬性,訪問屬性,執行命令
§5.1面向對象方法
例:“文件”作為一個對象
屬性:操作:
文件名一filename文件復制----copy
文件長度一length文件更名----rename
修改日期一modify-date文件打印----print
文件內容一contents
§5.1面向對象方法
消息
向對象發出的服務請求
■是面向對象系統中對象之間交互的途徑
■要素:發送者、接受者、服務、參數
■oopl中的消息是對類的成員函數的調用
■對消息的響應取決于接受消息的對象
§5.1面向對象方法
類class
?類是具有相同屬性和操作的一組對象的集合,它為屬
于該類的全部對象提供了統一的抽象描述
。類是對一類對象的抽象
。類定義了這一類對象所共有的特征和行為
人類抽象思維的產物
Ooopl中的類相當于一種數據類型
§5.1面向對象方法
類與對象的關系
?類是抽象的,對象是具體的
?類是模板,對象是實例
?類是類型,對象是變量
?類是靜態的,對象是動態的
§5.1面向對象方法
?類是具有相似特征的對象的抽象
-文件類所有具體文件對象的抽象
-書類所有具體書對象的抽象
-學生類所有具體學生對象的抽象
§5.2類的定義
?類定義的一般形式
?內聯函數與非內聯函數
?類成員的訪問控制
?類作用域
§5.2類的定義
?類定義的一般形式
class類名嘉合森
類定義
public:、體中的
公有數據和函數數據和
>函數分
別稱為:
private:數據成
員和成
私有數據和函數員函數
分號不能丟!
§5.2類的定義
?類定義體中包括兩種類的成員:
數據成員和函數成員
?通常類的定義格式:
class類名
(
public:
成員函數
private:
數據成員
};
§5.2類的定義
例:定義一個“文件”類
classFILE
public:
boolcopy(FILE&target);
操作
boolrename(char*new_name);>
成員函數
boolprint();,
private:
charfile_name[100];
屬性
intlength;
數據成員
char.contents;
);
§5.2類的定義
?操作的實現(成員函數的定義)
boolFILE::copy(.......)
}
boolFILE::rename(......)
}
boolFILE::print()
§5.2類的定義
?注:
①類中說明的數據成員不能初始化
②類中數據成員的類型可以是int,char,
float等各種數據類型,還可以是對象
§5.2類的定義
?內聯函數與非內聯函數
(1)內聯函數
classFILE
(
boolrename(char*new_name)
{"
strcpy(filename,newname);
}一"
);
成員函數的函數體定義在類體內
§5.2類的定義
⑵非內聯函數
classFILE
(
boolrename(char*new_name);
};
boolFILE::rename(char*newname)
(-
strcpy(file_name,new_name);
}~~
注:在類體外定義的成員函數要在函數名前加上類名,以便與普
通函數相區別
§5.2類的定義
⑶二者比較
內聯函數的好處:
類的定義集中(將類的所有成員都放在類定義體中)
運行速度快
內聯函數的缺點:
類定義的規模太大
可讀性不好
通常,將簡單的函數作為內聯函數
將功能復雜的函數作為非內聯函數
§5.2類的定義
?類定義可分為類界面與類實現
類界面:只包括類的所有數據成員和成
員函數原型
存放在頭文件中(.HPP)
類實現:包括類的所有成員函數的定義
存放在源文件中(.CPP)
§5.2類的定義
?類的成員的訪問控制(封裝在類中的實現)
一公有(public)-公開
--保護(protected)■適當公開
"私有(private)“不公開
§5.2類的定義
?封裝(信息隱藏)
實現(implementation)
接口(interface)
§5.2類的定義
?封裝的好處
9用戶角度:簡單
只了解接口,不用了解細節
只需要結果,不規定實現方式
0對象角度:保護
信息安全(不直接訪問數據)
安全審計(auditing)
§5.2類的定義
訪問控制的基本原則:
?類的數據成員一般不公開
"private,protected
?表示接口的成員函數一般公開
—public
?與實現細節有關的成員函數不公開
—private,protected
§5.2類的定義
注:
?默認的類成員訪問控制方式為private
?各種訪問控制方式在類定義體中的先后
順序無關
?通常將對外接口部分pub1ic放在前
舉例:用“售報亭”對象描述現實中的一個售
報亨
報刊A
屬報刊B
性
錢箱
月艮報刊零售
務貨款清單
/
消息、:顧客對售報亭說:“買一份《每日新報》!"
消息的接受者:某個售報亭
要求的服務:報刊零售
輸入的信息:要買的報刊種類,份數和遞進去的錢
返回的信息:買到的報紙和找回的零錢
§5.2類的定義
類作用域
類的作用域包括:
類的定義體{);
類的所有非內聯函數的定義體
類成員的作用域是類作用域
類對象的作用域遵循一般變量的作用域規則
§5.3對象的創建
?直接創建對象
?使用對象成員
?對象的作用域與生存期
?舉例
§5.3對象的創建
?創建對象有兩種方式:
直接創建
動態創建(用new運算符創建)
嵩?直接創建對象
格式:〈類名〉〈對象名表》
例如:FILEfl,f2;?>intx9y;
夢?一
殍卜
4§5.3對象的創建
使用對象成員
格式:
〈對象名〉?〈數據成員名〉
或〈對象名〉?〈函數成員名〉(參數表)
?其中〈稱為成員選擇運算符
§5.3對象的創建
訪問成員變量
strcpy(fl.filename,"oopd.daf5);
f2.1ength+=:10;
訪問成員函數
fl.copy(f2);注:只有public的成員
才能調用或訪問
fl.renameC'classA");
§5.3對象的創建
對象的作用域與生存期
?遵循一般變量的作用域、生存期規則
.例:[兵局對象]
FILEmyfile;
voidmain()
(局部對象
1-----
FILEyourfile;、
myfile.copy(yourfile);
yourfile.renameCcnewname55);J
§5.3對象的創建
?域操作符::
::identifier文件域標識符
②classname:identifier類域標識符
③identifier當前域標識符
boolFILE::rename(charfilename)
strcpy(FILE::filename,filename);
舉例:定義一個日期類,該類的對象是某個具體日期
〃日期類的界面
classDATE
{
public:
voidsetdate(inty,intm,intd);
intisleapyear();
voidprint();
private:
intyear,month,day;
};
//以上存入date,hpp文件中
〃日期類的實現
#include''date.hpp”
voidDATE::setdate(inty,intm,intd)
(
year=y;
month=m;
day=d;
}
intDATE::isleapyear()
{
return(year%4=0&&year%100!=0)||(year%400==0);
}
voidDATE::print()
(
cout?year?',,?month?',,?day?endl;
}
〃以上存入date.cpp文件中
〃分析下列程序的輸出結果
#include<iostream.h>
#include"date.cpp''
voidmain()
(
DATEdl,d2;
dl.setdate(199655,4);
d2.setdate(2004,l1,8);
intleapedl.isleapyear();程序執行結果:
cout?leap?endl;1
dl.print();1996,5,4
d2.print();2004,11,8
§5.4對象的初始化
.對象的初始化問題
.構造函數
.構造函數的含義及特點
.默認構造函數
.析構函數
同
§5.4對象的初始化
類對象成員不能在類定義時初始化
classFILE
(
public:
private:
intlength=O;
charfHe_name[]="testcpp'';
);
類是一種模板,類定義時并不分配內存
§5.4對象的初始化
另一種情況:
FILEmyfile;
myfile.filename[]="test.cpp'';
數據成員file_name是私有的,外界不能訪問,
只能通過類中定義的成員函數來訪問
§5.4對象的初始化
?類成員的初始化在對象創建時進行
FILEmy_flle("test.cpp");
FILEyourfileC'noname.cpp59);
?實現:構造函數
§5.4對象的初始化
構造函數與析構函數
在C++中,類的成員函數有兩種:
(1)構造函數與析構函數
⑵普通的成員函數
構造函數與析構函數是在類定義體中說明的
兩個特殊的成員函數
§5.4對象的初始化
classFILE
(
public:
FILE(charname[]);〃構造函數
private:
intlength;
charfile_name[100];
/
);
§5.4對象的初始化
?構造函數的實現
FILE::FILE(charname[])
{
strcpy(file_name9name);
length=O;
§5.4對象的初始化
構造函數的調用時間
在對象建立時由系統自動調用
FILEmyfilef'myfile.cpp55);
FILE*pfile=newFILEf'yourfile.cpp55);
§5.4對象的初始化
構造函數的含義
直接含義:
對象建立時,初始化對象的數據成員
間接含義:
構造一個具有意義的、正確的對象
§5.4對象的初始化
構造函數的特點
?是類的成員函數
?函數名與類名相同(區別于其他成員函數)
?無返回值,void也不能有(只進行初始化)
?由系統自動調用(當對象被創建時)
?必須是公有(public)成員(系統調用也遵守訪問控制規則)
?可以重載
?可以初始化常量數據成員
§5.4對象的初始化
?構造函數舉例
#include<iostream.h>
classRECT
(
public:
RECT(int19intw);
voidarea();
private:
intlength,width;
);
RECT::RECT(int1,intw)
(
length=l;
width=w;
}
voidRECT::area()
(
cout?4tarea=,,?length*width?endl;
}
voidmain()
(
RECTa(5,8);
RECTb(9,4);
a.area();
b.area();
§5.4對象的初始化
程序執行結果:內存分配情況:
area=40
area=36
§5.4對象的初始化
?構造函數的重載
classPOLYGON
(
public:
POLYGON();〃默認構造函數
POLYGON(intedgNum);
POLYGON(charcolor,intedgNum=3);
private:
intedgnum;〃邊的個數
charlinecolor;〃線的顏色
POINTpoint[100];〃各頂點位置
);
§5.4對象的初始化
默認構造函數
POLYGON::POLYGON()
(
edg_num=3;
line_color=0;
fbr(inti=0;i<edg_num;i++)
point[i].x=point[i].y=0;
每個頂點坐標x,y位置初始值為0
§5.4對象的初始化
帶參數的構造函數
POLYGON::POLYGON(intedgNum)
edg_num=edgNum;
line_color=0;
fbr(inti=0;i<edg_num;i++)
point[i].x=point[i].y=0;
§5.4對象的初始化
?創建兩個對象:(在主程序中)
POLYGONpgl;〃自動調用默認構造函數
POLYGONpg2(4);〃自動調用帶參數構造函數
§5.4對象的初始化
默認構造函數
每個類必須有一個構造函數
如果沒定義構造函數,則C++系統提供默認構造函數
(donothing)
如果定義了構造函數,則C++不再提供默認構造函數
如:POLYGONpgl;〃無初始化值的對象
必須要有一個默認的構造函數!
§5.4對象的初始化
析構函數
類的特殊的成員函數
構造函數
在類的對象創建時由系統自動調用的函數
析構函數
在類的對象生命期結束時由系統自動調用
的函數
§5.4對象的初始化
例:
#include<iostream.h>
classDEMO_CLASS
{
public:
DEMO_CLASS(inti);
^DEMO_CLASS();〃析構函數
);
DEMO_CLASS::DEMO_CLASS(inti)
(
cout?ctInitialvalueis:,,?i?endl;
return;
)
DEMOCLASS::?DEMO_CLASS()
{——
cout?“Goodby!\n'';
return;
)
voidmain()
(
DEMO_CLASSobj(30);〃創建一個對象obj
cout?ctThisistheendofmain(
§5.4對象的初始化
?程序執行結果:
Initialvalueis:30
Thisistheendofmain().
Goodby!
?說明:
(1)對象obj的作用域及生命期在main()內,對象創建
時自動調用構造函數
(2)程序執行到main()的y處,貝》obj的生命期結束,
系統自動調用析構函數,并收回obj所占用的內存
空間
§5.4對象的初始化
析構函數的特點:
?是類的成員函數
?函數名為類名前加'?'(邏輯反運算符)
?無返回值,void也不能有
?無參數
?由系統自動調用(當對象生命期結束時)
?必須是公有(public)成員(系統調用也遵守訪問控
制規則)
?不可以重載
§5.4對象的初始化
析構函數的意義
?直接意義
-在對象退出生命期前由系統調用的函數
?間接意義
-對象能正確、合理地退出生命期
?如:釋放占用資源,通知有關對象
§5.4對象的初始化
構造函數和析構函數
?相同點
-由系統自動調用
-沒有返回值
-公有函數
?不同點
-作用不同,調用時間不同
-構造函數可以重載,可以有參數
§5.5特殊的類成員
?常量成員
對象一旦定義,就不能更改該成員
?靜態成員
不屬于對象的成員,由類的所有對象共享
?對象成員
一個類的對象作為另一個類的數據成員
§5.5特殊的類成員
口常量成員
口靜態成員
口對象成員
§5.5特殊的類成員
?常量成員:對象一旦定義,就不能更改該成員
?用const說明的成員,稱為常量成員
?常量成員的定義
常量數據成員的定義:constintedgnum;
常量成員函數的定義:voidprint()const;
§5.5特殊的類成員
常量數據成員只能初始化,不能被賦值
例:
classSILLY
public:
SILLY()
ten=10;常量不能賦值!
private:
constintten;
);
§5.5特殊的類成員
常量成員的初始化
classSILLY
public:
SILLY():ten(10)〃初始化常量數據成員
〃此處不能再對ten賦值
private:
constintten;
};
§5.5特殊的類成員
?例:定義一個多邊形的類
classPOLYGON
(
public:
private:
constintedgnum;〃邊數確定的對象
charlinecolor;
);
注:常量成員不能作為左值
§5.5特殊的類成員
?方法一
POLYGON::POLYGON():edg_num(3)
{
line_color=0;
for(……)
?方法二
POLYGON::POLYGON(intedgNum):edgnum(edgNum)
{"
line_color=0;
for(……)
....;用構造函數的參數edgNum的
}值初始化常量成員edgnum
§5.5特殊的類成員
?常量成員的使用注意:
⑴常量成員只能初始化,不能賦值
⑵常量成員的初始化必須在成員初始化參
數表中進行
§5.5特殊的類成員
非常量成員,也可在成員初始化參數表中進
行初始化
例:
POLYGON::POLYGON(charcolor,intedgNum)
:edgnum(edgNum),linecolor(color)
fbr(inti=0;........)
§5.5特殊的類成員
?靜態成員
-用static說明的成員
?靜態成員分為:
-靜態數據成員
-靜態函數成員
?靜態成員由類的所有對象共享
(不屬于某個對象)
§5.5特殊的類成員
?彳列:要記錄FILE類中有多少個文件對象
classFILE
(
public:
staticintget_file_number()〃靜態成員函數
{——
returnfilenumber;
}"
private:
staticintfilenumber;〃靜態數據成員
};
§5.5特殊的類成員
?理解靜態成員
§5.5特殊的類成員
靜態成員的使用
⑴靜態成員的初始化必須在全局范圍進行
intFILE::file_number=O;
classFILE
(
private:\/
staticintfilenumber=O;X
);A
voidmain()
intFILE::file_number=O;
§5.5特殊的類成員
⑵靜態數據成員可以由所有成員函數訪問
voidFILE::incFileNum()
(
file_number++;
}"
⑶靜態成員函數只可以訪問靜態數據成員
staticintget_file_number()〃靜態成員函數
cout?file_name;V//是對象的特征
returnfile_number;\/
§5.5特殊的類成員
靜態成員的用途
記錄對象個數(用來保存流動變化的對象個數)
一般在構造函數中增加,析構函數中遞減
所有對象共享資源(它不屬于某個對象)
如:內存,文件,數據庫,打印機等
?例:分析程序執行結果
#include<iostream.h>
classMYCLASS
public:
MYCLASS(inta,intb,intc);
voidget_number();
voidget_sum();
private:
intx,y,z;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣播影視編導專業多媒體應用實習總結范文
- 部編版2025三年級語文上冊知識梳理復習計劃
- 康復器材配套醫用防撞扶手安裝工藝流程
- 部編版語文三年級下冊聽力提升復習計劃
- 高一第二學期班主任班級團建活動計劃
- 以形助數:面積法在小學數學教學中的多維應用與實踐探索
- 以太極之柔筑后勤之健:太極拳對聊城大學后勤集團員工身心健康的影響探究
- 以墨為韻:初中階段中國畫教學的價值挖掘與實踐創新
- 2025年部編人教版初一語文上冊教學資源開發計劃
- 2025語文高考漫畫《學前班》審題范文
- LED照明有關國家標準及對應國際標準
- 實驗訓練2數據查詢操作
- 物理-貴州省畢節市2024年畢節市高二年級下學期7月期末聯考試題和答案
- 文創產品定制合同范本
- 科普版四年級上冊英語全冊同步練習
- 2024年巴西血液透析膜市場機會及渠道調研報告
- 理工英語4-02-國開機考參考資料
- 小升初真題卷(七)(江蘇卷)(試題)- 2023-2024學年六年級下冊數學蘇教版
- 《中國噬血細胞綜合征診斷與治療指南(2022年版)》解讀
- 生活飲用水管道分質直飲水衛生規范
- 人教版六年級數學上冊《全冊完整》課件
評論
0/150
提交評論