const的用法及部分面試題解析
1、const修飾常量
C++中用const限定符將一個物件轉化為一個常量,因為常量是不可以改變的,所以const修飾的變數在定義時必須初始化,否則將會出現錯誤。在全域性範圍內定義一個變數,一般是和定義該全域性變數得原始檔在一個資料夾裡面的所有原始檔都可以去訪問這個全域性變數,但是用const限定符修飾的變數就不能在其他檔案中被訪問。除非你用extend修飾原始檔中的全域性變數和在訪問之前宣告一下,也就是說在C++中const修飾的變數是預設內部連結的,把上面的驗證一下:
const在C和C++中的區別
在C中 const int i;是對的可以通過編譯,因為在C中預設const是外聯的,就是外部可以直接訪問而不用進行宣告,這和C++是不一樣的。在C中上面的那一句程式碼類似於一個宣告,說明如果在本原始檔中沒有該變數
,那麼該變數可能存在其他的原始檔中。在C中const的意思為一個不能被改變的普通變數,C修飾的變數總是佔有空間,C編譯器不能把const修飾的變數視為一個編譯期間的常量。
const與#define的區別
const最初的動機就是為了取代#define的值替代功能,他還被用於指標,函式變數,返回型別,類物件及其成員函式。所有的這些用法都稍有區別,但是大致上概念都是一致的。
使用const比起使用#define來是有很多優點的:
(1)const是有型別的,而#define是沒有型別的,在進行替換時編譯器會對const修飾的變數進行型別安全檢查,而對於#define修飾本變數只是簡單的進行替換,不進行型別檢查。沒有型別檢查,只是簡單替換後,會出現意想不到的錯誤。
(2)對於#define修飾的變數在原始檔中每出現一次就要替換一次,如果有1000個就會產生1000個備份,但是用const修飾的變數就不一樣了,在一個原始檔中有一個就可以了,所以const修飾比#define 修飾產生的目的碼更小
(3)const還可以進行常量壓縮,即如果const int i=2*2;在編譯的時候就會進行必要的計算把i儲存為4。
const修飾符與指標
這個其實很簡單的,去掉資料型別就是const所修飾的內容比如:double const cptr;const修飾的是*cptr 也就是說指標指向的內容不能改變,const double *cptr和這個意思是一樣的。double*const cptr的意思是指標cptr的指向空間不能變。空間裡面的內容可變const double
1.給定宣告如下:
const char* pp;
下面操作那個是正確的?
A.pp++ B.(*pp)++ C.(**pp)=‘c’ D.以上都不對。
按照上面我說的這個題明顯選A,沒毛病pp指標指向空間裡的內容不能改變,但是pp指標的指向是可以變化的。
2.下面的程式碼是否正確?
char *const ch[2]={“abc”,”def”};
ch[0]=”ABC”;//語句1
ch[1]=”DEF”;//語句2
解析:語句1、2 都錯了,陣列中儲存的是char型別指標,const修飾下指標的指向是不能改變的,所以將指標指向新的字串會發生錯誤。
const修飾函式引數
如果函式是以值傳遞的可以用const限制函式引數,明確的告訴編譯器,這個變數的值在函式體內是不能改變的。但是值傳遞用const修飾是沒什麼大的意義的,一般如果是址傳遞的話都儘量要用const修飾
const修飾成員函式
const修飾成員函式的目的是為了確保該成員函式可以作用於const物件身上。const物件、指向const物件的指標或引用只能呼叫const成員函式,如果嘗試用來呼叫非const成員函式的話會出現錯誤。如果不存在const成員函式的話const物件的操作是極其困難的,無法呼叫任何成員函式。
const成員變數
const成員變數就有一點需要注意的就是初始化的過程,const成員變數在定義時是不能初始化的,這個和static修飾的成員變數是一樣的。但是不同的是初始化的位置,const修飾的成員變數是在建構函式的初始化列表裡進行初始化的而static修飾的成員函式是在類的定義外進行的初始化,類內只能宣告。
const就總結到這裡,這個其實也不是很難,有什麼問題或者是文章有什麼錯誤,請評論