《面向?qū)ο蟪绦蛟O(shè)計(jì)》PPT課件
《《面向?qū)ο蟪绦蛟O(shè)計(jì)》PPT課件》由會(huì)員分享,可在線閱讀,更多相關(guān)《《面向?qū)ο蟪绦蛟O(shè)計(jì)》PPT課件(173頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、緒 論,面向?qū)ο蟪绦蛟O(shè)計(jì): 通過(guò)增加軟件可擴(kuò)充性和可重用性來(lái)改善并提高程序員的生產(chǎn)能力,并控制維護(hù)軟件的復(fù)雜性和軟件維護(hù)的開(kāi)銷,OOP:具有結(jié)構(gòu)化程序設(shè)計(jì)的一切優(yōu)點(diǎn) 將數(shù)據(jù)和對(duì)數(shù)據(jù)的操作放在一起,作為一個(gè)相互依存、不可分割的一個(gè)整體,抽象成一種新的數(shù)據(jù)類型類 兩大技術(shù)(兩個(gè)重要原理) 數(shù) 據(jù) 抽 象 信 息 隱 藏,自行車類: (1)數(shù)據(jù):尺寸、顏色、材料等(屬 性) (2)操作:轉(zhuǎn)彎、移動(dòng)、修理等(操 作) 每一輛具體的自行車就是屬于自行車類的一個(gè)對(duì)象,OPP支持的軟件開(kāi)發(fā)策略 編寫可重用代碼 編寫可維護(hù)的代碼 共享代碼 精化已有的代碼,OOP的五
2、大基本概念 1對(duì)象(Object):數(shù)據(jù)及可以對(duì)這些數(shù)據(jù)施加的操作結(jié)合在一起所構(gòu)成的獨(dú)立實(shí)體的總稱,是計(jì)算的最基礎(chǔ)的構(gòu)造塊 成員變量(數(shù)據(jù)):表明對(duì)象的狀態(tài) 成員方法(操作):表明對(duì)象的行為 一組成員變量和相關(guān)的方法集合,2類(Class):對(duì)一組具有相同數(shù)據(jù)和相同操作的對(duì)象的描述(定義),依據(jù)共同的行為將有關(guān)對(duì)象進(jìn)行的一種分組 類中所有對(duì)象共享類中所有共同的特性 類是對(duì)象的抽象 程序中:只有類 對(duì)象是類的實(shí)例 運(yùn)行時(shí):只有對(duì)象,3實(shí)例(Instance):由某個(gè)特定類所描述的一個(gè)對(duì)象 通常,對(duì)象和類的實(shí)例是同義詞,4消息(Message):要求某個(gè)對(duì)象執(zhí)行類中所定義的某個(gè)操作的規(guī)格說(shuō)明,,5
3、方法(Method):對(duì)象所能執(zhí)行的操作 它是類中定義的函數(shù),描述對(duì)象執(zhí)行操作的算法,即響應(yīng)消息的方法,OOP方法學(xué)的四大要點(diǎn) 1認(rèn)為世界由各種對(duì)象(object)組成,任何事物都是對(duì)象,是某個(gè)對(duì)象類(class)的實(shí)例(instance) 2把所有對(duì)象都劃分成各種對(duì)象類,每個(gè)對(duì)象類都定義了一組方法(method),即允許施加于該類對(duì)象上的各種操作,3對(duì)象之間除了互相傳遞消息的聯(lián)系之外,再?zèng)]有其他聯(lián)系 4對(duì)象類將按照“類”、“子類”與“父類”的關(guān)系構(gòu)成一個(gè)層次結(jié)構(gòu)的系統(tǒng),OOP的三大核心特征 封裝性(Encapsulation) 繼承性(Inheritance) 多態(tài)性(Pol
4、ymorphism),1封裝性:數(shù)據(jù)和加工處理該數(shù)據(jù)的方法緊密結(jié)合在一起構(gòu)成黑匣子的整體 對(duì)私有數(shù)據(jù)不能執(zhí)行該對(duì)象的成員函數(shù)之外的任何其它函數(shù),2繼承性:一個(gè)類直接繼承其父類的全部描述(數(shù)據(jù)和函數(shù)) 繼承具有傳遞性: 若類C繼承類B,類B繼承類A,則類C繼承類A 類實(shí)際上繼承了類等級(jí)中在其上層的全部基類(父類)的所有描述,,繼承方式分類(一) 取代繼承:徒弟學(xué)會(huì)全部技術(shù),可以取 代師傅 包含繼承:水果是對(duì)象,蘋果是特殊的 水果,包含了水果具有的所 有特征 受限繼承:駝鳥(niǎo)是對(duì)象鳥(niǎo)的一個(gè)特例, 它不能繼承鳥(niǎo)會(huì)飛的特征 特化繼承:工程師是一類特殊的人,比
5、 一般人具有更多的特有信息,繼承方式分類(二) 單繼承:一個(gè)類只有一個(gè)父類時(shí) (樹(shù)結(jié)構(gòu)) 多繼承:一個(gè)類可有多個(gè)父類時(shí) (圖結(jié)構(gòu)),3多態(tài)性:在類等級(jí)的各層中共享(公用)一個(gè)行為(函數(shù))的名字,而類等級(jí)中的每個(gè)類卻各自按照自己的需要來(lái)實(shí)現(xiàn)這個(gè)行為 一個(gè)名字,多種語(yǔ)義 相同界面,多種實(shí)現(xiàn),函數(shù)重載表達(dá)了最簡(jiǎn)單的多態(tài)性 void f( int, int, char ); void f( char, float ) ; void f( int, int ) ; void f( float, float ); 參數(shù)數(shù)量、類型、順序不同,函數(shù)體也可以完全不同,OO
6、P的兩個(gè)重要原理 1數(shù)據(jù)抽象:通過(guò)從特定的實(shí)例中抽取共同性質(zhì)以形成一般化的概念的過(guò)程 強(qiáng)調(diào)部分特性(用戶所關(guān)心的特性) 忽略其他特性(用戶不關(guān)心的特性) 用戶:只關(guān)心做什么 , 不關(guān)心怎么做 OOP技術(shù)比任何一種編程技術(shù)都更強(qiáng)調(diào)抽象在軟件開(kāi)發(fā)中的重要性,2行為共享: (1)實(shí)體(模塊)的外部接口稱為行 為 (2)行為共享允許多個(gè)實(shí)體(模塊) 具有相同的接口集 (3)行為共享增強(qiáng)系統(tǒng)的靈活性 (4)行為共享增強(qiáng)系統(tǒng)的抽象,流 流是一個(gè)抽象的概念,它指的是數(shù)據(jù)從一個(gè)源(source)到一個(gè)終點(diǎn)(sink)的流動(dòng) c++提供四個(gè)預(yù)定義的開(kāi)放流,cin: 標(biāo)準(zhǔn)輸入,通常指鍵盤,對(duì)應(yīng)于
7、c中的stdin, cout:標(biāo)準(zhǔn)輸出,通常指屏幕,對(duì)應(yīng)于 c中的stdout cerr:標(biāo)準(zhǔn)錯(cuò)誤輸出,通常指屏幕,對(duì) 應(yīng)于c中的stderr clog:cerr的全緩沖版(c中沒(méi)有等價(jià) 的)cerr:無(wú)緩沖 clog:有緩沖,1const 比較 # define pai 3.1415927 預(yù)處理中的宏定義 const float pai=3.1415927 或者 float const pai=3.1415927 常量修飾符 pai是類型化的,有地址,可用指針指向它,,定義或說(shuō)明一個(gè)常數(shù)組可采用如下格式: const 或者 const int const a
8、5=1, 2, 3, 4, 5;,,常對(duì)象是指對(duì)象常量,定義格式如下: const 或者 const 定義常對(duì)象時(shí),同樣要進(jìn)行初始化,并且該對(duì)象不能再被更新,const與指針的組合使用,下面定義的一個(gè)指向字符串的常量指針: char * const prt1 = stringprt1; 其中,ptr1是一個(gè)常量指針。因此,下面賦值是非法的。 ptr1 = stringprt2; 而下面的賦值是合法的: *ptr1 = m; 因?yàn)橹羔榩tr1所指向的變量是可以更新的,不可更新的是常量指針ptr1所指的方向(別的字符,下面定義了一個(gè)指向字符串常量的指針: const char * ptr2 = s
9、tringprt1; 其中,ptr2是一個(gè)指向字符串常量的指針。ptr2所指向的字符串不能更新的,而ptr2是可以更新的。因此, *ptr2 = x; 是非法的,而: ptr2 = stringptr2; 是合法的。,(1)指向常量的指針: 指向的常量不能改變 1)const char * pc=”asdf”;//指向常量 的指針 pc3= a; //錯(cuò) pc=”ghik”; //對(duì) 2)const char * step3 =”left”,”right”,”top”; step 2=”skip”; //對(duì) step 21=i
10、; //錯(cuò),(2)常指針:指針本身不能改變,指向的對(duì)象可以改變 1)char * const pc=”asdf”; //常指針 pc3= a; //對(duì) pc =”ghik”; //錯(cuò) 2)char * const step 3 =“l(fā)eft”,”right”,”top”; step2=”skip”; //錯(cuò) step21=i; //對(duì),(3)指向常量的常指針:指針本身及指向的對(duì)象均不能改變 const char * const pc=”asdf”; //指向常量 的常指針 pc3= a; //錯(cuò) pc
11、=”ghik”; //錯(cuò),注意: (1)const總是修飾緊隨其后的東西 (2)指向常量的指針不能賦給一般 的指針,一般的指針可以賦給 指向常量的指針,2. 常引用 使用const修飾符也可以說(shuō)明引用,被說(shuō)明的引用為常引用,該引用所引用的對(duì)象不能被更新。其定義格式如下: const 在實(shí)際應(yīng)用中,常指針和常引用往往用來(lái)作函數(shù)的形參,這樣的參數(shù)稱為常參數(shù)。 在C++面向?qū)ο蟮某绦蛟O(shè)計(jì)中,指針和引用使用得較多,其中使用const修飾的常指針和常引用用得更多。使用常參數(shù)則表明該函數(shù)不會(huì)更新某個(gè)參數(shù)所指向或所引用的對(duì)象,這樣,在參數(shù)傳遞過(guò)程中就不需要執(zhí)行拷貝初始化構(gòu)造函數(shù),
12、這將會(huì)改善程序的運(yùn)行效率。,#include const int N = 6; void print(const int *p, int n); void main() int arrayN; for (int i=0; i cinarrayi; print(array, N); void print(const int *p, int n) cout<<<<*p; for (int i=1; i cout<<,<<*(p+i); cout<<< ,常成員函數(shù) 使用const關(guān)鍵字進(jìn)行說(shuō)明的成員函數(shù),稱為常成員函數(shù)。只有常成員函數(shù)才有資格操作常量或常對(duì)象,沒(méi)有使用const關(guān)鍵字說(shuō)明的成員函數(shù)
13、不能用來(lái)操作常對(duì)象。常成員函數(shù)說(shuō)明格式如下: () const; 其中,const是加在函數(shù)說(shuō)明后面的類型修飾符,它是函數(shù)類型的一個(gè)組成部分,因此,在函數(shù)實(shí)現(xiàn)部分也要帶const關(guān)鍵字。下面舉一例子說(shuō)明常成員函數(shù)的特征。,#include class R public: R(int r1, int r2) R1=r1; R2=r2; void print(); void print() const; private: int R1, R2; ;,void R::print() cout< void R::print() const cout< void main() R a(5, 4); a.
14、print(); const R b(20, 52); b.print(); 該例子的輸出結(jié)果為: 5,4 20;52,,2Inline 內(nèi)聯(lián)函數(shù) 包含在類的說(shuō)明中的成員函數(shù)稱為內(nèi)部函數(shù) 它告訴編譯器一旦有可能就直接用該函數(shù)的代碼取代對(duì)該函數(shù)的調(diào)用,以避免函數(shù)調(diào)用的開(kāi)銷,class 類名 成員變量; 成員函數(shù); 即使不是在類說(shuō)明中定義的函數(shù),也可以說(shuō)明為內(nèi)部的(加inline) 以空間換時(shí)間,內(nèi)聯(lián)函數(shù)的限制 (1)內(nèi)聯(lián)函數(shù)不能包含任意靜態(tài)數(shù)據(jù) (2)內(nèi)聯(lián)函數(shù)不能使用任何循環(huán) switch,goto語(yǔ)句 (3)內(nèi)聯(lián)函數(shù)不能是遞歸的 (4)內(nèi)聯(lián)函數(shù)中不能有數(shù)組說(shuō)
15、明(可 放在外面說(shuō)明),幾個(gè)重要概念 1函數(shù)原型 int get_ word ( char *, int , float ); 把函數(shù)的函數(shù)名,返回類型及使用的參數(shù)的類型和個(gè)數(shù)提前告訴編譯程序 1)函數(shù)原型通常放在程序的頂部 2)c++需要所有函數(shù)都有原型,2缺省參數(shù) int g( char a, int b, int c=0 ); 調(diào)用時(shí)若未給第三個(gè)參數(shù),則缺省為0 (1)所有取缺省值的參數(shù)都必須出現(xiàn)在不取缺省值的參數(shù)的右邊 (2)缺省值只需在第一次被提及的地方指定,3引用類型 數(shù)據(jù)的一種類型(同指針類型很相似) c只能通過(guò)傳值傳遞參數(shù),不能通過(guò)傳遞引用傳遞參數(shù) c++不僅通過(guò)傳值傳
16、遞參數(shù),也可通過(guò)傳遞引用傳遞參數(shù),(1)引用的概念 引用是給對(duì)象(變量)取一個(gè)別名,它引入了對(duì)象的一個(gè)reference 在C中只能使用指針建立別名,不能使用引用建立別名 在C++中不僅使用指針建立別名,也可使用引用建立別名,定義引用的關(guān)鍵字是type int 創(chuàng)建了一個(gè)整型引用變量j,它是i的地址的別名,即j是i的同義詞,它們表示同一個(gè)對(duì)象,例二 int i; int // 正確,不必給出初值,例三 int i; int i,j的值均為6 引用是對(duì)象本身,而不是副本,所以對(duì)對(duì)象或?qū)σ玫娜魏尾僮鞫紩?huì)影響到它們共同的對(duì)象,一個(gè)引用可看作一個(gè)特殊類型的指針 引用與指
17、針的差別 (1)引用必須初始化 (2)初始化后不能再作為其他對(duì)象 的別名,引用可以使用臨時(shí)變量來(lái)進(jìn)行初始化 (1)用常量初始化引用(引用為常量的別名) int (T1為臨時(shí)變量),(2)用不同類型的對(duì)象初始化引用 unsigned int ui=20; int (T2為臨時(shí)變量),(2)引用的用途 獨(dú)立引用 作為函數(shù)參數(shù)類型 作為函數(shù)返回類型,1)獨(dú)立引用 a.獨(dú)立引用的限制 b.理解 int * main () 中調(diào)用語(yǔ)句 int x, i=4; void a2( int *n ) x=a1(i); //x=12, i=4
18、*n=(*n)*3; a2 ( ,,傳值的缺點(diǎn) 1、單向傳遞,結(jié)果無(wú)法返回 2、對(duì)于大型對(duì)象,實(shí)參對(duì)形參的 賦值耗時(shí)太多,3)作為函數(shù)返回類型 甚至可使返回值作為賦值號(hào)左側(cè)的元素,即函數(shù)調(diào)用可以放在賦值語(yǔ)句的左端,類的一般形式 class 類名 private: 私有段數(shù)據(jù)及函數(shù); protected: 保護(hù)段數(shù)據(jù)及函數(shù); public: 公有段數(shù)據(jù)及函數(shù); ;,成員變量和成員函數(shù) 1成員變量 成員變量的聲明與普通變量的聲明方式相同,但聲明中不允許進(jìn)行初始化賦值,允許 不允許 class stack class stack int *lst;
19、 int*lst; int max_size; int max_size; int nb_elements; int nb_elements=0; ; ; 一般在聲明時(shí),應(yīng)按成員變量類型的大小,從小至大聲明,這樣利于機(jī)器進(jìn)行對(duì)準(zhǔn)操作,從而提高時(shí)空利用率,(3)在類的內(nèi)部,可以定義其自身的 引用或者指針 class stack int *lst; int max_size; int nb_elements; ;,class stacklinker stack mystack; stacklinker *right, *left; ;,2成員函數(shù) 棧的六種操
20、作建棧、判棧、入棧、出棧、讀棧、毀棧在類中應(yīng)給出成員函數(shù)的原型,class stack public: void create( int ); int empty( ); void push( int ); void pop( ); int top( ); void erase( ); ;,成員函數(shù)的具體實(shí)現(xiàn)可在類定義體內(nèi)(為內(nèi)聯(lián)函數(shù)),也可在類定義體外(加上inline成為內(nèi)聯(lián)函數(shù),不加inline成為一般函數(shù)) stack 的完整實(shí)現(xiàn)如下:,#include #include const char *msg = ”stack is empty!n”, ”
21、stack is overflow!n” ; class stack int *lst; int nb_elements; int max_size; void err_msg( int );,public: void create( int ); int empty( ); void push( int ); void pop( ); int top( ); void erase( ); ; viod stack::err_msg( int code ) cout< 22、ze; lst=new int(size); nb_elements=0; int stack::empty( ) return (nb_elements==0); ,void stack::push( int element ) if ( nb_elements==max_size ) err_msg (1); else lst++nb_elements=element; ,void stack::pop( ) if ( nb_elements==0 ) err_msg(0); else --nb_elements; ,int stack::top( ) if ( nb_e 23、lements==0 ) err_msg(0); else return(lstnb_elements); void stack::erase( ) delete lst; ,main( ) stack s; int i; s.create(100); for( i=0; i<=100; ++i )s.push(i); for( i=0; i<=100; ++i ) cout< 24、is empty,類類型常量和const成員函數(shù) 1 13 5 為 int 型常量 2.3 5.7 為double型常量 C f 為 char 型常量 某些類類型存在常量 如:有復(fù)數(shù)類complex, 則2+3i為complex類的類型常量 不存在像基本類型常量那樣形式的類類型 常量,類類型的常量是以其他方式表達(dá)的,2 在程序中對(duì)const聲明的常量進(jìn)行賦值是不允許的 const char blank= ; blank=0; error,3只有通過(guò)公有成員函數(shù)才能修改一個(gè)類的對(duì)象 為了確保某個(gè)對(duì)象是常量,編譯器必須有辦法 區(qū)別“安 全”及“不安全”的成員函數(shù) const 25、stack s; cout< 26、/聲明 .. int stack::top( )const //定義 ; ;,若某個(gè)函數(shù)修改了類中的某個(gè)成員變量, 則不允許把它聲明為const型的 class example int *data_member; public: void ok( int i )const//允許 *data-member=i; void err( int *i )const//不允許 data-member=i; ; const成員函數(shù)也可以重載,構(gòu)造函數(shù)的功能:初始化對(duì)象 析構(gòu)函數(shù)的功能:釋 放 空 間 1.構(gòu) 27、造函數(shù): 系統(tǒng)缺省版本:做公共初始化工作 用戶提供版本:做用戶初始化工作 2.析構(gòu)函數(shù): 系統(tǒng)缺省版本:做公共的善后工作 用戶提供版本:做用戶的善后工作 構(gòu)造函數(shù)和析構(gòu)函數(shù)都具有普通成員函數(shù) 的許多共同特性,但也有獨(dú)特的特性,1.共同點(diǎn) (1)沒(méi)有返回類型 (2)不能被繼承 (3)不能取它們的地址 2.不同點(diǎn) (1)構(gòu)造函數(shù)可以有參數(shù) 析構(gòu)函數(shù)不能有參數(shù) (2)構(gòu)造函數(shù)不能是虛函數(shù) 析構(gòu)函數(shù)可以是虛函數(shù) (3)構(gòu)造函數(shù)不能顯式調(diào)用 析構(gòu)函數(shù)可以顯式調(diào)用 當(dāng)定義對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用構(gòu)造函數(shù)(先系后用) 當(dāng)刪除對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)(先 28、用后系),(1)構(gòu)造函數(shù)的名字必須與類名相同 (2)構(gòu)造函數(shù)沒(méi)有返回值,在聲明和定義 構(gòu)造 函數(shù)時(shí)是不能說(shuō)明類型的 (3)構(gòu)造函數(shù)只能對(duì)數(shù)據(jù)成員做初始化, 這些數(shù)據(jù)成員一般為私有成員 (4)構(gòu)造函數(shù)一般不做賦初值以外的事情 (5)構(gòu)造函數(shù)不能顯式地調(diào)用,析構(gòu)函數(shù) 類的一個(gè)特殊成員函數(shù),函數(shù)名與類名相同, 只是在前面加上一個(gè)“” class string string::string( ) int length; delete contents; char *contents; public; string( char * ); string( ) 29、; ;,(1)一般析構(gòu)函數(shù)由一系列的delete語(yǔ)句 組成 (2)若使用完全限定名,可顯式調(diào)用析構(gòu) 函數(shù),參數(shù)化的構(gòu)造函數(shù) class point int x, y; public: point( int, int ); void offset( int , int ); ; point::point( int vx, int vy ) x=vx; y=vy; void point::offset( int ax, int ay ) x=x+ax; y=y+ay; main( ) point pt(10,20); pt.o 30、ffset (10,10); ,缺省參數(shù)的構(gòu)造函數(shù) 例一. class set int elems100; int size; int card; public: set( int i=16 ); ; set::set( int i ) size=i; if (size100) size=100; if ( size<16 ) size=16; main( ) set s1(64), s2(16), s3(8), s4; s 31、ize取值 64 16 16 16,例二. class point int x, y; public: point ( int vx=0; int vy=0 ) x=vx; y=vy; ; main( ) point p1; //不傳遞參數(shù) x= 0, y= 0 point p2(10); //只傳遞一個(gè)參數(shù) x=10, y= 0 point p3(10,20); //傳遞兩個(gè)參數(shù) x=10, y=20 ,重載構(gòu)造函數(shù) class x public: x( ); x( int ); x( int, char ); x( float, char ); ; void f( 32、) x a, b(1), c(1, c), d(2.3, d); ,注意二義性 class x public: x( ); x( int i=0 ); ; main ( ) x a(10); //正確 x b; //錯(cuò)誤 ,,拷貝構(gòu)造函數(shù) 一種特殊的構(gòu)造函數(shù) (1)為一個(gè)構(gòu)造函數(shù),當(dāng)創(chuàng)建一個(gè)新對(duì)象時(shí) 系統(tǒng)自動(dòng)調(diào)用它 (2)它將參數(shù)代表的對(duì)象逐域拷貝到新創(chuàng)建 的對(duì)象中 拷貝構(gòu)造函數(shù)是將自己所在的類的引用作 為構(gòu)造函數(shù)的參數(shù) 拷貝構(gòu)造函數(shù)的定義的兩種形式 1.系統(tǒng)產(chǎn)生 2.用戶定義,1系統(tǒng)產(chǎn)生 # include class point int x, y; public: 33、 point( int vx, int vy ) x=vx; y=vy; void print( ) cout< 34、ain( ) main( ) point p1(10,20); point p1(10,20); point p2(p1); point p2=p1; ,第 三 節(jié) this指針,C++為成員函數(shù)提供了一個(gè)稱為this的 指針,this在所有成員函數(shù)調(diào)用里作為一個(gè) 隱含參數(shù)傳給成員函數(shù) class point int x, y; public: point( int vx, int vy , point *const this ) //完整 this-x=vx; this-y=vy; point( int vx, int vy ) 35、 //半省 this-x=vx; this-y=vy; point( int vx, int vy ) x=vx; y=vy; //全省 ;,1每個(gè)對(duì)象的成員函數(shù)都擁有一個(gè)隱含的指 針this(靜態(tài)函數(shù)除外) int get_length( ) return length; 二者等價(jià) int get_length( ) return this-length; 2this指針是一個(gè)常指針,可表示為: x *const this (可指向常量) 3this指針不能被修改和賦值 4const成員函數(shù)不能修改this所指的對(duì)象的 成員,第 四 節(jié) 36、 靜態(tài)成員,一、靜態(tài)成員變量 (1)某個(gè)類的所有對(duì)象要共同訪問(wèn)同一個(gè)變 元,這個(gè)變?cè)赡苁且粋€(gè)條件標(biāo)志或一 個(gè)計(jì)數(shù)器 (2)為了減少數(shù)據(jù)冗余,防止不一致性,要 求一個(gè)類的所有對(duì)象共享同一個(gè)數(shù)據(jù) (3)為了節(jié)約空間開(kāi)銷,也要求對(duì)象共享同 一個(gè)數(shù)據(jù) 處理方法:使用全局變量 缺點(diǎn):(1)破壞了信息隱藏原則 (2)過(guò)多的全局變量會(huì)產(chǎn)生重名沖突,為了既達(dá)到與全局變量一樣的效果,又能 滿足信息隱藏的原則,提出了靜態(tài)成員變量的 概念 特 點(diǎn) 若類中某個(gè)成員變量被說(shuō)明成靜態(tài)的,則 類的所有對(duì)象共享這個(gè)成員變量 靜態(tài)成員變量不屬于某個(gè)對(duì)象,而屬于整個(gè)類,class ABCD 37、char ch; static int s; ; ABCD a, b, c, d; 為了把某個(gè)成員變量說(shuō)明為靜態(tài)的,只須 在原有說(shuō)明前加上static 靜態(tài)成員變量可以是public、private和 protected段的,#include #include class counter static int count; int objnumber; public: counter () count++; obinumber=count; void show() cout<<”obj”< 38、<”n”; ; int counter::count=0;,main() counter obj1,obj2,obj3,obj4; obj1.show(); cout<<”--------------------n”; obj1.show(); obj2.show(); cout<<”--------------------n”; obj1.show(); obj2.show(); obj3.show(); cout<<”--------------------n”; obj1.show(); obj2.show(); obj3.show(); obj4.show(); ,輸出結(jié)果: ob 39、j1count=4 ---------------- obj1count=4 obj2count=4 ---------------- obj1count=4 obj2count=4 obj3count=4 ---------------- obj1count=4 obj2count=4 obj3count=4 obj4count=4,靜態(tài)成員函數(shù) static函數(shù) 1是一個(gè)成員函數(shù),使用時(shí)要用“類名::” 作為它的限定詞 2是一個(gè)特殊的成員函數(shù),它不屬于某一 個(gè)特定的對(duì)象而只屬于一個(gè)類,不能象 一般的成員函數(shù)那樣隨意地訪問(wèn)對(duì)象中 的非靜態(tài)的數(shù)據(jù)內(nèi)容 3沒(méi)有this指針 4要訪問(wèn)非靜態(tài)成員, 40、必須要有限定詞,#include #include class string static int total_length; int length; char *contents; public: string(char ,main() string obj1(“The first object”); cout< 41、tic int set_total_length(string obj) total_length=total_length+obj.length; return total_length; main() string obj1(“The first object”); cout< 42、和信息隱藏使對(duì)象和外界以 一堵不透明的墻隔開(kāi),友元在這堵 墻上開(kāi)了一個(gè)小孔 (2)友元是以犧牲信息隱藏原則,削弱 封裝性來(lái)提高編程效率,增大了類 與類之間的藕合度 只要將外界的某個(gè)對(duì)象說(shuō)明為某一個(gè)類 的友元,則它可以訪問(wèn)這個(gè)類中的所有成員 友元的種類 1.一般函數(shù) 2.另一個(gè)類的成員函數(shù) 3.另一個(gè)類,二、友元的聲明和定義 將friend放在函數(shù)名或類名的前面,此 聲明可放在任何段中 特別注意 友元不屬于任何類,三、友元函數(shù) 作為友元的函數(shù) class x int i; friend void func(x *, int); //友元函數(shù) pu 43、blic: void member_func(int); //成員函數(shù) ; void func(x *xp, int a)xpi=a; //無(wú)需作用域 void x::member_func(int a)i=a; //必須作用域,成員函數(shù)可以在類中實(shí)現(xiàn),也可以類外實(shí)現(xiàn) 友元函數(shù)可以在類中實(shí)現(xiàn),也可以類外實(shí)現(xiàn) 在類外實(shí)現(xiàn)時(shí),成員函數(shù)必須用作用域 區(qū)分符(::)限定它屬于哪一個(gè)類 在類外實(shí)現(xiàn)時(shí),友元函數(shù)不須用作用域 區(qū)分符(::)限定它屬于哪一個(gè)類 友元函數(shù)沒(méi)有this指針,不能確定是訪問(wèn) 哪個(gè)對(duì)象的私有數(shù)據(jù),故必須在參數(shù)表中顯 式地指明要訪問(wèn)的對(duì)象,友元成員函數(shù) 作為友元的 44、另一個(gè)類中的成員函數(shù) class x public: void member_func(); ; class y int i ; friend void x::member_func(); ;,友元類 作為友元的另一個(gè)類 class x int i, j; public: void member_func1(); void member_func2(); void member_func3(); ; class y int i, j; friend x; ;,運(yùn) 算 符 重 載,不能改變優(yōu)先級(jí) 不能改變操作數(shù)的個(gè)數(shù) 不能重載沒(méi)有的符號(hào)(自 45、己發(fā)明) 單目可以重載 雙目可以重載 三目不能重載 運(yùn)算符重載的能力增強(qiáng)了C++語(yǔ)言的可擴(kuò)充性 new可以重載 delete可以重載,在C++中,運(yùn)算符的重載,實(shí)際上是 一種函數(shù)調(diào)用的形式 用成員函數(shù)重載運(yùn)算符 用友元函數(shù)重載運(yùn)算符 +可以定義為減運(yùn)算 *可以定義為除運(yùn)算 顛倒黑白,重載方式的選擇 (1)若運(yùn)算符的操作要修改對(duì)象的狀態(tài), 或需要左值運(yùn)算數(shù)(如=,*=,++),選擇 成員函數(shù) (2)若運(yùn)算符的操作數(shù)(特別是第一個(gè)操 作數(shù))希望有隱藏類型轉(zhuǎn)換,必須選擇友元 函數(shù) 既要聲明、也要定義,用成員函數(shù)重載運(yùn)算符 重載運(yùn)算符的成員函數(shù)稱為運(yùn)算符重載函數(shù), 有this指針,是 46、一種特殊的成員函數(shù) 1.聲明格式 class class_name type operator(arg-list); 2.定義格式 type class_name::operator(arg-list) 其中:type為返回類型,為要重載的運(yùn)算符 operator為關(guān)鍵字,arg-list為該運(yùn)算所需要的操作數(shù) 若為一元的,則arg-list為空,當(dāng)前對(duì)象作為單操作數(shù) 若為二元的,則arg-list中有一個(gè)操作數(shù),當(dāng)前對(duì)象為 的左操作數(shù),arg-list中的操作數(shù)為的右操作數(shù),隱式調(diào)用 顯式調(diào)用 一元 aa或aa aa.operator() 無(wú)參數(shù),隱式傳遞 隱式調(diào) 47、用 顯式調(diào)用 二元 aabb aa.operator(bb) 一個(gè)參數(shù),一隱一顯,例1 class x int operator+( x ); ; int x::operator+( x a ) main() x a1,b1; y a2,b2; a1=a1+b1; //正確 a2=a2+b2; //錯(cuò)誤 類x對(duì)+已進(jìn)行重載 類y對(duì)+未進(jìn)行重載,例2 class point int x,y; public: point(int vx, int vy)x=vx; y=vy; point()x=0; y=0; point operator+( point p); p 48、oint operator -( point p); void print()cout< 49、符 重載運(yùn)算符的友元函數(shù)也稱為運(yùn)算符 重載函數(shù) 1.聲明格式 class class_name friend type operator(arg-list); 2.定義格式 type operator(arg-list) 若為一元的,則arg-list中有一個(gè)操作數(shù), 作為唯一的操作數(shù) 若為二元的,則arg-list中有二個(gè)操作數(shù), 作為運(yùn)算的兩個(gè)操作數(shù),,,隱式調(diào)用 顯式調(diào)用 一元 aa或aa operator(aa) 一個(gè)參數(shù),顯式傳遞 隱式調(diào)用 顯式調(diào)用 二元 aabb operator(aa, bb) 二個(gè)參數(shù),顯式傳遞, 50、例1 class point int x,y; public: point(int vx, int vy)x=vx; y=vy; point()x=0; y=0; friond point operator+(point p1; point p2); friond point operator -(point p1; point p2); void point()cout< 51、 operator-(point p1; point p2); point p; p.x=p1.x-p2.x; p.y=p1.y-p2.y; return p; main() point p1(10,10); p2(20,20); p1=p1+p2; p1.print(); 運(yùn)算結(jié)果:30 30,注 意 1.為什么要用友元函數(shù)重載運(yùn)算符 2.=,(),,只能用成員函數(shù)重載 3.只能用友元函數(shù)重載 4.友元函數(shù)重載單目運(yùn)算符時(shí)要特別小心 若單目運(yùn)算符要改變對(duì)象的狀態(tài),且用 友元函數(shù)重載該運(yùn)算符,則應(yīng)使用引用 參數(shù),三、幾個(gè)特殊運(yùn)算符的重載 1++和-- 前綴方式 ++i, --i 52、 后綴方式 i++, i-- (1)前綴方式 aa.operator++() 成員函數(shù)重載 operator++(X //ok,= 賦值運(yùn)算符 不能被友元函數(shù)重載,不能被繼承 自動(dòng)重載:系統(tǒng)定義 人工重載:用戶定義 缺省拷貝構(gòu)造函數(shù):新建一個(gè)對(duì)象,再拷貝 缺省賦值運(yùn)算符重載函數(shù):只拷貝(目的對(duì)象已存在) 例 A a; A b=a;(調(diào)用缺省拷貝構(gòu)造函數(shù)) A a,b; b=a;(調(diào)用缺省賦值運(yùn)算符重載載函數(shù)) 缺省的成員函數(shù)重載賦值運(yùn)算符 X int length; string 現(xiàn)在可以使用:str1=str2,例2 指針懸掛問(wèn)題 class 53、string 僅有缺省賦值運(yùn)算符有時(shí)是不夠的 char *contents; int size; public: string(int sz)contents=new charsz; string()delete contents; ; 沒(méi)有重載賦值運(yùn)算符 main() string s1(10), s2(20); s1=s2; // 調(diào)用缺省賦值運(yùn)算符 缺省賦值運(yùn)算符的功能:逐域賦值 (1)s2的contents-s1的contents (2)s2的size-s1的size,解決方法:重載賦值運(yùn)算符 使其不僅能賦值成員contents,size, 也要復(fù)制非成員(具體內(nèi) 54、容) 加上:void operator=(string *); void string::operator=(string *str) if(this==str)return; delete contents; contents=new charsize=strsize; strcpy(contents, strcontents); 解決了指針懸掛問(wèn)題,3( )和 函數(shù)調(diào)用運(yùn)算符和下標(biāo)運(yùn)算符 例1 class string char *ptr; public: string(const char *); char ssS的新值為”afdf”,new和delete的重載,(1) 55、new和delete是運(yùn)算符,可以重載 (2)申請(qǐng)空間可以是基本內(nèi)存,擴(kuò)充內(nèi) 存、擴(kuò)展內(nèi)存、硬盤 重載類型 局部重載:在某一個(gè)類中進(jìn)行,用成員函數(shù) 重載運(yùn)算符函數(shù) 全局重載:在任何類外進(jìn)行,用普通函數(shù)重 載運(yùn)算符函數(shù) new 可重載 malloc() 不可重載 delete free(),void *operator new(size-t size, ) // 完成分配工作 return pointer-to-memory; void operator delete(void *p, ) // 釋放由P指向的存貯空間 (1)對(duì)operator new()來(lái)說(shuō), 56、它的第一個(gè)參數(shù)必須 是size-t類型,這是一個(gè)在標(biāo)準(zhǔn)頭文件 中定義的與實(shí)現(xiàn)有關(guān)的整型類型, 必須返回void *類型 (2)對(duì)operator delete來(lái)說(shuō),它的第一個(gè)參數(shù)必須 是void *類型,第二個(gè)參數(shù)的類型是size-t (可選,刪除對(duì)象的大?。?,必須返回void類型,局部重載 (1)類x的x::operator new() 類x的x::operator delete() 它們不是針對(duì)x類的對(duì)象操作的是靜態(tài)成員 函 數(shù)(無(wú)論是否有static) (2)new在構(gòu)造函數(shù)之前調(diào)用,分配構(gòu)造函數(shù)建 立X類對(duì)象的內(nèi)存 delete在析構(gòu)函數(shù)之后調(diào)用,釋放析構(gòu) 57、函數(shù) 剛剛破壞的X類對(duì)象的內(nèi)存 (3)一個(gè)類只能聲明一個(gè)operator delete(),故 operator delete()不能進(jìn)行函數(shù)重載 一個(gè)類可以聲明多個(gè)operator new(),故 operator new()可以進(jìn)行函數(shù)重載 (4)重載的new()和delete()是可以繼承的,類 型 轉(zhuǎn) 換,一般類型轉(zhuǎn)換 隱式類型轉(zhuǎn)換(標(biāo)準(zhǔn)類型轉(zhuǎn)換) 顯式類型轉(zhuǎn)換 強(qiáng)制轉(zhuǎn)換法 函數(shù)轉(zhuǎn)換法 強(qiáng)制法 函數(shù)法 int i, j; int i, j; cout<<(float)(i+j); cout<<(float(i 58、+j) 類類型轉(zhuǎn)換 構(gòu)造函數(shù) 轉(zhuǎn)換函數(shù),標(biāo)準(zhǔn)類型標(biāo)準(zhǔn)類型:標(biāo)準(zhǔn)類型轉(zhuǎn)換 標(biāo)準(zhǔn)類型類 類 型:構(gòu) 造 函 數(shù) 類 類 型標(biāo)準(zhǔn)類型:類型轉(zhuǎn)換函數(shù) 類 類 型類 類 型:類型轉(zhuǎn)換函數(shù),一、構(gòu)造函數(shù) 不能將類類型轉(zhuǎn)換為類類型 只能將標(biāo)準(zhǔn)類型轉(zhuǎn)換為類類型 不能將類類型轉(zhuǎn)換為標(biāo)準(zhǔn)類型 條件:此類一定要有一個(gè)只帶一個(gè)參數(shù)的 構(gòu)造函數(shù),二、轉(zhuǎn)換函數(shù) 特殊的成員函數(shù)(不能為友元函數(shù)), 可以被繼承、可以是虛函數(shù)、不能重載 (函數(shù)重載),無(wú)參數(shù),無(wú)返回類型,必 須有返回函數(shù),返回具有type類型的對(duì)象。 X::operator Y() 59、Y y; return y; 功能:X 類類型標(biāo)準(zhǔn)類型 X類類型Y類類型,隱式使用:int i=a; 顯式使用:int i=a.operator int(); 一般使用隱式方式,僅當(dāng)需要 明確指出所使用的是哪一個(gè)轉(zhuǎn)換 函數(shù)時(shí)才使用顯式方式,二義性問(wèn)題 若X類有 X(int) 構(gòu)造函數(shù) operator int() 轉(zhuǎn)換函數(shù) 則 int i=a; 隱式調(diào)用轉(zhuǎn)換函數(shù) X a=i; 隱式調(diào)用構(gòu)造函數(shù) 則語(yǔ)句 a=a+i 將會(huì)產(chǎn)生二義性, 此時(shí)必須顯式調(diào)用轉(zhuǎn)換函數(shù) 用戶定義的轉(zhuǎn)換函數(shù)只有 在無(wú)二義性時(shí)才能隱式使用,解決方法 (1) X b=i; (2) a=a+X(i 60、); a=a+b; 說(shuō)明: (1) 編譯程序先按用戶定義的意思, 再按標(biāo)準(zhǔn)格式,都不行,則失敗 (2) 有二義性時(shí),必須使用顯式類型 轉(zhuǎn)換 (type)obi 或 type(obi),派 生 類,提高軟件的可重用性 減少工作量 避免編寫重復(fù)代碼 減少出錯(cuò)機(jī)會(huì) 繼承是對(duì)象類間的一種相關(guān)關(guān)系, 即派生關(guān)系,并具有以下性質(zhì): 類間的共享特性 類間的細(xì)微區(qū)別 類間的層次結(jié)構(gòu) 分類樹(shù)反映了派生關(guān)系: 最高層是最普遍最一般的,越往下 反映的事物越具體,并且下層都包含了 上層的特征,派生類的概念,引入繼承的目的在于為代碼重用提 供有效手段。一方面使用繼承可以重用 先前項(xiàng) 61、目的代碼,若原來(lái)的代碼不能完 全滿足要求,還可以作少量的修改,滿 足不斷變化的具體應(yīng)用要求,從而提高 程序設(shè)計(jì)的靈活性,避免不必要的重復(fù) 設(shè)計(jì),單 繼 承,單繼承:每個(gè)類可有多個(gè)派生類, 但最多只有一個(gè)基類, 從而形成一棵樹(shù)結(jié)構(gòu) 多繼承:每個(gè)類可有多個(gè)派生類, 也可有多個(gè)基類,從而 形成網(wǎng)狀結(jié)構(gòu),一、定義格式: class 派生類名:繼承方式 基類名 ; 其中:1.class 關(guān)鍵字 2. : 將派生類與基類分開(kāi) 3.繼承方式: public protected private 缺省: 對(duì)于類等價(jià)于private 對(duì)于結(jié)構(gòu)等價(jià)于pub 62、lic,四種繼承方式 1公有派生 class 派生類名:public 基類名 ; 基類所有公有段成員成為派生類公有段成員 基類所有保護(hù)段成員成為派生類保護(hù)段成員 基類所有私有段成員不能被繼承 即派生類的對(duì)象及其成員函數(shù)可直 接訪問(wèn)基類的公有成員和保護(hù)成員,2私有派生 class 派生類名:private 基類名 ; 基類所有公有段成員成為派生類私有段成員 基類所有保護(hù)段成員成為派生類私有段成員 基類所有私有段成員不能被繼承 即派生類的成員函數(shù)可直接訪問(wèn) 基類的公有成員和保護(hù)成員,3保護(hù)派生: class 派生類名:protected 基類名 ; 基類所有公有段成員成為派生類保護(hù)段成員 63、基類所有保護(hù)段成員成為派生類保護(hù)段成員 基類所有私有段成員不能被繼承 即派生類的成員函數(shù)可直接訪問(wèn)基類 的公有成員和保護(hù)成員,還可往下繼承,4部分公開(kāi)(訪問(wèn)聲明): 為了使基類中的公有和保護(hù) 成員在派生類中部分成為公有或 保護(hù)成員,部分成為私有成員, 可采用: 基類名::成員名 基類公有成員等價(jià)于派生類公有成員 基類保護(hù)成員等價(jià)于派生類保護(hù)成員 注意 (1)并未引進(jìn)新成員 (2)在調(diào)整名字的訪問(wèn)時(shí) 不能說(shuō)明 類型,三、成員訪問(wèn)控制 基類性質(zhì) 繼承性質(zhì) 派生類性質(zhì) public public public protected public pr 64、otected private public 不能訪問(wèn) public protected protected protected protected protected private protected 不能訪問(wèn) public private private protected private private private private 不能訪問(wèn),基類與派生類的關(guān)系 任何一個(gè)類都可以派生出一個(gè)新類,派生類也可以再派生出新類,因此,基類和派生類是相對(duì)而言的。一個(gè)基類可以是另一個(gè)基類的派生類,這樣便形成了復(fù)雜的繼承結(jié)構(gòu) 65、,出現(xiàn)了類的層次。一個(gè)基類派生出一個(gè)派生類,它又做另一個(gè)派生類的基類,則原來(lái)的基類為該派生類的間接基類。 1. 派生類是基類的具體化。 2. 派生類是基類定義的延續(xù)。 3. 派生類是基類的組合。 派生類將其本身與基類區(qū)別開(kāi)來(lái)的方法是添加數(shù)據(jù)成員和成員函數(shù)。因此,繼承的機(jī)制將使得在創(chuàng)建新類時(shí),只需說(shuō)明新類與已有類的區(qū)別,從而大量原有的程序代碼都可以復(fù)用。,,如:class A public: void f(); ; class B public: void f(); void g(); ; class C: public A,public B public: voi 66、d g(); void h(); ; C obj;,則對(duì)函數(shù)f()的訪問(wèn)是二義的:obj.f(); //無(wú)法確定訪問(wèn)A中或是B中的f(),,賦值兼容規(guī)則 賦值兼容規(guī)則是指:在公有派生的情況下,一個(gè)派生類的對(duì)象可用于基類對(duì)象適用的地方。賦值兼容規(guī)則有三種情況(假定類derived由類base派生) : (1)派生類的對(duì)象可以賦值給基類的對(duì)象。 derived d; base b; b=d; (2)派生類的對(duì)象可以初始化基類的引用。 derived d; base,,(3)派生類的對(duì)象的地址可以賦給指向基類的指針。 derived d; base *pb=,,,,,多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要特征之一。所謂多態(tài)性是指當(dāng)不同的對(duì)象收到相同的消息時(shí),產(chǎn)生不同的動(dòng)作。C++的多態(tài)性具體體現(xiàn)在運(yùn)行和編譯兩個(gè)方面,在程序運(yùn)行時(shí)的多態(tài)性通過(guò)繼承和虛函數(shù)來(lái)體現(xiàn),而在程序編譯時(shí)多態(tài)性體現(xiàn)在函數(shù)和運(yùn)算符的重載上。,運(yùn)算符重載的實(shí)現(xiàn),運(yùn)算符的重載形式有兩種:重載為類的成員函數(shù)和重載為類的友元函數(shù)。 運(yùn)算符重載為類的成員函數(shù)的語(yǔ)法形式如下: operator () ; friend operator
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競(jìng)賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫(kù)試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫(kù)試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫(kù)試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫(kù)及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫(kù)含解析
- 1 礦山應(yīng)急救援安全知識(shí)競(jìng)賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案