C++ 聲明和定義


備注:本人對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模板函數的

靜靜的尋找屬於自己的.....


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM