關鍵字const並不能把變數變為常量!在乙個符號前加上const限定符只是表示這個符號不能被賦值。也就是他的值對於這個符號來說是唯讀的,但它並不防止通過程式的內部的方法來修改這個值。const最有用之處就是他來限定函式的形參,這樣該函式將不會修改實參指標所指的資料,但其他的函式卻可能會修改它。(1)可以定義const常量,具有不可變性。
例如:const int max=100; max++會產生錯誤;
(2)便於進行型別檢查,使編譯器對處理內容有更多了解,消除了一些隱患。
例如: void f(const int i) 編譯器就會知道i是乙個常量,不允許修改;
(3)可以保護被修飾的東西,防止意外的修改,增強程式的健壯性。還是上面的例子,如果在函式體內修改了i,編譯器就會報錯;
例如: void f(const int i)
(4) 可以節省空間,避免不必要的記憶體分配。例如:
#define pi 3.14159 //常量巨集
const double pi=3.14159; //此時並未將pi放入rom中 …
double i=pi; //此時為pi分配記憶體,以後不再分配!
double i=pi; //編譯期間進行巨集替換,分配記憶體
double j=pi; //沒有記憶體分配
double j=pi; //再進行巨集替換,又一次分配記憶體!
const定義常量從彙編的角度來看,只是給出了對應的記憶體位址,而不是像#define一樣給出的是立即數,所以,const定義的常量在程式執行過程中只有乙份拷貝,而#define定義的常量在記憶體中有若干份拷貝。
(5) 提高了效率。
編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高。
例一下面分別用const限定不可變的內容是什麼?
1)const在前面
const int nvalue; //int是const
const char *pcontent; //char是const, pcontent可變
const char* const pcontent; //pcontent和*pcontent都是const
2)const在後面,與上面的宣告對等
int const nvalue; //nvalue是const
char const * pcontent; //*pcontent是const, pcontent可變
char* const pcontent; //pcontent是const,*pcontent可變
char const* const pcontent; //pcontent和*pcontent都是const
分析:
const只修飾其後的變數,至於const放在型別前還是型別後並沒有區別。如:const int a和int const a都是修飾a為const。
注意不是一種型別,如果ptype之前是某型別,那麼ptype是指向該型別的指標
乙個簡單的判斷方法:指標運算子*,是從右到左,那麼如:char const * pcontent,可以理解為char const (* pcontent),即* pcontent為const,而pcontent則是可變的。
例二
int const * p1,p2;
p2是const;(p1)是一整體,因此(p1)是const,但p1是可變的。int * p1,p2只代表p1是指向整型的指標,要表示p1、p2都是指標是需寫成int * p1, p2。所以無論是 const p1,p2還是const * p1,p2,裡面的*都是屬於p1的。
例三
int const * const p1,p2;
p2是const,是前乙個const修飾的,*p1也被前乙個const修飾,而p1被後乙個const修飾。
例四
int * const p1,p2;
p1是const,(* const p1)是整體,所以const不修飾p2。
例五指標指向及其指向變數的值的變化
const在的左邊,則指標指向的變數的值不可直接通過指標改變(可以通過其他途徑改變);在的右邊,則指標的指向不可變。簡記為「左定值,右定向」。
1)指標指向的變數的值不能變,指向可變
int x = 1;
int y = 2;
const int* px = &x;
int const* px = &x; //這兩句表示式一樣效果
px = &y; //正確,允許改變指向
*px = 3; //錯誤,不允許改變指標指向的變數的值
2)指標指向的變數的值可以改變,指向不可變
int x = 1;
int y = 2;
int* const px = &x;
px = &y; //錯誤,不允許改變指標指向
*px = 3; //正確,允許改變指標指向的變數的值
3)指標指向的變數的值不可變,指向不可變
int x = 1;
int y = 2;
const int* const px = &x;
int const* const px = &x;
px = &y; //錯誤,不允許改變指標指向
*px = 3; //錯誤,不允許改變指標指向的變數的值
補充
在c中,對於const定義的指標,不賦初值編譯不報錯,
int* const px;這種定義是不允許的。
int const px;這種定義是允許的。
但是,在c++中
int const px;和const int* const px;會報錯,const int* px;不報錯。
必須初始化指標的指向int* const px = &x;const int* const px=&x;
this容易混淆的示例
注 this 永遠不會混亂,混亂的是我們而已。this永遠指向當前函式的主人。this混亂 1 新增了定時器 延時器 2 事件繫結 注 函式如果發生了賦值,this就混亂了。示例1和示例2是在事件繫結時出現this混亂的現象 示例1目的 點選頁面上的按鈕時也 能彈出 10 1 2349 50按鈕 5...
c 容易混淆的概念
簡單地說,c 標準庫包含了三個部分 c 標準庫的 c 版本 c io 庫 c stl io 庫最常用的 header 是 標頭檔案 stl 包括了很多容器類 vector,list,deque,stack.還有 functinal,algorithm,iterator 等 c 標準庫的 c 版本 設...
容易混淆的幾個方法
size x large 現在覺得有些東西非常容易搞混淆現在把他記錄下來 size request方法的 getrequesturl 返回的是 返回的是 blueyanghualongserlvet login.jsp 資源名稱 getcontextpath 返回的是 blueyanghaulogn...