程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> const用法詳解

const用法詳解

編輯:關於C語言

(1)const變量   非 const 變量默認為extern。要使 const 變量能夠在其他的源   文件中訪問,必須地指定它為 extern。否則會報錯:error LNK2001: 無法解析的外部符號"int const BUF_SIZE"(?BUF_SIZE@@3HB)  

\

\

            (2)const 限定符既可以放在類型前也可以放在類型後,如下s1和s2類型相同:   string const s1;    const string s2;    (3)指針和const   const的鑒別:在*左邊或右邊畫一道豎線,看是否和const在一起,和const在一起就是不可以改變的。const void *p1 不是p1不能改變,而是p1所指向的內容不可以改變。   如果const出現在*號左邊,修飾的是指針指向的對象,被指對象是常量,即對象不可修改。如果const出現在*號右邊,修飾的是指針本身,指針本身是常量,即指針不能再指向別的內存。如果const出現在*號兩邊,則指針和被指對象均是常量。   (3.1)指向const對象的指針   為了保證如果指針指向const對象,則不允許用指針來改變其所指的const值這個特性,C++ 語言強制要求指向const對象的指針也必須具有const特性。   把一個 const 對象的地址賦給一個普通的、非 const 對象的指針也會導致編譯時的錯誤:   const double pi = 3.14;   double *ptr = π // error:ptr is a plain pointer   const double *cptr = π //ok: cptr is a pointer to const   不能使用 void* 指針保存const 對象的地址,而必須使用 const void* 類型的指針保存 const 對象的地址:   const int universe = 42;   const void *cpv = &universe;// ok: cpv is const   void *pv = &universe; // error:universe is const   允許把非const對象的地址賦給指向const對象的指針,例如:   double dval = 3.14; // dval is adouble; its value can be changed   const double *cptr = &dval;// ok: but can't change dval through cptr   盡管所指的對象dval並非const,但仍不能使用cptr修改該對象的值,任何企圖通過指針cptr修改其值的行為都會導致編譯時的錯誤。本質上來說,由於沒有方法分辯cptr所指的對象是否為const,系統會把它所指的所有對象都視為const。不能使用指向const對象的指針修改基礎對象,可用其他方法修改const指針所指向的非const對象的值。   不能保證指向const的指針所指對象的值一定不可修改。可以把指向const的指針理解為“自以為指向const的指針”。   在實際的程序中,指向const的指針常用作函數的形參。將形參定義為指向const的指針,以此確保傳遞給函數的實際對象在函數中不因為形參而被修改。   (3.2)const 指針   本身的值不能修改   int errNumb = 0;   int *const curErr = &errNumb;// curErr is a constant pointer   我們可以從右向左把上述定義語句讀作“curErr是指向int型對象的const 指針”。與其他const量一樣,const指針的值不能修改,這就意味著不能使curErr指向其他對象。任何企圖給const指針賦值的行為都會導致編譯時的錯誤。與任何const量一樣,const指針也必須在定義時初始化。   指針本身是const的事實並沒有說明是否能使用該指針修改它所指向對象的值。指針所指對象的值能否修改完全取決於該對象的類型。   (3.3)指向const 對象的 const 指針   const double pi = 3.14159;   const double *const pi_ptr =π   本例中,既不能修改 pi_ptr 所指向對象的值,也不允許修改該指針的指向(即pi_ptr中存放的地址值)。可從右向左閱讀上述聲明語句:“pi_ptr 首先是一個 const 指針,指向 double類型的const對象”。   (4)const在函數中的應用   (4.1)const類型的形參 非引用形參時:形參與const形參等價。   是否將形參定義為 const。這種差異並不影響傳遞至函數的對象;其原因在於實參傳遞的方式。復制形參時並不考慮形參是否為const——函數操縱的只是副本。函數無法修改實參。既可將const對象傳遞給const形參,也可傳遞給非const 形參,這兩種形參並無本質區別。   有const引用形參的函數與有非const 引用形參的函數是不同的。類似地,如果函數帶有指向const類型的指針形參,則與帶有指向相同類型的非const對象的指針形參的函數不相同。   僅當形參是引用或指針時,形參是否為const才有影響。   (4.2)利用const引用避免復制,使用引用形參,函數可以直接訪問實參對象,而無須復制它。   (4.3)非引用形參時,不能基於形參是否為const來實現函數的重載。   f(int *);   f(int *const); // redeclaration   此時,const 用於修改指針本身,而不是修飾指針所指向的類型。在上述兩種情況中,都復制了指針,指針本身是否為const並沒有帶來區別。當形參以副本傳遞時,不能基於形參是否為const來實現重載。      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved