面向?qū)ο蟮某绦蛟O計chapter3_第1頁
面向?qū)ο蟮某绦蛟O計chapter3_第2頁
面向?qū)ο蟮某绦蛟O計chapter3_第3頁
面向?qū)ο蟮某绦蛟O計chapter3_第4頁
面向?qū)ο蟮某绦蛟O計chapter3_第5頁
已閱讀5頁,還剩84頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1第第3 3章章 類和對象類和對象2主要內(nèi)容主要內(nèi)容1.1. 類類2.2. 對象對象3.3. 對象成員變量對象成員變量4.4. 內(nèi)部類內(nèi)部類5.5. staticstatic成員成員6.6. 自引用對象指針自引用對象指針thisthis7.7. 設計舉例設計舉例gogo33.1 3.1 類類1.1.類的定義類的定義類是對具有相同屬性和相同行為的客觀世界的一組類是對具有相同屬性和相同行為的客觀世界的一組相似對象的抽象。相似對象的抽象。類的定義形式為:類的定義形式為: classclass 類名類名 private:private: protected:protected: public:publ

2、ic: ; ;類的作用域類的作用域43.1 3.1 類類1.1. 類的定義類的定義 訪問權限關鍵字訪問權限關鍵字private-private-說明的成員只能在該類中使用,說明的成員只能在該類中使用,即在類的外面不能直接訪問即在類的外面不能直接訪問 private private 成員,成員,類的默認訪問權限為類的默認訪問權限為privateprivate。public-public-說明的成員不但可以在該類中使說明的成員不但可以在該類中使用,而且其他的函數(shù)或類可以直接訪問用,而且其他的函數(shù)或類可以直接訪問 pubpubliclic成員。成員。protected-protected-說明的成員

3、可以在該類中使用,說明的成員可以在該類中使用,也可以在其也可以在其派生類派生類中使用,但其他函數(shù)或類中使用,但其他函數(shù)或類不能直接訪問不能直接訪問 protected protected 成員。成員。53.1 3.1 類類例如:例如:class firstclass private: int x; /只能在只能在 firstclass類中使用類中使用 public: void set(int xx) x=xx; int get() return x; ; 63.1 3.1 類類例例3.1 3.1 設計復數(shù)類設計復數(shù)類 class complex float real, imag; public

4、: complex(float x=0, float y=0)real = x; imag = y; complex() complex add(complex x) complex z; z.real = real + x.real; z.imag = imag + x.imag; return z; ;73.1 3.1 類類1.1.成員變量成員變量成員變量的定義成員變量的定義 成員變量可用任何成員變量可用任何c+c+的基本數(shù)據(jù)類型、用戶的基本數(shù)據(jù)類型、用戶自定義數(shù)據(jù)類型、自定義數(shù)據(jù)類型、c+c+的基本類類型或用戶自的基本類類型或用戶自定義的類類型定義。定義的類類型定義。 成員變量定義不能遞

5、歸,即不能用自身類的實成員變量定義不能遞歸,即不能用自身類的實例化對象作為該類的成員變量。如下定義類例化對象作為該類的成員變量。如下定義類a a是是錯誤錯誤的:的: class aclass a private: private: a x; a x; ; ;83.1 3.1 類類1.1.成員變量成員變量 成員變量的初始化成員變量的初始化 成員變量不能在定義時初始化成員變量不能在定義時初始化,成員變量的初,成員變量的初始化是在具體對象創(chuàng)建時由構造函數(shù)完成的。始化是在具體對象創(chuàng)建時由構造函數(shù)完成的。 類的定義僅僅給出成員的類型,并不實際分配類的定義僅僅給出成員的類型,并不實際分配存儲空間,只有創(chuàng)建

6、了該類的一個實例(具體存儲空間,只有創(chuàng)建了該類的一個實例(具體對象)后,才能為對象內(nèi)部的成員分配空間。對象)后,才能為對象內(nèi)部的成員分配空間。93.1 3.1 類類1.1. 成員變量成員變量 成員變量的初始化成員變量的初始化例如:例如:class c private: int n=0; /error int rint=0; /error ;103.1 3.1 類類1.1.成員函數(shù)成員函數(shù)基本概念基本概念成員函數(shù)是聲明在類內(nèi)的一種函數(shù),成員函數(shù)是聲明在類內(nèi)的一種函數(shù),publicpublic訪問訪問權限的成員函數(shù)是一類對外部程序的公共接口。權限的成員函數(shù)是一類對外部程序的公共接口。成員函數(shù)可以訪

7、問同一個類中的任何訪問權限的成員函數(shù)可以訪問同一個類中的任何訪問權限的成員變量,也可以調(diào)用同一個類中的任何訪問權限成員變量,也可以調(diào)用同一個類中的任何訪問權限的其他成員函數(shù),但構造函數(shù)和析構函數(shù)除外。的其他成員函數(shù),但構造函數(shù)和析構函數(shù)除外。成員函數(shù)包括兩種:成員函數(shù)包括兩種: 構造函數(shù)和析構函數(shù)構造函數(shù)和析構函數(shù) 其它成員函數(shù)其它成員函數(shù)113.1 3.1 類類1.1. 成員函數(shù)成員函數(shù) 成員函數(shù)的定義成員函數(shù)的定義內(nèi)聯(lián)函數(shù)形式內(nèi)聯(lián)函數(shù)形式1 1class aclass a 返回類型返回類型 成員函數(shù)名(形參表)成員函數(shù)名(形參表) 函數(shù)體;函數(shù)體; ;例如:例如:123.1 3.1 類類c

8、lass complex float real; float imag; public: complex(float x=0, float y=0)real = x; imag = y; complex() complex add(complex x) complex z; z.real = real + x.real; z.imag = imag + x.imag; return z; ;133.1 3.1 類類1.1. 成員函數(shù)成員函數(shù) 成員函數(shù)的定義成員函數(shù)的定義內(nèi)聯(lián)函數(shù)形式內(nèi)聯(lián)函數(shù)形式2 2class aclass a 返回類型返回類型 成員函數(shù)名成員函數(shù)名( (形參表形參表););i

9、nline inline 返回類型返回類型 類名類名: 成員函數(shù)名成員函數(shù)名( (形參表形參表) ) 函數(shù)體;函數(shù)體; 例如:例如:143.1 3.1 類類1.1. 奪奪class complex float real; float imag; public: complex(float x=0, float y=0)real = x; imag = y; complex() complex add(complex x);inline complex complex:add(complex x)153.1 3.1 類類1.1. 成員函數(shù)成員函數(shù) 成員函數(shù)的定義成員函數(shù)的定義外聯(lián)函數(shù)形式:外聯(lián)函

10、數(shù)形式:class aclass a 返回類型返回類型 成員函數(shù)名成員函數(shù)名( (形參表形參表););返回類型返回類型 類名類名: 成員函數(shù)名成員函數(shù)名( (形參表形參表) ) 函數(shù)體;函數(shù)體; 163.1 3.1 類類3.3. 成員函數(shù)成員函數(shù)成員函數(shù)重載成員函數(shù)重載基本概念基本概念成員函數(shù)重載就是允許多個功能類似的成員成員函數(shù)重載就是允許多個功能類似的成員函數(shù)使用同一個函數(shù)名。當一個對象收到兩函數(shù)使用同一個函數(shù)名。當一個對象收到兩個或多個相同消息時,則因調(diào)用成員函數(shù)時個或多個相同消息時,則因調(diào)用成員函數(shù)時的參數(shù)個數(shù)或參數(shù)類型不同,而有不同的操的參數(shù)個數(shù)或參數(shù)類型不同,而有不同的操作結果。作

11、結果。173.1 3.1 類類3.3.成員函數(shù)成員函數(shù) 成員函數(shù)重載成員函數(shù)重載 成員函數(shù)重載的設計要求成員函數(shù)重載的設計要求 重載的多個成員函數(shù)之間參數(shù)個數(shù)或類型重載的多個成員函數(shù)之間參數(shù)個數(shù)或類型要有所不同。要有所不同。 函數(shù)返回值類型不同不能作為重載依據(jù)。函數(shù)返回值類型不同不能作為重載依據(jù)。 構造函數(shù)和所有成員函數(shù)都可以重載。構造函數(shù)和所有成員函數(shù)都可以重載。183.1 3.1 類類1.1. 構造函數(shù)構造函數(shù) 基本概念基本概念構造函數(shù)是一個特殊的成員函數(shù),主要用于構造函數(shù)是一個特殊的成員函數(shù),主要用于為對象分配空間為對象分配空間。每當創(chuàng)建對象時,系統(tǒng)都自動調(diào)用構造函數(shù),每當創(chuàng)建對象時,系

12、統(tǒng)都自動調(diào)用構造函數(shù),用來用來設置該對象的成員變量的初始數(shù)據(jù)值設置該對象的成員變量的初始數(shù)據(jù)值。193.1 3.1 類類1.1.構造函數(shù)構造函數(shù)構造函數(shù)聲明構造函數(shù)聲明構造函數(shù)的訪問權限一定是構造函數(shù)的訪問權限一定是publicpublic。構造函數(shù)名一定要和類名相同。構造函數(shù)名一定要和類名相同。構造函數(shù)不能有返回類型,也不能是構造函數(shù)不能有返回類型,也不能是voidvoid類型。類型。例如:例如:class complex float real; float imag; public: complex(float x=0, float y=0) real = x; imag = y; ;20

13、3.1 3.1 類類1.1.構造函數(shù)構造函數(shù)構造函數(shù)重載構造函數(shù)重載一個類中可以有多個參數(shù)個數(shù)或參數(shù)類型不同的一個類中可以有多個參數(shù)個數(shù)或參數(shù)類型不同的構造函數(shù)。構造函數(shù)。1)1) 缺省參數(shù)的構造函數(shù)缺省參數(shù)的構造函數(shù)無參數(shù)或參數(shù)全為無參數(shù)或參數(shù)全為缺省值缺省值. .例如:例如:complex();complex();complex(doublecomplex(double r = 0.0, double i = 0.0); r = 0.0, double i = 0.0);213.1 3.1 類類1.1. 構造函數(shù)構造函數(shù) 構造函數(shù)重載構造函數(shù)重載2)2) 帶參構造函數(shù)帶參構造函數(shù)參數(shù)中至少

14、有一個不是缺參數(shù)中至少有一個不是缺省值省值. .例如:例如:complex(doublecomplex(double r, double i); r, double i);223.1 3.1 類類1.1. 構造函數(shù)構造函數(shù) 構造函數(shù)重載構造函數(shù)重載3)3) 拷貝構造函數(shù)拷貝構造函數(shù)參數(shù)是一個已有初始化數(shù)參數(shù)是一個已有初始化數(shù)值的值的對象對象。作用:將用作實參的對象的每一個成員變量的作用:將用作實參的對象的每一個成員變量的值都復制到新建的同類對象中。值都復制到新建的同類對象中。233.1 3.1 類類4.4. 構造函數(shù)構造函數(shù) 拷貝構造函數(shù)拷貝構造函數(shù)自定義拷貝構造函數(shù)自定義拷貝構造函數(shù)一般形式

15、為:一般形式為:classname(constclassname(const classnameclassname &ob) &ob) 例如:例如:class point int x, y;public: point(int a, int b) x = a; y = b; point(const point &p) x = p.x; y = p.y;243.1 3.1 類類4.4.構造函數(shù)構造函數(shù)拷貝構造函數(shù)拷貝構造函數(shù) 缺省拷貝構造函數(shù)缺省拷貝構造函數(shù)如果沒有編寫自定義的拷貝構造函數(shù),如果沒有編寫自定義的拷貝構造函數(shù),c+c+會會自動地將一個已存在的對象復制給新對象。自動地將一個已存在的對象

16、復制給新對象。例如:例如:class point int x, y;public: point(int a, int b) x = a; y = b;point p1(30, 40);point p2(p1); point p3 = p1;253.1 3.1 類類4.4.構造函數(shù)構造函數(shù)拷貝構造函數(shù)拷貝構造函數(shù) 系統(tǒng)提供默認拷貝構造函數(shù)的條件是系統(tǒng)提供默認拷貝構造函數(shù)的條件是不存在不存在下下列任意一種情況:列任意一種情況:1)1)類中有類中有constconst成員;成員;2)2)類中有引用類型成員;類中有引用類型成員;3)3)類或它的基類中有私有拷貝構造函類或它的基類中有私有拷貝構造函數(shù)。數(shù)

17、。263.1 3.1 類類4.4.構造函數(shù)構造函數(shù)拷貝構造函數(shù)拷貝構造函數(shù)拷貝構造函數(shù)的特點拷貝構造函數(shù)的特點 拷貝構造函數(shù)名與類同名,不指定函數(shù)的返拷貝構造函數(shù)名與類同名,不指定函數(shù)的返回值類型,具有一般構造函數(shù)的所有特性。回值類型,具有一般構造函數(shù)的所有特性。 拷貝構造函數(shù)只有一個參數(shù),且是對某個對拷貝構造函數(shù)只有一個參數(shù),且是對某個對象的引用。象的引用。 每個類都必須有一個拷貝構造函數(shù),如果類每個類都必須有一個拷貝構造函數(shù),如果類中沒有定義拷貝構造函數(shù),編譯系統(tǒng)會自動中沒有定義拷貝構造函數(shù),編譯系統(tǒng)會自動生成一個缺省拷貝構造函數(shù),作為該類的公生成一個缺省拷貝構造函數(shù),作為該類的公有成員。

18、有成員。273.1 3.1 類類4.4. 構造函數(shù)構造函數(shù) 拷貝構造函數(shù)拷貝構造函數(shù)舉例舉例class date int day;public: date(int d=0): day(d) date(date &d) day = d.day; date(void) void printdate(void) const coutdayendl; ; date today(23);date someday;date someday2(today);283.1 3.1 類類1.1. 構造函數(shù)構造函數(shù) 初始化表初始化表初始化表的格式初始化表的格式成員變量名成員變量名( (初始值初始值), ), , ,

19、 成員變量名成員變量名( (初始值初始值) )其位置在構造函數(shù)頭部的后面,中間用其位置在構造函數(shù)頭部的后面,中間用“:”與構造函數(shù)頭部連接的部分稱為初始化表與構造函數(shù)頭部連接的部分稱為初始化表。293.1 3.1 類類1.1.構造函數(shù)構造函數(shù)初始化表初始化表 為什么要使用初始化表為什么要使用初始化表? ?初始化只能初始化只能在構造函數(shù)中在構造函數(shù)中進行,但對于常進行,但對于常量類型量類型(const)(const)和引用類型和引用類型(&)(&)的成員變量的成員變量以及對象成員,又不能在構造函數(shù)中用賦以及對象成員,又不能在構造函數(shù)中用賦值語句直接賦值,因此值語句直接賦值,因此c+c+提供了初始

20、化表提供了初始化表的的置初值置初值方式方式 。303.1 3.1 類類1.1.構造函數(shù)構造函數(shù)初始化表初始化表初始化表中成員變量的初始化順序初始化表中成員變量的初始化順序不論在初始化表中用什么順序初始化類的成不論在初始化表中用什么順序初始化類的成員,編譯器都會按成員在類定義時聲明的順員,編譯器都會按成員在類定義時聲明的順序做初始化。所以初始化表的順序?qū)嶋H不起序做初始化。所以初始化表的順序?qū)嶋H不起作用,但打亂順序會造成閱讀和理解上的混作用,但打亂順序會造成閱讀和理解上的混淆。淆。例如:例如:313.1 3.1 類類#include class a int x; int ℞ const fl

21、oat pi;public: a(int x1):rx(x),pi(3.14) x = x1; void print() coutx=xendl; coutrx=rxendl; coutpi=piendl; ;void main()a a(10);a.print();程序運行結果:程序運行結果:x=10rx=10pi=3.14323.1 3.1 類類1.1.析構函數(shù)析構函數(shù)基本概念基本概念在一個類中,也可以存在用在一個類中,也可以存在用newnew運算符動態(tài)申請內(nèi)存空運算符動態(tài)申請內(nèi)存空間的語句。這種內(nèi)存空間是在外部程序創(chuàng)建對象的過間的語句。這種內(nèi)存空間是在外部程序創(chuàng)建對象的過程中動態(tài)進行的,

22、系統(tǒng)無法知道其大小和具體地址,程中動態(tài)進行的,系統(tǒng)無法知道其大小和具體地址,這些動態(tài)申請的內(nèi)存空間也不會隨著外部程序?qū)ο笳歼@些動態(tài)申請的內(nèi)存空間也不會隨著外部程序?qū)ο笳加每臻g的釋放而自動釋放。用空間的釋放而自動釋放。 析構函數(shù)是一個特殊的成員函數(shù),每當程序中創(chuàng)建的析構函數(shù)是一個特殊的成員函數(shù),每當程序中創(chuàng)建的對象脫離其作用域時(例如對象所在的函數(shù)已調(diào)用完對象脫離其作用域時(例如對象所在的函數(shù)已調(diào)用完畢),系統(tǒng)將自動調(diào)用析構函數(shù)。析構函數(shù)一般用來畢),系統(tǒng)將自動調(diào)用析構函數(shù)。析構函數(shù)一般用來做做“清理善后清理善后” ” 的工作,主要是完成動態(tài)申請內(nèi)存空的工作,主要是完成動態(tài)申請內(nèi)存空間的釋放,以

23、及其他一些掃尾工作。間的釋放,以及其他一些掃尾工作。333.1 3.1 類類1.1. 析構函數(shù)析構函數(shù) 析構函數(shù)的說明析構函數(shù)的說明類名類名();();析構函數(shù)不能帶任何參數(shù),不能有返回析構函數(shù)不能帶任何參數(shù),不能有返回類型(類型(voidvoid也不允許)。也不允許)。一個類中只能有一個類中只能有一個一個析構函數(shù)。析構函數(shù)。343.1 3.1 類類1.1. 析構函數(shù)析構函數(shù) 注意事項注意事項如果類中用如果類中用newnew運算符動態(tài)申請了內(nèi)存空間,運算符動態(tài)申請了內(nèi)存空間,則該類的析構函數(shù)一定不能為空。此時,析則該類的析構函數(shù)一定不能為空。此時,析構函數(shù)應該設計用構函數(shù)應該設計用delete

24、delete運算符釋放動態(tài)申運算符釋放動態(tài)申請的內(nèi)存空間。另外,凡是調(diào)用請的內(nèi)存空間。另外,凡是調(diào)用deletedelete運算運算符時,系統(tǒng)也將自動調(diào)用析構函數(shù)。符時,系統(tǒng)也將自動調(diào)用析構函數(shù)。如果需要析構函數(shù)完成一些特殊的掃尾工作,如果需要析構函數(shù)完成一些特殊的掃尾工作,則這些工作可以在析構函數(shù)中完成。則這些工作可以在析構函數(shù)中完成。353.1 3.1 類類1.1. 析構函數(shù)析構函數(shù)例例3.4 3.4 設計一個簡單的動態(tài)數(shù)組類。設計一個簡單的動態(tài)數(shù)組類。class array double *arr; int size;public: array(int sz=100); array(vo

25、id);;363.1 3.1 類類array:array(int sz) if(sz=0) cout“參數(shù)錯參數(shù)錯!”endl; exit(0); size = sz; arr = new doublesize;array:array(void) deletearr; void main() array a(10); 373.1 3.1 類類1.1.constconst修飾符修飾符constconst修飾符的作用修飾符的作用 用用constconst來定義變量,如來定義變量,如: :const const intint maxsizemaxsize = 100 = 100; 宏定義命令定義的常

26、量的作用域是從定義處宏定義命令定義的常量的作用域是從定義處到文件結束,或到用宏定義命令到文件結束,或到用宏定義命令# #undefundef取消取消其定義時為止;其定義時為止; 用用constconst定義變量可在文件內(nèi)、函數(shù)內(nèi)或塊定義變量可在文件內(nèi)、函數(shù)內(nèi)或塊內(nèi)。內(nèi)。383.1 3.1 類類1.1.constconst修飾符修飾符constconst修飾符的作用修飾符的作用 修飾成員函數(shù)參數(shù)修飾成員函數(shù)參數(shù)當成員函數(shù)的某個參數(shù)修飾為當成員函數(shù)的某個參數(shù)修飾為constconst時,表示時,表示該參數(shù)在成員函數(shù)內(nèi)不會,也不能被修改。該參數(shù)在成員函數(shù)內(nèi)不會,也不能被修改。 修飾成員函數(shù)修飾成員函

27、數(shù)當當constconst修飾成員函數(shù)時,關鍵字修飾成員函數(shù)時,關鍵字constconst通常通常放在成員函數(shù)定義的最后面,表示限制該成放在成員函數(shù)定義的最后面,表示限制該成員函數(shù)只能讀取而不能修改當前對象的成員員函數(shù)只能讀取而不能修改當前對象的成員變量。變量。393.2 3.2 對象對象1.1. 類與對象的關系類與對象的關系 在在c+c+中,類是創(chuàng)建對象時的模板,對象是類中,類是創(chuàng)建對象時的模板,對象是類的實際變量,也稱為類的實例。的實際變量,也稱為類的實例。 對象是一個引用類型,對象名是指向系統(tǒng)所分對象是一個引用類型,對象名是指向系統(tǒng)所分配內(nèi)存空間首地址的引用(或別名)。配內(nèi)存空間首地址的

28、引用(或別名)。例如:例如:complex x(1, 2);complex x(1, 2);成員函數(shù)指針成員函數(shù)指針2 21 1x403.2 3.2 對象對象2.2. 對象的定義對象的定義利用構造函數(shù)創(chuàng)建對象有兩種方法:利用構造函數(shù)創(chuàng)建對象有兩種方法: () * * = new = new ()例如:創(chuàng)建復數(shù)類例如:創(chuàng)建復數(shù)類complexcomplex的一個對象的一個對象x xcomplex x(1, 2); complex x(1, 2); 或或 complex complex * *x = new complex(1, 2);x = new complex(1, 2);413.2 3.2

29、 對象對象3.3.constconst對象對象c+c+語言可以限定對象為語言可以限定對象為constconst。constconst對象只能通過構造函數(shù)有一次初始化賦對象只能通過構造函數(shù)有一次初始化賦值。值。const complex x(1, 2);const complex x(1, 2);x.setreal(10);x.setreal(10);/error/errorx.setimage(20);x.setimage(20);/error/errorconstconst對象只能調(diào)用返回值類型限定為對象只能調(diào)用返回值類型限定為constconst的的公有成員函數(shù),不能調(diào)用非公有成員函數(shù),不

30、能調(diào)用非constconst的成員函數(shù)。的成員函數(shù)。423.2 3.2 對象對象4.4. 類成員的訪問權限對對象操作的限制類成員的訪問權限對對象操作的限制 若某個類成員定義為若某個類成員定義為publicpublic訪問權限,則允許訪問權限,則允許外部程序訪問該成員。外部程序訪問該成員。 若某個類成員定義為若某個類成員定義為privateprivate訪問權限,則只訪問權限,則只允許該類本身的成員函數(shù)訪問這些成員,即為允許該類本身的成員函數(shù)訪問這些成員,即為類的封裝或信息隱藏。類的封裝或信息隱藏。例如:例如:complex x(1, 2), y(3, 4), z1, z2;complex x(

31、1, 2), y(3, 4), z1, z2;z1=x.add(yz1=x.add(y););x.realx.real = 10; = 10; /error/error433.2 3.2 對象對象1.1. 類成員的訪問權限對對象操作的限制類成員的訪問權限對對象操作的限制 外部程序?qū)λ接谐蓡T變量的訪問通過設計相應外部程序?qū)λ接谐蓡T變量的訪問通過設計相應的的publicpublic成員函數(shù)來實現(xiàn)。成員函數(shù)來實現(xiàn)。例例3.8 3.8 重新設計復數(shù)類。重新設計復數(shù)類。public:public:float float getreal(voidgetreal(void) const;) const;fl

32、oat float getimag(voidgetimag(void) const;) const;void void setreal(constsetreal(const float x); float x);void void setimag(constsetimag(const float y); float y);通過通過setset方法和方法和getget方法,可以增強對類中成員方法,可以增強對類中成員變量權限設置的靈活性。變量權限設置的靈活性。443.2 3.2 對象對象5.5.對象的種類對象的種類對象按作用域不同可分為四種:對象按作用域不同可分為四種: 全局對象全局對象在主程序執(zhí)

33、行之前構造。在主程序執(zhí)行之前構造。 局部對象局部對象 塊對象塊對象 動態(tài)對象動態(tài)對象執(zhí)行運算符執(zhí)行運算符newnew時被創(chuàng)建時被創(chuàng)建; ;執(zhí)行運算符執(zhí)行運算符deletedelete時被撤消。時被撤消。453.2 3.2 對象對象5.5.對象的種類對象的種類例例: : 用用newnew運算符創(chuàng)建運算符創(chuàng)建complexcomplex類的對象類的對象x,x,對象對象y y。complex complex * *x = new complex(1,2);x = new complex(1,2);complex complex * *y;y;y = new complex(3,4);y = new

34、complex(3,4);463.2 3.2 對象對象6.6.對象的引用對象的引用對象的引用是指對對象的引用是指對對象成員的引用對象成員的引用,外部程序外部程序(外部(外部函數(shù))只能通過向該對象發(fā)消息才能訪問該對象的函數(shù))只能通過向該對象發(fā)消息才能訪問該對象的公公有有成員變量和成員函數(shù)。成員變量和成員函數(shù)。一般引用格式如下:一般引用格式如下:使用點運算符使用點運算符(.)(.):對象名對象名. .成員成員complex x(1, 2); complex x(1, 2); x.setreal(10);x.setreal(10);使用指針運算符(使用指針運算符(-):):指向?qū)ο蟮闹羔樦赶驅(qū)ο蟮闹?/p>

35、針-成員成員complex complex * *x = new complex(1, 2);x = new complex(1, 2);complex y(3, 4), z;complex y(3, 4), z;z = x-z = x-add(yadd(y););473.3 3.3 對象成員變量對象成員變量1.1. 對象模式中的整體對象模式中的整體-部分模式部分模式 表示了一個整體對象概念是由若干個部分對象表示了一個整體對象概念是由若干個部分對象概念以某種方式組合構成的。概念以某種方式組合構成的。 用面向?qū)ο蟪绦蛘Z言表達即先定義表示部分概用面向?qū)ο蟪绦蛘Z言表達即先定義表示部分概念的類,再定義

36、表示整體對象的類,并在其中念的類,再定義表示整體對象的類,并在其中定義部分對象類類型的成員變量。定義部分對象類類型的成員變量。 對象成員變量對象成員變量若一個類的成員變量是另一個類的對象,則若一個類的成員變量是另一個類的對象,則該成員變量稱對象成員變量。該成員變量稱對象成員變量。483.3 3.3 對象成員變量對象成員變量例例3.10 3.10 設計一個線段類。設計一個線段類。class pointprivate: int x; int y;public: point(int a, int b): x(a), y(b) point(point &c): x(c.x), y(c.y) point

37、(void) ;class lineprivate: point a;/對象成員變量對象成員變量 point b;493.3 3.3 對象成員變量對象成員變量2.2. 外層類的構造函數(shù)外層類的構造函數(shù) 如何實現(xiàn)外層類的構造函數(shù)?如何對其子對象如何實現(xiàn)外層類的構造函數(shù)?如何對其子對象進行初始化?進行初始化? 初始化具體有兩種方法:初始化具體有兩種方法:顯式調(diào)用相應的拷貝構造函數(shù)為子對象顯式調(diào)用相應的拷貝構造函數(shù)為子對象賦初值。例賦初值。例3.113.11的構造函數(shù)的構造函數(shù)1 1即為此種設即為此種設計方法。計方法。顯式調(diào)用相應的的構造函數(shù)為子對象賦顯式調(diào)用相應的的構造函數(shù)為子對象賦初值。例初值。

38、例3.113.11的構造函數(shù)的構造函數(shù)2 2即為此種設計即為此種設計方法。方法。503.3 3.3 對象成員變量對象成員變量例例3.11 3.11 設計一個線段類。設計一個線段類。class pointprivate: int x; int y;public: point(int a, int b):x(a), y(b) point(point &c):x(c.x), y(c.y) point(void) int getx(void) const return x; int gety(void) const return y; ;513.3 3.3 對象成員變量對象成員變量class line

39、private: point a;/對象成員變量對象成員變量 point b;public: line(point &aa, point &bb):a(aa), b(bb) line(int a1, int b1, int a2, int b2) :a(a1, b1), b(a2, b2) line(void) void showa(void) const cout“(“a.getx()“,”a.gety()“)”endl; ;523.3 3.3 對象成員變量對象成員變量void main() point a(10, 10), b(50, 50); line myline1(a, b); my

40、line1.showa(): myline1.showb(); line myline2(1, 1, 5, 5); myline2.showa(); myline2.showb();程序運行結果:程序運行結果:(10, 10)(50, 50)(1, 1)(5, 5)533.3 3.3 對象成員變量對象成員變量1.1. 構造函數(shù)和析構函數(shù)的調(diào)用過程構造函數(shù)和析構函數(shù)的調(diào)用過程 對于整體對于整體部分對象模式,部分對象模式, 當創(chuàng)建整體類對象時,要通過顯式調(diào)用部分類的當創(chuàng)建整體類對象時,要通過顯式調(diào)用部分類的構造函數(shù)完成對子對象的初始化賦值;構造函數(shù)完成對子對象的初始化賦值; 當所創(chuàng)建整體類對象超出

41、其作用域要被撤銷時,當所創(chuàng)建整體類對象超出其作用域要被撤銷時,系統(tǒng)要自動調(diào)用部分類的析構函數(shù)。系統(tǒng)要自動調(diào)用部分類的析構函數(shù)。543.3 3.3 對象成員變量對象成員變量1.1. 構造函數(shù)和析構函數(shù)自動調(diào)用過程構造函數(shù)和析構函數(shù)自動調(diào)用過程例:以例:以pointpoint類和類和lineline類為例子測試構造函數(shù)和析類為例子測試構造函數(shù)和析構函數(shù)自動調(diào)用過程。構函數(shù)自動調(diào)用過程。class point int x; int y;public: point(int a, int b):x(a), y(b) cout“類類point構造構造函數(shù)調(diào)用函數(shù)調(diào)用”endl; point(point &

42、p):x(p.x), y(p.y)/拷貝構造函數(shù)拷貝構造函數(shù) cout“類類point拷貝拷貝構造函數(shù)調(diào)用構造函數(shù)調(diào)用”endl; point(void) cout“類類point析構函數(shù)調(diào)用析構函數(shù)調(diào)用”endl; ;553.3 3.3 對象成員變量對象成員變量1.1. 構造函數(shù)和析構函數(shù)自動調(diào)用過程構造函數(shù)和析構函數(shù)自動調(diào)用過程class line point a; point b; /對象成員變量對象成員變量public: line(int a1,int b1,int a2,int b2):a(a1, b1), b(a2, b2) cout“類類line構造構造函數(shù)函數(shù)1 1調(diào)用調(diào)用”e

43、ndl; line(point &aa, point &bb):a(aa), b(bb) cout“類類line構造構造函數(shù)函數(shù)2 2調(diào)用調(diào)用”endl; line(void) cout“類類line析析構函數(shù)調(diào)用構函數(shù)調(diào)用”endl ; ; 563.3 3.3 對象成員變量對象成員變量void main(void) line myline(1, 1, 5, 5); point a(1, 1), b(5, 5); line myline2(a, b);運行結果:運行結果:類類pointpoint構造函數(shù)調(diào)用構造函數(shù)調(diào)用類類pointpoint構造函數(shù)調(diào)用構造函數(shù)調(diào)用類類lineline構造函數(shù)

44、構造函數(shù)1 1調(diào)用調(diào)用類類pointpoint構造函數(shù)調(diào)用構造函數(shù)調(diào)用類類pointpoint構造函數(shù)調(diào)用構造函數(shù)調(diào)用類類pointpoint拷貝構造函數(shù)調(diào)用拷貝構造函數(shù)調(diào)用類類pointpoint拷貝構造函數(shù)調(diào)用拷貝構造函數(shù)調(diào)用類類lineline構造函數(shù)構造函數(shù)2 2調(diào)用調(diào)用類類lineline析構函數(shù)調(diào)用析構函數(shù)調(diào)用類類pointpoint析構函數(shù)調(diào)用析構函數(shù)調(diào)用類類pointpoint析構函數(shù)調(diào)用析構函數(shù)調(diào)用類類pointpoint析構函數(shù)調(diào)用析構函數(shù)調(diào)用類類pointpoint析構造函數(shù)調(diào)用析構造函數(shù)調(diào)用類類lineline析構函數(shù)調(diào)用析構函數(shù)調(diào)用類類pointpoint析構函數(shù)調(diào)用

45、析構函數(shù)調(diào)用類類pointpoint析構函數(shù)調(diào)用析構函數(shù)調(diào)用573.4 3.4 內(nèi)部類內(nèi)部類1.1.基本概念基本概念當類當類a a完全是為類完全是為類b b服務時,此時外部程序不需要,服務時,此時外部程序不需要,也沒有必要創(chuàng)建類也沒有必要創(chuàng)建類a a的對象時,類的對象時,類a a可以定義在類可以定義在類b b的內(nèi)部。的內(nèi)部。內(nèi)部類內(nèi)部類 把定義在另一個類中的類(如類把定義在另一個類中的類(如類a a)稱做內(nèi)部)稱做內(nèi)部類。類。外部類外部類 把封裝有內(nèi)部類的類(如類把封裝有內(nèi)部類的類(如類b b)稱做外部類。)稱做外部類。583.4 3.4 內(nèi)部類內(nèi)部類例例3.13 3.13 設計線段類,把設計

46、線段類,把pointpoint類定義為類定義為lineline類的類的內(nèi)部類。內(nèi)部類。class lineclass point public: int x, y; point(int inix=0, int iniy=0):x(inix), y(iniy) point(void) ;private: point a, b;593.4 3.4 內(nèi)部類內(nèi)部類public: line(int x1=0, int y1=0, int x2=0, int y2=0): a(x1, y1), b(x2, y2) line(void) void showa(void) const cout“a point

47、 is:(” a.x“,” a.y“)”endl; void showb(void) const cout“b point is:(” b.x“,” b.y“)”endl; ;603.4 3.4 內(nèi)部類內(nèi)部類1.1. 說明說明 內(nèi)部類對外部程序是不可見的。內(nèi)部類對外部程序是不可見的。 外部類無法直接訪問內(nèi)部類的私有成員。外部類無法直接訪問內(nèi)部類的私有成員。 內(nèi)部類無法直接訪問外部類的私有成員。內(nèi)部類無法直接訪問外部類的私有成員。line myline(0, 10, 50, 50);myline.showa();myline.showb();/point a(10, 10), b(50, 50)

48、; /error613.5 static 3.5 static 成員成員1.1. 問題引入問題引入 在面向?qū)ο蟪绦蛟O計時,有些特殊的成員不是在面向?qū)ο蟪绦蛟O計時,有些特殊的成員不是屬于具體的對象,而是屬于具體的對象,而是屬于整個類屬于整個類。 c+c+語言將這些成員定義為語言將這些成員定義為staticstatic來實現(xiàn),它可來實現(xiàn),它可以解決同一類的不同對象之間的數(shù)據(jù)和函數(shù)的以解決同一類的不同對象之間的數(shù)據(jù)和函數(shù)的共享問題。共享問題。623.5 static 3.5 static 成員成員1.1.問題引入問題引入應用舉例應用舉例 假設視頻游戲中有人物假設視頻游戲中有人物martmart和其他

49、太空人。和其他太空人。 當當martmart知道至少有知道至少有5 5個個martmart存在時,就要攻擊存在時,就要攻擊其他太空人。其他太空人。 如果如果martmart的人數(shù)少于的人數(shù)少于5 5個,個, martmart就會膽小而不就會膽小而不敢攻擊。因此每個敢攻擊。因此每個martmart需要知道需要知道m(xù)artcountmartcount。問題:問題:c+c+中如何使每個中如何使每個martmart得到得到martcountmartcount值?值?633.5 static 3.5 static 成員成員1.1.問題引入問題引入應用舉例應用舉例解決方法:解決方法: 在類在類martma

50、rt中提供一個中提供一個static static martcountmartcount成員成員變量,使其為類共享數(shù)據(jù)。變量,使其為類共享數(shù)據(jù)。 c+c+只需維護只需維護martcountmartcount的一個靜態(tài)副本。的一個靜態(tài)副本。643.5 static 3.5 static 成員成員2.2. staticstatic成員變量成員變量 定義為定義為staticstatic的成員變量稱作的成員變量稱作staticstatic成員變量。成員變量。 staticstatic成員變量可定義為成員變量可定義為privateprivate,也可定義,也可定義為為publicpublic。 stat

51、icstatic成員變量不能限定為成員變量不能限定為constconst,因為,因為constconst成員變量只能一次賦值,而成員變量只能一次賦值,而staticstatic成員變量可成員變量可能需要多次賦值。能需要多次賦值。653.5 static 3.5 static 成員成員2.2. staticstatic成員變量成員變量 staticstatic成員變量和非成員變量和非staticstatic成員變量的差別成員變量的差別 staticstatic成員變量是在編譯時分配存儲空間,成員變量是在編譯時分配存儲空間,直到整個程序執(zhí)行完才撤消。直到整個程序執(zhí)行完才撤消。 staticstat

52、ic成員變量的初始化是在編譯時進行的,成員變量的初始化是在編譯時進行的,一般在定義一般在定義staticstatic成員變量時要給出初始值。成員變量時要給出初始值。663.5 static 3.5 static 成員成員3.3. staticstatic成員變量的初始化成員變量的初始化 staticstatic成員變量屬于整個類,成員變量屬于整個類,為該類的所有對為該類的所有對象所共享象所共享。 必須在定義該類(含有必須在定義該類(含有staticstatic成員變量)的任成員變量)的任何對象之前何對象之前(或者說在全局作用域內(nèi)),單獨(或者說在全局作用域內(nèi)),單獨初始化初始化staicsta

53、ic成員變量。成員變量。 初始化格式:初始化格式: : = = ; ; 引用引用staticstatic成員變量的語法形式為:成員變量的語法形式為: : 673.5 static 3.5 static 成員成員4.4. staticstatic成員函數(shù)成員函數(shù) staticstatic成員函數(shù)專門用來實現(xiàn)對成員函數(shù)專門用來實現(xiàn)對staticstatic成員變成員變量的訪問,它是整個類的成員函數(shù),為該類的量的訪問,它是整個類的成員函數(shù),為該類的所有對象所共享。所有對象所共享。 staticstatic成員函數(shù)調(diào)用格式:成員函數(shù)調(diào)用格式: : : (););683.5 static 3.5 sta

54、tic 成員成員例例 3.14 3.14 設計一個職工類,說明設計一個職工類,說明staticstatic成員的使成員的使用方法。用方法。class employee char name30; float salary; static float allsalary;public: employee(char *n, float s) strcpy(name, n); salary = s; allsalary = allsalary+salary; 693.5 static 3.5 static 成員成員 employee(void) allsalary = allsalary salary

55、; static float getallsalary(void) return allsalary; ;/static成員變量的初始化成員變量的初始化float employee:allsalary = 0;703.5 static 3.5 static 成員成員程序運行結果程序運行結果: allsalaryallsalary=600=600void main(void)employee e1(zhang, 100);employee e2(wang, 200);employee e3(li, 300);float all; / static成員函數(shù)調(diào)用成員函數(shù)調(diào)用all = employe

56、e:getallsalary();coutallsalary=allendl;71#includeclass martint number;int lift_time;static int martcount;public:mart(int n, int l): number(n), lift_time(l) martcount+;void run();void jump();void attack();static int getcount() return martcount; ;游戲應用設計:游戲應用設計:72int mart:martcount = 0;void main()mart

57、mart1(1, 100), mart(2, 100);coutmart:getcount() this - 成員變量成員變量而在主函數(shù)內(nèi)不能使用對象而在主函數(shù)內(nèi)不能使用對象thisthis指針顯式調(diào)用指針顯式調(diào)用成員函數(shù)。成員函數(shù)。例例3.15 3.15 日期類的設計日期類的設計753.6 3.6 自引用對象指針自引用對象指針thisthisclass date int month; int day; int year;public: date(int month=0, int day=0, int year=0) this-month = month; / (*this).month =

58、month; this-day = day; this-year = year; void printdate(void) const coutmonth“-”day“-”yearthis-數(shù)據(jù)成員的方式。例如:數(shù)據(jù)成員的方式。例如:void void printdate(voidprintdate(void) const) const coutcoutmonth; month; 對每個成員函數(shù)的調(diào)用,加上一個附加的實參對每個成員函數(shù)的調(diào)用,加上一個附加的實參-被調(diào)用對象的地址。被調(diào)用對象的地址。today.printdate(&todaytoday.printdate(&today););803.7 3.7 設計舉例設計舉例例例3.16 3.16 銀行貸記卡系統(tǒng)的設計銀行貸記卡系統(tǒng)的設計貸記卡是指發(fā)卡銀行給予持

溫馨提示

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

評論

0/150

提交評論