今天寫代碼是遇到這樣一個問題error: expected constructor, destructor, or type conversion before '.' token;立馬網上查,原來是說不能再全局域進行不能用於賦值、運算、調用函數等,只能作變量的聲明和初始化變量。ios
下面是我出錯的代碼:函數
#include <iostream>設計
int a[100];對象
memset(a,0,sizeof(a));//出錯的地方,不能再全局域對變量進行賦值操做token
int main(){作用域
//doing something編譯器
}it
說道這裏咱們不能不清楚 初始化、聲明、定義的區別:如下轉載他人的一遍總結文章io
《C++Primer》第四版 2.3.5節中這麼說到:編譯
①變量定義:用於爲變量分配存儲空間,還可爲變量指定初始值。程序中,變量有且僅有一個定義。
②變量聲明:用於向程序代表變量的類型和名字。
③定義也是聲明:當定義變量時咱們聲明瞭它的類型和名字。
④extern關鍵字:經過使用extern關鍵字聲明變量名而不定義它。
1.定義也是聲明,extern聲明不是定義,即不分配存儲空間。extern告訴編譯器變量在其餘地方定義了。
例如:extern int i; //聲明,不是定義
int i; //聲明,也是定義
2.若是聲明有初始化式,就被看成定義,即便前面加了extern。只有當extern聲明位於函數外部時,才能夠被初始化。
例如:extern double pi=3.1416; //定義
3.函數的聲明和定義區別比較簡單,帶有{ }的就是定義,不然就是聲明。
例如:extern double max(double d1,double d2); //聲明
4.除非有extern關鍵字,不然都是變量的定義。
例如:extern int i; //聲明
int i; //定義
程序設計風格:
1. 不要把變量定義放入.h文件,這樣容易致使重複定義錯誤。
2. 儘可能使用static關鍵字把變量定義限制於該源文件做用域,除非變量被設計成全局的。
3. 能夠在頭文件中聲明一個變量,在用的時候包含這個頭文件就聲明瞭這個變量。
總結:
變量在使用前就要被定義或者聲明。
在一個程序中,變量只能定義一次,卻能夠聲明屢次。
定義分配存儲空間,而聲明不會。
C++程序一般由許多文件組成,爲了讓多個文件訪問相同的變量,C++區分了聲明和定義。
變量的定義(definition)用於爲變量分配存儲空間,還能夠爲變量指定初始值。在程序中,變量有且僅有一個定義。
聲明(declaration)用於向程序代表變量的類型和名字。定義也是聲明:當定義變量的時候咱們聲明瞭它的類型和名字。能夠經過使用extern聲明變量名而不定義它。不定義變量的聲明包括對象名、對象類型和對象類型前的關鍵字extern。
extern聲明不是定義,也不分配存儲空間。事實上它只是說明變量定義在程序的其餘地方。程序中變量能夠聲明屢次,但只能定義一次。
只有當聲明也是定義時,聲明才能夠有初始化式,由於只有定義才分配存儲空間。初始化式必需要有存儲空間來進行初始化。若是聲明有初始化式,那麼它可被看成是定義,即便聲明標記爲extern。
任何在多文件中使用的變量都須要有與定義分離的聲明。在這種狀況下,一個文件含有變量的定義,使用該變量的其餘文件則包含該變量的聲明(而不是定義)。
--------------------------------------------------------------------頭文件中定義與聲明
注意頭文件中不能夠放變量的定義!!!通常狀況下頭文件中只放變量的聲明,由於頭文件要被其餘文件包含(即#include),若是把定義放到頭文件的話,就不能避免屢次定義變量,C++不容許屢次定義變量,一個程序中對指定變量的定義只有一次,聲明能夠無數次。
不過有三個例外,一下三中實體的定義也可放到頭文件中。
1.值在編譯時就已知的const 變量的定義能夠放到頭文件中
如:const int num(10);
2.類的定義能夠放到頭文件中
3.inline 函數
這三個實體能夠定義在多個源文件中,只要在每一個源文件中的定義相同。
/--------------------------------------------------------------------頭文件中定義與聲明