異常(exception)是指在運行的時刻程序出現反情況。比如:數組下標越界。打開文件夾失敗,動態創建內存失敗等。程序員一般有自己的異常處理方式。這導致個各種編碼方式,。所以很難整合到一個程序中。
          異常處理(exception  handing ), 為“響應運行時刻的程序“提供了一個標準語言級的設施。它支持統一的語法和風格,也允許每個程序員進行微調。異常處理                不需要我們在程序中處處顯示的測試異常狀態。從而可以將測試代碼顯示的抽取出來,放在指定的 標記的代碼塊中。因此 異常處理設施大大的 簡化了程序的長度和復雜度。
          異常處理機制主要構成如下:
          1: 程序中異常出現的點。一旦識別出程序的異常,就會拋出異常(throw)。當異常被拋出的時候,程序就會被掛起,知道異常被處理完畢了。c++中,異常的處理有throw表達式來執行。
          2:程序中異常被處理的點. 典型的程序的異常拋出和處理位于獨立的 函數或者成員函數中。找到異常處理代碼一般要展開程序調用棧(progam call stack ).一旦異常被處理完畢,及恢復程序的正常執行。但是不是在出現 異常的地方恢復,而是在處理異常的地方恢復執行過程。在c++中異常的處理用catch表達式來執行。
          catch和try字句相關聯。一個try塊用一個或者多個catch子句將一條或者多條語句組織起來。
          系統根據被拋出的異常和catch子句的異常類型的匹配的情況來選擇catch子句。
          系統把控制傳遞給catch子句體,其中的語句將順序執行。完成后后,除非子句體中還拋出異常,否則的話,控制將會被傳到程序的當前點上。
          posted @ 2008-06-27 14:58 清流琴音 閱讀(193) | 評論 (1)編輯 收藏
           
          c++的模板提供了一種機制,它能夠把函數和類內部的數據和值參數化。這些參數在其他地方不變的代碼中用作占位符。以后,這些參數會綁定在實際的數據類型中。可能是內置的數據類型,也可以是用戶自定義的 類型。
          posted @ 2008-06-27 14:51 清流琴音 閱讀(111) | 評論 (0)編輯 收藏
           
          在c++ 中,被繼承的類稱為基類(base class)新類  被稱為從基類中派生(derived)來的。我們把它叫做派生類或基類的子類。子類和基類共享公共的接口(common interface--)-----共有操作的公共集.由于共享公共接口,就允許子類和基類在程序內部可以互換使用。而無需考慮對象的類型。從某種意義上說,公共接口接口封裝了子類型中與類型相關的細節。類之間的類型和子類型形成了繼承和派生層次關系。
          在繼承的機制下有多個  類的提供者:一個提供基類的實現(可能還提供一些派生類的實現。另外一個或者多個提供者在集成生命周期內提供派生類)。子類的提供者經常要訪問(并不總是)基類的實現,為了提供這種能力,同時也為了能夠還要防止對積累的一般性的訪問,c++中提供了另一種訪問級別:保護。在類的保護區域的成員函數和數據成員只提供給它的派生類使用,放在基類的數據成員和數據成員只能被它自己使用,它的派生類也不能使用使用它。

                       
          posted @ 2008-06-27 10:41 清流琴音 閱讀(122) | 評論 (0)編輯 收藏
           

          更一般的,c++支持函數重載(funtion  overloding)的機制。c++允許兩個或者兩個以上的函數具有相同的命名字。限制條件是參數的不同,可以是參數的類型或者數目的不同。根據不同的參數表。編譯器就可以區分開調用哪個函數。
          重載函數和非重載函數在運行時刻的行為是一樣的。只是重載函數在運行的時候,會花費時間來決定到底用哪個函數。如果c++不支持函數重載的話。那么我們就必須為每個函數設置不相同的名字。
          如果在類的體外進行成員函數的定義的時候,就必須指出這個成員函數屬于哪個類。這個可以通過類的域操作符(calss  scope operator)來實現。
          例如:Inarry::
          ":"冒號操作符被稱為域操作符。
          當與一個類相連接的時候。它就成為一個域操作符了。
          我們可以非正式的把與看作是一個可視的窗口。非全局域的文件在它的這個文件中都是可見的,在一個函數體內定義的對象是局域的,它只在這個函數體內可見。每個類維持一個域。在這個域之外,它的成員是不可見的。類域操作符告訴編譯器。域操作符后面的內容是可以在這個域中找到的。
          引用:引用是一種沒有指針語法的指針。與指針一樣,引用提供對對象的間接訪問。
          類機制還支持特殊析構成員函數(destructor member funtion )每一個類對象在最后一次被使用之后,析構函數就會被自動調用。
          我們在析構函數前面加上~線來標識。一般來說,析構函數釋放類對象和在構造函數中所獲得的資源。

          posted @ 2008-06-26 11:56 清流琴音 閱讀(163) | 評論 (0)編輯 收藏
           

          基于支持對象的類的形式為:
          class classname
          {
           public////////公有操作集合
          private:
          //////私有實現代碼

          }
          這里的class,  pulic。和private 是c++的關鍵字。classname是一個標識符,用來命名類名。以便以后引用該類。
          類名代表著一種新型的數據類型,我們可以像定義內置的數據類型一樣來定義對象。

          例如:
          Inarry    inaaay;////定義一個單個類Inarry的對象inaaay;
          Inrry *inarry=new Inrry;///////定義一個指向Inrry類的對象的指針。
          類的定義包含兩個部分:
          類頭( class head)有關鍵字class和類名組成。類體(class boday)有花括號括起來。以分號結束。
          類頭本身也做類的聲明。
          類體包含成員定義和訪問標簽。如:public和private。成員定義主要包括:“該類主要實現什么洋的功能,”以及   “代表類抽象所需要的數據”這些操作稱為成員函數(member funtion)。或者稱為方法(methord)。
          程序設計中一個常見的錯誤是使用先前沒有正確被初始化的對象。實際上這是一個十分常見的錯誤。所以c++為用戶定義的類提供了一種自動初始化機制:類的構造函數(calss  constructor)
          構造函數是一種特殊的成員函數。專門用于初始化對象,如果構造函數被定義了。那么每個對象在應用的時候,該構造函數就會被自動的應用到該對象上。構造函數由類的提供者來定義。既我們提供類的定義的時候。就必須定義類的構造函數。
          為一個類定義一個構造函數是類設計必不可少的一部分。
          為了定義一個構造函數。我們只要  給出一個和 類名字相同的函數就可以了。
          不能指定構造函數有返回值。可以定義很多的構造函數在一個類中。
          盡管她們具有相同的名字,但是只要編譯器可以根據參數區分他們就可以了。
          更一般的





          posted @ 2008-06-24 14:22 清流琴音 閱讀(179) | 評論 (0)編輯 收藏
           
          在c++中,內存可以是靜態分配的——編譯器在處理源代碼的時候就分配,也可以是動態分配的---程序在 運行的時候調用所需要得庫函數進行分配。這兩種分配方式各有個的優點。由于靜態內存分配是在程序運行之前就分配了內存,所以執行的效率就很高。但是缺乏靈活性。它要求知道程序在之前就知道內存的類型和數目。
          例如:
          利用靜態分配的字符串數組,我們就無法很容易的處理和存貯任意的文本文件。一般來說存貯未知的的數目的元素,需要動態分配內存的靈活性。
          例如:以下的定義:
          int ival=1024;
          指示編譯器分配足夠的內存來存貯一個整型值。該存儲區與名字ival相關聯。然后用1024區初始化該存貯區,這些都是在程序之前完成的。
          c++支持用指針類型來存放對象的內存地址值。
          例如:
          為了聲明一個存放ival內存地址的的指針類型。我們可以聲明如下:
          int *print;//////一個指向int類型的指針。
          c++預定一個專門取地址的操作符(&),當他應用于一個對象上的時候,返回的是該對象的地址。
          因此,為了將ival的地址值賦值給print,我們可以寫為:
          int*print;
          print=&ival;///把ival的地址值賦值給print
          為了訪問print所指向的內容。我們必須先用解引用(dereference)操作符(*),來先解除的引用。
          例如:我們通過print間接的給ival加1;
          *print=*print+1;
          等價于:
          直接對 ival進行操作
          ival=ival+1;
          在c++中指針主要是用來管理和分配動態分配的內存。
          對象的分配可以通過兩個不同的版本來實現。
          第一個版本用于分配特定類型的單個對象。
          int*print=new int 1024);
          分配了一個沒有名字的int類型的對象,對象的初始化值為1024。然后表達式返回對象在內存中的地址。
          接著這個地址用來初始化指針對象print.    對于動態分配的內存。唯一的訪問方式是通過指針來訪問。
          例如:
          new的第二個版本,用于分配特定的類型和維數的數組。
          int *pia=new int[4];
          分配了一個含有4個元素的整型數組。不幸的是我們沒有辦法給動態分配的數組每個值顯示的指定一個初始值。
          分配動態數組,一個常令人困惑的問題是,返回值只是一個指針。與分配單一對象的返回值是相同的。
          posted @ 2008-06-24 10:11 清流琴音 閱讀(564) | 評論 (0)編輯 收藏
           
          數組是一組具有相同數據類型的元素的集合。
          c++為基本算術數據類型提供了內置的支持。同時他也支持雙精度和單精度的數據支持。除此之外c++還支持布爾類型,以及用來存放字符集中單個元素的字符支持。
          在內置數據類型和標準庫類類型之間的是復合數據類型(compuond type)特別是指針和數組類型。
          數組(array)是一個順序的容器.它包含單一類型的元素。
          例如:序列
          0 1 1 2 3 5 8 13 21
          代表菲波那契序列的前9個數。(只要給出前兩個數據,后面的數據就是前兩個數據的之和。)
          a[8]={0,1,2,3,4,5,6,7}
          當a[9]的時候,就會出現一位偏移錯誤(off-by-one):
          通常我們用循環來遍歷數組中的元素。
          例如:下面的程序初始化了一個數組。前9為分別為0---9
          int main()
          {
            int ia[10];
            int idex;
           for(idex=0;idex<10;idex++)
          {
           ia[idex]=idex;
          }
          for(idex=9;idex>=0;idex--)
          {
           cout<<ia[idex]<<"";
          cout<<endl;
          }
          }
          c++雖然對數據類型提供了內置的支持。但是這種支持只是限定于“讀寫單個數組元素”。c++不支持數組的抽象(abstracion),也不支持對整個數組的操作.我們有時候希望對整個的數組進行操作。例如:把一個數組賦值給另一個數組。對兩個數組進行比較。。想知道數組的大小。
          例如:給出兩個數組,我們不能直接用賦值操作符,把一個數組的值拷貝到另一個數組中去。
          比如:
          ia1[10], ia2[10]
          ia1[10]=ia2[10];/////錯誤。不能直接把一個數組的值通過賦值運算符賦值給另一個數組。
          如果想把一個數組的值賦值給另一個數組我們必須自己編寫程序。
          for(int idex=0;idex<10;idex++)
          {
            ia1[idex]=ia2[idex];

          }

          而且數組類型并沒有自己的意識。它并不知道自己的長度,我們必須另外記錄數組的信息。當我們希望把一個數組作為參數傳遞給一個函數的時候,問題就出現了。在c++中,數組不同于整型類型和浮點類型,它不是c++的一等公民(first——class),它是從c語言中繼承而來的,它反映了數據與對其進行操作的算法的分離。這正是過程話程序的特點。
          posted @ 2008-06-23 10:28 清流琴音 閱讀(219) | 評論 (1)編輯 收藏
           
          c++的輸入輸出功能是由輸入輸出流(iostream)庫提供的,輸入輸出流庫是c++面向對象類層次的一個結構,也是c++庫的一部分。
          終端的輸入也稱作是標準的輸入(standard input ),與預定義的iostream 對象sin 綁定在一起。
          終端輸出,也稱作是標準輸出(standard output ),與預定義的iosream的對象cout 綁定在 一起。
          第三那個預定義對象cerr,也稱為標準錯誤。也終端綁定。cerr通常用來給程序用戶提示錯誤的 信息,以警告的信息。
          任何想使用iostream庫的文件都要包含,相關的頭文件。
          #include< iostream.h>
          輸出操作符<<用來把一個值導向cout標準輸出或者cerr標準錯誤上。
          例如:
          cout<<"\n"; 中的“\n表示換行符(new line),輸出換行符的時候,它結束當前的行,并將輸出導向下一行。
          除了顯式的使用"\n"進行換行外,還是可以使用預定義的iostream 操作符endl。進行換行。
          操作符在iostream上,進行的是一個操作,而不只是簡單的提供一個數據。 
          文件的輸入和輸出:
          iostream庫也支持的輸入和輸出。所有能應用在標準當輸入和輸出的上的操作,也都可以應用在已經被打開的輸入和輸出文件上。
          為了打開一個文件供輸入和輸出,除了包含iostream外,還必須包含頭文件,
          #include<fstream>
          為了打開一個輸出文件,我們必須聲明一個ofstream類型的對象。
          ofstream outfile("name_of -files");
          為了測試是否成功的打開一個文件,我們可以用下面的代碼:
          if(!outfile)
          {
          ///如果文件不能打開,值為false

          }
          類似的,如果我們打開一個文件供輸入,那么我們必須聲明一個ifstream的對象。
          ifstream infile("name-of  _files")
          if(!infile)

          例如:
          c++中
          從一個文本中1.txt中讀內容到2.txt中,
          #include<iosrteam>
          #include<ftream>
          #include<string>
          using spacename std;//////注意這里。


          posted @ 2008-06-21 16:31 清流琴音 閱讀(165) | 評論 (0)編輯 收藏
           

          注釋是用來幫助程序員來讀程序結構的與語言。它是一種禮儀,可以用來說明變量的意義或者用來某一段難懂的代碼。注釋不會增加可執行代碼的長度,在生成可執行代碼之前編譯器會將注釋的部分從程序中去除的。
          c++中有兩種注釋符,一種是注釋對(/**/)。與c語言一樣,注釋的部分放在/**/之間。編譯器會將/**/之間的代碼當作注釋部分,注釋的可以放在任何位置。可以含有制表符,空格, 可以跨幾行。
          第二種注釋就是//雙斜線。它可以注釋單行的內容,注釋符右邊的內容都會被當作注釋的內容而被編譯器忽略。

          posted @ 2008-06-21 11:14 清流琴音 閱讀(156) | 評論 (0)編輯 收藏
           
          assert()是c語言標準庫提供的一個通用的標準庫預處理器宏。在代碼中經常用assert()來判斷一個必須的前提條件。例如:要打開一個文件,我們必須先知道合格文嘉你的名字,然后在可以打開為了使用assert()必須包含與之對應的頭文件
          #include < assert.h>
          下面是一個簡單的例子:
          assert(filename!=0);
          判斷是否文件的名字為0。建興斷言,如果文件的 名字為0,那么斷言失敗,輸出錯誤的診斷信息,然后中止程序。
          assrt.h是c標準庫頭文件的c名字。c++程序可以通過使用c的庫頭文件的c名字或者c++的名字來使用它。
          這個頭文件的c++名字是cassert. c庫頭文件的c++名字總是以c開頭,后面跟的是c名字去掉.h的名字。(因為c++中,頭文件的后綴各不相同,所以標準的c++沒有指定頭文件的后綴).
          使用c庫頭文件名字和使用c++的名字,那么#include 預處理器的效果也是不一樣的。
          例如:下面的#include指示符;
          #include<cassert>
          當我們把這個頭文件讀入我們的文本文件中的時候,頭文件中的內容 好似不可見的。因為所有的c++庫名字是在std名字空間中定義的。所以我們的文本文件是不可見的。除非我們使用using指示符顯示地使其可見。
          using  namespace  cassert;
          使用c庫的頭文件就可以直接的在文本文件中使用assert()。而無需使用using指示符了。


          posted @ 2008-06-21 11:12 清流琴音 閱讀(435) | 評論 (0)編輯 收藏
          僅列出標題
          共4頁: 上一頁 1 2 3 4 下一頁 
           
          主站蜘蛛池模板: 印江| 黑水县| 洛川县| 维西| 克东县| 贵南县| 广灵县| 库尔勒市| 德江县| 安多县| 德保县| 砚山县| 莱阳市| 南澳县| 台山市| 崇义县| 进贤县| 盖州市| 合肥市| 彭阳县| 历史| 察隅县| 西峡县| 洪洞县| 阿瓦提县| 钟山县| 大连市| 湘西| 武穴市| 伊川县| 囊谦县| 淮阳县| 柞水县| 洮南市| 怀集县| 民勤县| 临城县| 阿拉善左旗| 教育| 阿坝| 江孜县|