容易混淆的const

2021-09-25 19:52:00 字數 3085 閱讀 9219

關鍵字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...