北航軟件所孫自安_第1頁
北航軟件所孫自安_第2頁
北航軟件所孫自安_第3頁
北航軟件所孫自安_第4頁
北航軟件所孫自安_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C+與C北航軟件所孫自安北航如心樓606電話:82316284Email: 1 第四章 面向對象的程序設計(續(xù))2class Person public:protected:char * name;int age;classStudent : public Person public:private:char * school;char *class;intid;class Employee: public Person public:private:char * company;char *job;doublesalary;如何定義代培生?是一名職員是一名學生4.7 多繼承3多繼承:一個派生

2、類有兩個或者兩個以上的直接基類class EmployStud : public Student, public Employee public:private:bool way;逗號 , 隔開的多個基類4EmployStudliming;wayschoolnamecompanyname多個基類對象,二義性:有兩個name/agePersonnameageEmployeecompanyjobsalaryStudentschoolclassidEmployStudway存儲空間浪費不便于維護5虛擬繼承:無論基類在派生層次中出現(xiàn)多少次,只有一個共享的基類子對象被繼承。class Student :

3、 virtual public Person ;class Employee: public virtual Person ;class EmployStud : public Student, public Employee ;EmployStudliming;wayschoolcompanynamevirtual可在繼承關鍵字之前或之后6IBM庫的頭文件:stringliststackMicrosoft庫的頭文件:vectorqueuestackvoid main( )/使用數據類型list和queue/包含IBM庫的頭文件/包含Microsoft庫的頭文件造成stack定義沖突4.8 名

4、字空間7名字空間定義格式:namespace 空間名 /成員定義所有可以出現(xiàn)在全局域中的聲明都可以放在用戶聲明的名字空間中:類定義、變量聲明或定義、函數聲明或定義。名字空間括起來的區(qū)域稱為名字空間域,出現(xiàn)在名字空間域中的各種聲明或定義只能在該域中直接使用8cstring.hnamespaceMyString class CString ;CString & operator + ( const char *, CString & );cstring.cppnamespaceMyString CString:CString ( ) CString & operator + ( const cha

5、r *str1, CString & str2 )注意:名字空間的定義不一定是連續(xù)的,可以放在不同文件中。對外接口實現(xiàn)9注意:名字空間可以嵌套定義mylib.hnamespaceMyLib class CString ;namespaceMathLib class Complex ;namespaceGraphicLib classCircle ;10名字空間的使用(1):空間名:成員名域操作符#include “mylib.h”void main ()CString str ( “hello”);MyLib:CString str (“hello”);MyLib:GraphicLib:Cir

6、cle cir;11名字空間的使用(2):定義名字空間別名#include “mylib.h”namespacegraph = MyLib:GraphicLib;void main ()graph:Circle cir;12名字空間的使用(3):using 空間名:成員名;#include “mylib.h”using MyLib:GraphicLib:Circle;using MyLib:CString;void main ()CString str;Circle cir;13名字空間的使用(4):using 空間名;#include “mylib.h”using MyLib;void ma

7、in ()CString str;Circle cir;Complex cp;14class iStack public:bool pop( int &top_value );bool push( int value );bool full();bool empty();int value;iStack st;if(!st.push(value)cout“Empty”;if(!st.push(value)錯誤處理和正常操作混在一起4.9 異常(Exception)處理15異常是程序可以檢測到的、運行時刻不正常的情況異常處理定義:定義異常類型拋出異常捕獲異常處理異常16異常類型:用來定義出錯信息

8、,可以是用戶自定義類型或者內置數據類型。statckError.hclassStackError public:StackError ( int i = 0, int v = 0): state (i), value(v) int value ( ) return value; int state ( ) return state; private:int state;/0:ok, 1:full, 2:emptyint value;/試圖將value壓入堆棧; 17拋出異常:throw 異常對象;異常類型的一個實例class iStack public:/ 不再返回一個值void pop( i

9、nt &value );void push( int value );#include “stackError.h”void iStack:push( int value )if ( full() )StackError error (1, value);throw error;throw StackError(1,value);執(zhí)行throw語句后,便拋出一個異常,程序將從拋出異常位置退出18捕獲和處理異常:try /包含throw語句catch ( 異常類型1 對象 ) /處理一種異常catch ( 異常類型2 對象 ) /處理另一種異常throw語句必須在try塊中。如果throw拋出的

10、異常對象類型與catch后括號內的異常類型一致,則程序執(zhí)行該catch后的子句19try int value;iStack st;st.push(value);st.pop(value);st.push(value);catch ( StackError err ) int st = err.state();if (st = 1)else if ( st = 2 )else正常操作與錯誤處理操作的分離20異常處理步驟:try塊中如果沒有異常拋出,則正常執(zhí)行,并忽略后面的catch子句。若try塊中有異常拋出,則程序從拋出位置退出;若拋出的異常對象類型與try塊后的某個catch聲明類型匹配,則

11、執(zhí)行該catch子句處理異常;處理完異常后,程序將從catch子句列表后的語句繼續(xù)執(zhí)行。若找不到匹配項,則該函數帶著一個異常退出,繼續(xù)檢查函數調用點是否有try/catch子句。bool buidStack ( )try /push操作catch (StackError err )return 1;return 0;void clearStack ( )/pop操作void main ()try buildStack();clearStack();catch (StackError err ) 21重新拋出異常:在異常處理過程中也可能存在單個catch 子句不能完全處理異常的情況,必須由函數調

12、用鏈中更上級的函數來處理,那么catch子句可以通過重新拋出該異常,把異常傳遞給函數調用鏈中更上級的另一個catch子句。格式:throw;bool buidStack ( )try /push操作catch (StackError err )throw;return 1;void main ()try buildStack();catch (StackError err ) 拋出的仍然是接受到的err22捕獲所有異常:catch ( ) char * str = new char100;delete str;有可能出現(xiàn)各種各樣的異常try catch ( ) delete str;throw

13、;23#include void main() cout str;4.10 輸入、輸出流24庫中提供了以下類的定義:istream類 (輸入流)ostream類(輸出流)iostream類(派生自istream和ostream,輸入/輸出流)同時該庫定義了如下對象:cin : istream類對象,代表標準輸入;cout :ostream類對象,代表標準輸出;cerr :ostream類對象,代表標準錯誤輸出。25輸出:重載的左移操作符 輸出操作符可以接受任何內置數據類型的實參;可以連續(xù)輸出多個數據。能否輸出類對象的信息?class Person public:private:char * n

14、ame;int age;ostream & operator ( ostream & out );friend ostream & operator (ostream &out, Person & one );26ostream & operator (ostream &out, Person & one )out “t” one.age;return out;Person li, wang, zhang;cout li wang 注意:當右操作數與實際輸入數據類型不一致時,讀入失敗,返回false。比輸出更容易出錯。缺省情況下,以空格、換行、制表符作為分隔符,并丟棄掉。in

15、t ivalue;cin ivalue;/當輸入小數或字符串時便出錯if ( cinivalue )28char ch;while ( cin ch );a b cd/忽略空格和換行符/讀入四個字符操作符noskipws 使輸入操作符不跳過空白字符:char ch;cin noskipws;while ( cin ch );cin skipws;/讀入七個字符29303132其它的輸入/輸出操作:istream成員函數:get ( )getline ( )read ( )peek ( )ostream成員函數:put ( )write ( )33下列三種類類型提供了文件支持ifstream 從

16、istream派生,把一個文件綁到程序上,用來輸入ofstream 從ostream派生,把一個文件綁到程序上,用來輸出fstream 從iostream派生,把一個文件綁到程序上用來輸入和輸出。為了使用文件流組件,我們必須包含相關的頭文件#include 由于在fstream 頭文件中也包含了iostream 頭文件,所以我們不需要同時包含這兩個文件4.11 文件操作34為了打開一個僅被用于輸出的文件,我們可以定義一個ofstream 類對象,例如ofstream outfile( copy.out, ios_base:out );注意:輸出模式ios_base:out 或附加模式ios_b

17、ase:app,缺省為輸出模式;ofstream從ostrearn 類派生,所以所有ostream 操作都可以應用到一個ofstream 類對象上。outfile“hello, world”endl;為了打開一個僅用于輸入的文件,我們可以使用ifstream 類對象,例如:ifstream infile ( “input.txt”);35在定義ifstream 和ofstream 類對象時,我們也可以不指定文件,以后可以通過成員函數open()顯式地把一個文件連接到一個類對象上,例如ifstream curFile;cur( “input.txt” );我們可以通過成員函數close()斷開一個文件與程序的連接,例如cur();36fstream類對象可以打開一個被用于輸出或者輸入的文件,例如:fstream io( word.out, ios_base:in|ios_base:app );seekg()或seekp()成員函數分別用于定位讀、寫位置。37作業(yè)1(必作,6月28日前交):C+標準庫中提供了支持各種字符串操作的string類,使用前要包含頭文件:#include 要求:通過查閱資料或幫助文件自學string類,包括該類提供的各種操作。定義一個類Uppe

溫馨提示

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

評論

0/150

提交評論