c++程式通常由許多檔案組成,為了讓多個檔案訪問相同的變數,c++區分了宣告和定義。
變數的定義(definition)用於為變數分配儲存空間,還可以為變數指定初始值。在乙個程式中,變數有且僅有乙個定義。c++支援兩種初始化變數的形式:複製初始化(copy-initialization)和直接初始化(direct-initialization);複製初始化語法用等號=,直接初始化則是把初始化式放在括號()中。
宣告(declaration)用於向程式表明變數的型別和名字。定義也是宣告:當定義變數時我們宣告了它的型別和名字。
可以通過extern關鍵字宣告變數名而不定義它(不分配儲存空間)。只有當extern宣告位於函式外部時,才可以含有初始化式。而如果宣告有初始化式,則它被認為是定義。
c++程式中,每個名字都與唯一的實體(比如變數、函式和型別等)相關聯。儘管有這樣的要求,還是可以在程式中多次使用同乙個名字,只要它用在不同的上下文中,且通過這些上下文可以區分該名字的不同意義。用來區分名字的不同意義的上下文稱為作用域(scope),作用域是程式的一段區域。乙個名稱可以和不同作用域中的不同實體相關聯。
定義在所有函式外部的名字具有全域性作用域(global scope),此外還有區域性作用域(local scope)和語句作用域(statement scope)。c++還有另外兩種不同級別的作用域:類作用域(class scope)和命名空間作用域(namespace scope)。
c++中作用域可巢狀,即定義在全域性作用域中的名字可以在區域性作用域中使用,定義在全域性作用域中的名字和定義在函式的區域性作用域中的名字可以在語句作用域中使用,等等。[ 在函式內定義乙個與函式可能會用到的全域性變數同名的區域性變數總是不好的,區域性變數最好使用不同的名字。 ]
預設地,第乙個列舉成員賦值為0,後面的每個列舉成員賦的值比前面的大1。列舉成員值可以是不唯一的。
在程式中,定義只可以出現一次,而宣告可以出現多次,所以定義不應該放在標頭檔案裡。同乙個程式中有兩個以上檔案含有任乙個相同的定義都會導致多重定義鏈結錯誤。對於標頭檔案不應該含有定義這一規則,有三個例外:類、編譯時已知道值的const物件和inline函式。這些實體可以在多個原始檔中定義,只要每個原始檔中的定義是相同的。
在標頭檔案中定義這些實體,是因為編譯器需要它們的定義(不只是宣告)來產生**。比如:為了產生能定義或使用類的物件的**,編譯器需要知道組成該型別的資料成員,以及在這些物件上執行的操作。這些資訊需要類定義提供。
一般來說,常量表示式是編譯器在編譯時就能夠計算出結果的表示式。當const變數通過常量表示式自我初始化時,這個const變數就可能是常量表示式。為了能夠讓多個檔案使用相同的常量值,const變數和它的初始化式必須是每個檔案都可見的。而要使初始化式可見,一般都把這樣的const變數定義在標頭檔案,則無論該const變數何時使用,編譯器都能夠看見其初始化式。然而,c++中的任何變數都只能定義一次,定義會分配儲存空間,而所有對該變數的使用都關聯到同一儲存空間。但因為const物件預設為定義它的檔案的區域性變數,所以把它們的定義放在標頭檔案是合法的,而且這有乙個很重要的含義:當我們在標頭檔案中定義了const變數後,每個包含該標頭檔案的原始檔都有了自己的const變數,其名稱和值都一樣。ps:實踐中,大部分的編譯器在編譯時都會用相應的常量表示式來替換對這些const變數的使用,即不會有任何儲存空間用於儲存該const變數。
如果const變數不是用常量表示式初始化,則不應該在標頭檔案中定義,而應該和其它變數一樣,在乙個原始檔中定義並初始化。在標頭檔案中新增extern宣告的話,則可以被多個檔案共享。
變數和基本型別
算術型別 arithmetic type c 標準規定了每個算術型別的最小儲存空間,但允許編譯器使用更大的儲存空間。事實上,對於int型,幾乎現在所有的編譯器使用的儲存空間都比所要求的大 也表明,在編寫程式時不能對這些型別的大小做任何假設 c 算術型別最小儲存空間規定如下 注 要特別注意int型,並...
變數和基本型別
一 資料型別 c 主要有bool,char,short,int,long,long long float,double,long double,wchar t 寬字元 char16 t char32 t unicode字元 每個型別對應不同的位元組尺寸,以上型別都是有符號的,加上關鍵字unsigne...
變數和基本型別
1.變數宣告和定義的關係extern int j 宣告j int j 定義j extern int j 0 定義2.識別符號的組成 3.變數命名規範 4.作用域理解 include 該程式僅用於說明,函式內部不宜定義與全域性變數同名的變數 int i 0 全域性變數 intmain 5.引用 引用並...