備注:本人對C++理解較為淺薄,如果有不正確的地方請多多指教。
C++ 聲明和定義
聲明和定義最主要的區別是:聲明不申請內存空間而定義申請內存空間。
定義申請內存空間 這點需要...好像很多人這樣理解 我怎么以為這有點問題
這里有個簡單的錯誤,尤其是對我以C#的情景來理解C++。
頭文件中的 int a;(全局變量這樣寫)在C++ 中是定義。這里有個情況是 如果 int a;在自定義的類型中,將不再是定義。因為其不占用內存。
如果在函數體內,int a;這還是定義。
需要說明的是變量的定義和初始化是2個概念,請不要理解為一個。
一般變量的定義和初始化為在一起。即 int a=10;特別注意對定義的變量不進行初始化就直接使用的話,會產生無法預知的情況。
(這里有個情況:局部變量必須初始化才能用,全局變量如果沒有初始化編譯器會有默認值?類的字段的情況?與C#區別)
在同一個作用域(這點該怎么說呢?),只能定義一次。
一次定義規則:是指定義在所有進入連接的編譯單元中只能有一次。
我這里參考了Frank Fang中的C++中聲明和定義的區別的博客內容。
聲明和定義有幾種情況需要理解
1、在頭文件中自定義類型,其實就是我們常說的自定義類 ( 這里的定義不分配內存空間 )
上面定義的頭文件中iceTreeNode類僅僅告訴編譯器有定義類型,編譯器僅對其進行語法分析以及名字的決議,並未占用內存空間。
2、Extern關鍵字
extern 可以置於變量或者函數前,以表示變量或者函數的定義在別的文件中。提示編譯器遇到此變量和函數時在其他模塊中尋找其定義。另外,Extern也可用來進行連接指定(dll)
VS編譯器是采用按文件編譯的方式,因此在編譯時,各個文件中的定義的全局變量是相互透明的,也就是說,在編譯時候,全局變量的可見域限制在文件內部。
連接階段,各個文件的內容(實際是編譯產生的obj文件)是被合並到一起的。因而,定義於某文件內的全局變量,在鏈接完成后,它的可見性范圍被擴大到了整個程序。
extern的原理很簡單,就是告訴編譯器 ,當前變量在其它文件中定義。
extern 函數
常見extern放在函數的前面成為函數聲明的一部分。
如果函數的聲明中帶有關鍵字extern,僅僅是暗示這個函數可能在別的源文件中定義,沒有其它作用。
即:extern int f();和 int f();沒有區別
extern "C"
C++ 環境下使用C函數的時候,常常會出現編譯器無法找到obj模塊中的C函數定義,從而導致鏈接失敗。
C++ 語言在編譯的時候為了解決函數的多態問題,會將函數名和參數聯合起來生成一個中間的函數名稱。
而C語言則不會。因此會造成鏈接時找不到對應的函數的情況。此時C函數就需要用extern "C" 進行鏈接指定
告訴編譯器,請保持我的名稱,不要給我生成用於鏈接的中間函數名。
被extern “C”修飾的變量和函數時按照C語言方式編譯和鏈接的;
C++ 支持函數重載,而過程式C則不支持,
接下來:C++ 指針與引用 數組 string 字符串(重點) Void
函數 參數傳遞引用 其實也是以賦值的方式 只不過這個值為地址 比較C#中
C++ 模版 泛型編程理解
C++ 繼承 多態 虛函數 Static
C++ 內存模型
模板函數的實例化(也就是在調用的時候),需要訪問到模板函數的源代碼(也就是定義代碼,一般放在**.cpp中),也就是說在調用模板函數時需要include模板函數的
靜靜的尋找屬於自己的.....