ANSI C 特徵總結

2021-04-06 20:03:46 字數 4799 閱讀 4688

隨著c++的普及,標準的指定成了c++發展的必然趨勢。而制訂此一標準的工作是由ansi (american national standards institute,美國標準學會)與iso (international standardization organization,國際標準組織)進行。

ansi規則中的許多新規則都是對最初的c++進行的擴充。也可以不使用這些新的特徵。這些新特徵包括關鍵字mutable以及explicit。

有一些修改的潛在作用很大。現在ansi規則鼓勵某些程式設計方法而拋棄其他一些程式設計方法。儘管在一段時間內不會放棄對老式程式設計方法的支援,但是有一些程式設計方法最終是要被淘汰掉的——這意味著編譯器將給出警告並建議使用新的程式設計方法。遲早有一天會拋棄掉對這些舊方法的支援。

ansi規則的主要改變包括:

(1)新的標頭檔案的載入方式

在ansi/iso的c++標準裡,定義了乙個名為std的namespace,並將許多類定義在這個namespace。

例如,舊方法載入標頭檔案   #include

新方法則修改為     #include

using namespace std ;

(2)執行時間類資訊 rtti(run-time type inforamtion)

rtti中文字面翻譯為執行時間類資訊,也就是在執行時判別資料的型別,例如:判別模板被什麼型別套用?

首先在使用typeid前,必須include名為typeid的標頭檔案。可以利用typeid判別某一變數的資料型別 

int a;

if(typeid(a)==typeid(int))    // 判別a的資料型別是否為int

……或者取得變數的資料型別的名稱   char *data_type=typeid(a).name()    //輸出a的資料型別

(3)型別轉換

c語言對所有的情況都使用一種型別轉換運算子,在ansi/iso c++標準的草案中,新增了四種型別能夠轉換語法,分別針對四種特定的型別轉換需要,以取代傳統的型別轉換。新增的型別轉換語法能夠更精確地控制程式、減少程式錯誤的產生。這四種新的型別轉換運算子分別是:const_cast, dynamic_cast , reinteroret_cast,   static_cast。

const_cast (去除const屬性)

const_cast操作符用來幫助呼叫那些應該使用而沒有使用const關鍵字的函式。換句話說,就是供程式設計師在特殊情況下將限制為const成員函式的const定**除,使其能更改特定屬性。

例如:void display_num(double *p)

const double x;

display_num(& x);                //disallowed!  c++的規則禁止這樣呼叫,因為乙個const指標通常不能傳遞給乙個非const型別的引數

display_num(const_cast(& x));                 //將& x由const double *型別轉換為double *型別。

[note]:當使用const_cast操作符時,必須保證不改變指標所指向的資料。如果你使用const_cast操作符又設法改變指標所指向的資料,那麼將使實際結果無法預料。

const double x=17.5;

double *p;

p = const_cast(& x);

*p = 33.2;  // this operation is undefined!

dynamic_cast (程式執行時對型別進行的檢測)

在這四個新的運算子中間,只有dynamic_cast提供了新的功能。如果啟動了支援執行時間型別資訊(rtti),dynamic_cast可以有助於判斷在執行時所指向的物件的確切型別。它與typeid運算子有關。

使用dynamic_cast操作符有用的原因是乙個基類的指標能夠指向許多不同的子型別(派生類),可以將被轉型為基礎類的物件還原成原來的類。不過,限於物件指標的型別轉換,而非物件變數。

class b

;class d: public b

;void process_b(b *arg)

[note]:當編譯此型別程式時,必須設定專案中有關c++語言的設定,否則編譯器將出現錯誤資訊,而且會發生執行錯誤。點選project/setting選項,出現project setting對話方塊後,切換到c/c++標籤,然後點選enable run-time type information(rtti)核取方塊。

reinterpret_cast**換指標的型別)

reinterpret_cast操作符將乙個指標轉換成其他型別的指標,新型別的指標與舊指標可以毫不相干。通常用於某些非標準的指標資料型別轉換,例如將void *轉換為char *。它也可以用在指標和整形數之間的型別轉換上。

char a_char =』a』, * cp = & a_char;

void *vp;

vp=cp;

cout<<*(reinterprt_cast,char *>(vp));  // 輸出時將vp的型別由void* 轉換成char*

[note]:reinterpret_cast操作符存在潛在的危險,除非有使用它的充分理由,否則就不要使用它。例如,它能夠將乙個int *型別的指標轉換為float *型別的指標,但是這樣很容易造成整數資料不能被正確地讀取。

static_cast (轉換成為相關的物件或者指標)

static_cast操作符能在相關的物件和指標型別之間進行型別轉換。有關的類之間必須通過繼承或者建構函式或者轉換函式發生聯絡。static_cast操作符還能在數字(原始的)型別之間進行型別轉換。

通常,static_cast操作符大多用在將數域寬度較大的型別轉換為較小的型別的情況。當轉換的型別是原始資料型別時,這種操作可以有效地禁止編譯器發出警告。

long i = 17;

short j = static_cast(i);

同樣,可以沒有任何限制地將乙個基類的指標轉換為乙個派生類的指標。因為沒有執行執行時狀態檢查,你要保證實際的資料支援這個型別的轉換。這一點類似於dynamic_cast操作符。

還有一些其他的情況static_cast操作符能夠有效地被使用,但是這在大多數程式中是少見的。例如在a類中定義了乙個到b類的型別轉換,在b類中定義了乙個到int型的型別轉換。按照下面的操作類a的乙個物件可以被轉換為int型。

a oa;

int i = static_cast(static_cast(oa));

(4)其他關鍵字

除了前面提到的關鍵字,ansi規則支援mutable、explicit和bool:

關鍵字mutable與前面提到的const_cast 有異曲同工之處。它改變成員的宣告,甚至當成員是const物件的一部分,也可以對成員進行修改。

關鍵字explicit阻止建構函式進行轉換。

關鍵字bool定義乙個資料型別,此資料型別只有2個值:真(true)和假(false)。

完全可以不使用mutable和explicit。除了支援bool資料型別之外,ansi c++新增了兩個預定義的常量true與false,分別等於1和0。

(5)模板與例外處理

模板與異常處理是c++的兩個主要的特徵。現在許多編譯器都支援這兩個特徵,但是早期版本的c++並沒有這個特徵。編寫乙個通用的類或函式並可以在其中加入特殊的型別,所以模板技術可以是**重複使用。

除了支援使用關鍵字template定義新的模板之外,ansi規則也列出了標準模板庫stl(standard template library),在這個庫中包含許多通用的類。其設計的目的就是將程式設計裡經常用到的基本資料結構和演算法建成可供程式者套用的程式庫。

異常處理是用於響應執行時錯誤和其他事件的高階技術,它的用法要優於老式c庫函式raise和signal。例外處理(exception handling)是c++提供的錯誤處理機制。所謂的例外是exception的字面翻譯,意指程式意料之外的情況,也就是在程式正常執行下,出現未被期待發生的狀況。

例外處理的機制主要有兩大部分:錯誤偵測區塊和錯誤處理區塊。

try

catch(錯誤型別一)

catch (錯誤型別二)

…catch(…)   //如果前面未列舉處理型別,則由此處處理區塊處理

throw語句並不是只能丟出提示錯區資訊的字串,還可以丟出例外類的物件,所以針對例外處理,可以建立乙個例外類,通過這些類協助處理程式的錯誤。在c++標準裡,制訂了標準的例外處理類,它們都繼承於exception類,該類宣告了建構函式和析構函式,但不包括成員函式。這個基類有兩個子類(logic_error報告不能執行的錯誤;runtime_error報告無效的操作或不正確的結果),每個子類都對應一組通用異常。定義exception類的標頭檔案為exception標頭檔案,定義logic_error與runtime_error及其繼承類的標頭檔案為stdexcept。如果希望知道例外的錯誤資訊時,只要呼叫例外物件的what成員函式。

(6)if

語句中變數的作用範圍

在ansi c++中可以在if語句中宣告乙個變數。該變數的作用範圍是整個if語句塊。

if(int j = 1)

pd->func2(); // error!pd超出了作用範圍

因為轉換成功(因此返回乙個非空值給pd),所以在if語句塊中使用pd是安全的。如果在if語句塊之外使用pd,在編譯時就會產生錯誤。這樣就可以在程式發布之前改正這個錯誤。這樣的後果是,如果只在一處定義了pd,編譯器將阻止在pd作用範圍之外使用它,因此也防止了在執行時出錯。

(7)具有列舉型別的函式的過載

ansi c++增強了宣告為列舉型別的狀態;特別是過載函式時,可以將enum型別與其他整數型別區分開。而在c和c++的舊版本中,enum型別與int型別的引數宣告是可以互換的。

enum suit

;void func1(int n)

;};

ANSI C 預處理簡單總結

ansi c 預處理命令解析 具體命令如下 define 巨集定義 error 強迫編譯程式停止編譯,並輸出錯誤資訊,主要用於程式除錯 include 是編譯程式將另乙個原始檔嵌入到帶有 include的原始檔中 if elif else endif 預編譯分支命令。與c中 if elseif el...

ANSI C檔案IO管理

實驗4.2.1 3更新緩衝區內容 示例程式 setbuf example.c 1.執行示例程式。2.給出執行結果及分析。在示例程式的基礎上新增對fflush函式的測試。在設計文件中寫出測試思路。並給出執行結果及分析。執行結果 程式分析 第乙個測試寫入資料,檢視當前緩衝區內容為空,因為該程式設定為關閉...

Linux檔案操作(ANSI C)

1.檔案指標 ansi檔案操作提供了乙個檔案指標file來進行對檔案的開啟讀寫和關閉及其他訪問 它的結構體 typedef struct file 2.緩衝 緩衝目的是為了減少外部裝置的讀寫次數,同時使用緩衝能提高應用程式的讀寫效能 緩衝有三種 全緩衝 行緩衝 不帶緩衝。全緩衝 填滿才會操作 行緩衝...