最近看了c++ primer中的二到四章,每章除了敘述相應主題,還順帶講解了許多c++中的基本概念,其中好多涉及到了編譯器的工作原理,不理解還真的不好記憶,這裡做一下總結,以便查閱。大家也一起跟著複習一下吧。
首先要說的就是定義和宣告,定義也具有宣告的作用,在c++中乙個變數必須定義且只定義一次,但可以宣告多次,必須在使用變數之前定義或者宣告該變數。一處定義,多處宣告主要用於源**分布在多個檔案中的時候,即c++編譯器所支援的separate compilation(分別編譯)。下面就通過例子理解一下吧
example 1 非const變數的宣告和定義
// file_1.cpp
int counter; //定義
// file_2.cpp
extern int counter; //宣告
定義在全域性作用域(global scope)的非const變數是在整個程式中都可以訪問的(可以跨檔案),我們可以在乙個檔案的全域性作用域定義變數,通過正確的宣告在另外的檔案中使用這個變數。
example 2 const變數的宣告和定義
//file_1.cpp
extern const int bufsize = fcn();//定義
//file_2.cpp
extern const int bufsize;//宣告
大家都看出區別來了吧,為什麼定義const變數時也需要extern呢?是因為const變數預設只能夠在當前檔案中訪問,只有在定義的時候加上extern才能在整個程式中訪問。宣告時同樣需要extern關鍵字。
接下來說說標頭檔案吧,標頭檔案是用來放宣告的而不是定義,標頭檔案經常被很多原始檔包含,如果裡面放定義,那不是違反了定義只能出現一次的規則(如果定義多次,編譯器在鏈結的時候它怎麼知道該用哪個定義?)。對於以上這個規則有三種例外情況大家需要注意,class的定義,在編譯時就能確定值的const變數的定義,inline函式的定義,它們都允許在多個原始檔中同時定義只要它們在每個檔案中的定義完全相同(這不正好放到標頭檔案中嗎,你說對吧),下面我們分別解釋解釋吧
情況1:class的定義
在分別編譯每個原始檔時,編譯器需要知道類的定義,這樣它才能知道該類的例項都能呼叫什麼函式,函式的引數都是什麼,從而進行語法檢查。這個應該很好理解吧,我們經常把乙個或者多個類的定義放到乙個標頭檔案中,實際我更習慣把這種情況稱為類的宣告(用來區分類的具體實現)。
情況2:編譯時就能確定值的const變數
比如const int magic_number = 512; 前面講過預設情況下const變數是不能被其他檔案訪問的,所以可以將它放在標頭檔案中啊,實際上大部分編譯器在編譯時會用常數表示式(在這裡就是512)替換掉const變數。那對於編譯時不能確定的const變數,如何定義呢?你應該已經知道了吧!
//原始檔中定義const變數時加上extern關鍵字
extern const int magic_number = 512;
//標頭檔案中宣告const變數
extern const int magic_number;
情況3:inline函式,無論是全域性的inline函式,還是類實現中的inline函式都可以放到標頭檔案中,這是因為編譯器並不把inline函式作為乙個函式來編譯,而是做類似於巨集的處理(比巨集好用,例如它可以進行函式引數,返回值的型別檢查)將inline函式的實現展開到呼叫該函式的地方。這就是為什麼它也可以定義在標頭檔案中。(如果在類的定義中直接寫函式實現,則該函式被直接實現為inline函式,其他情況都需要inline關鍵字)
c 中的一些基本概念
tom archer寫的 c 技術內幕 通俗易懂,翻譯行文流暢,菜鳥如我也能順利地讀下去,不錯。覺得有些東西還是值得邊讀邊記的,留作以後參考。c 中的數值型別與引用型別 數值型別 數值型別類似c中的變數型別,當宣告乙個數值型別的時候,是在棧上分配相應的儲存空間,並且後續的操作都是直接針對這些已分配的...
C 一些基本概念
建構函式的作用是對物件本身做初始化工作,也就是給使用者提供初始化類中成員變數的一種方式。析構函式是釋放物件執行期間所申請的資源。函式的過載,過載構成的條件 函式的引數型別不同 引數個數不同,才能構成函式的過載 在乙個類中 注意,只有函式的返回型別不同是不能構成函式的過載。在函式過載時,要注意函式帶有...
C語言一些基本概念
exit 0 正常執行程式並退出程式 exit 1 非正常執行導致退出程式 return 返回函式,若在主函式中,則會退出函式並返回一值。再細化一點 1.return返回函式值,是關鍵字 exit 是乙個函式。2.return是語言級別的,它表示了呼叫堆疊的返回 而exit是系統呼叫級別的,它表示了...