關鍵字const有什么含意?修飾類呢?static的作用,用于類呢?還有extern c的作用const 意味著"只讀",下面的聲明都是什么意思? const int a; int const a; const int *a; int const *a; const int const *a ;
前兩個的作用是一樣,a是一個常整型數。
第三個意味著a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。
第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。
最后一個意味著a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。
結論: 關鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數為常量是為了告訴了用戶這個參數的應用目的。
如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多余的信息。(當然,懂得用const的程序員很少會留下的垃圾讓別人 來清理的。) 通過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼。
合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。
(1)欲阻止一個變量被改變,可以使用 const 關鍵字。在定義該 const 變量時,通常需要對它進行初始化,因為以后就沒有機會再去改變它了;
(2)對指針來說,可以指定指針本身為 const,也可以指定指針所指的數據為 const,或二者同時指定為 const;
(3)在一個函數聲明中,const 可以修飾形參,表明它是一個輸入參數,在函數內部不能改變其值;
(4)對于類的成員函數,若指定其為 const 類型,則表明其是一個常函數,不能修改類的成員變量;
(5)對于類的成員函數,有時候必須指定其返回值為 const 類型,以使得其返回值不為“左值”。
關鍵字volatile有什么含意?并給出三個不同的例子。一個定義為 volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。
精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。
下面是volatile變量的幾個例子: 并行設備的硬件寄存器(如:狀態寄存器) 一個中斷服務子程序中會訪問到的非自動變量(Non-automatic variables) 多線程應用中被幾個任務共享的變量 一個參數既可以是const還可以是volatile嗎?解釋為什么。 一個指針可以是volatile 嗎?解釋為什么。 下面是答案: 是的。一個例子是只讀的狀態寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。 是的。盡管這并不很常見。一個例子是當一個中服務子程序修該一個指向一個buffer的指針時。
static 關鍵字的作用:
(1)函數體內 static 變量的作用范圍為該函數體,不同于 auto 變量,該變量的內存只被分配一次,因此其值在下次調用時仍維持上次的值;
(2)在模塊內的 static 全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問;
(3)在模塊內的 static 函數只可被這一模塊內的其它函數調用,這個函數的使用范圍被限制在聲明它的模塊內;
(4)在類中的 static 成員變量屬于整個類所擁有,對類的所有對象只有一份拷貝;
(5)在類中的 static 成員函數屬于整個類所擁有,這個函數不接收 this 指針,因而只能訪問類的static 成員變量。
extern "C" 的作用:
(1)被 extern "C"限定的函數或變量是 extern 類型的; extern 是 C/C++語言中表明函數和全局變量作用范圍(可見性)的關鍵字,該關鍵字告訴編譯器, 其聲明的函數和變量可以在本模塊或其它模塊中使用。
(2)被 extern "C"修飾的變量和函數是按照 C 語言方式編譯和連接的;
extern "C"的慣用法:
(1)在 C++中引用 C 語言中的函數和變量,在包含 C 語言頭文件(假設為 cExample.h)時,需進 行下列處理: extern "C" { #include "cExample.h" } 而在 C 語言的頭文件中,對其外部函數只能指定為 extern 類型,C 語言中不支持 extern "C"聲明,在.c 文件中包含了 extern "C"時會出現編譯語法錯誤。
(2)在 C 中引用 C++語言中的函數和變量時,C++的頭文件需添加 extern "C",但是在 C 語言中不能直接引用聲明了 extern "C"的該頭文件,應該僅將 C 文件中將 C++中定義的 extern "C"函數聲明為extern 類型。
10.為什么標準頭文件都有類似以下的結構? #ifndef INCvxWorksh #define INCvxWorksh #ifdef cplusplus extern "C" { #endif /.../ #ifdef cplusplus } #endif #endif / __INCvxWorksh / 顯然,頭文件中的編譯宏“#ifndef INCvxWorksh、#define INCvxWorksh、#endif” 的作用是防止該頭文件被重復引用。