1:C++編程思想 42頁
定義變量
int a;
這段代碼有足夠的信息讓編譯器為a分配空間,而且編譯器也確實給整數a分配了空間。
聲明變量
extern int a;
在變量定義前加extern關鍵字表示聲明一個變量但不定義它 。它表示"這只是一個聲明,它的定義在別的地方",關鍵字extern,它表示變量是在文件以外定義的,或在文件后面部分才定義.
聲明函數
C/C++的函數聲明就是給函數取名,指定函數的參數類型和返回值.例如
int func1(int, int);
第一個關鍵字是函數返回值類型:int .參數按其使用的順序依次排在函數后面的括號內.分號說明聲明結束,在這種情況下,它告訴編譯器"就這些,這里沒有函數定義."
在函數聲明時,可以給參數命名(形參)。編譯器會忽略這些參數名,但對程序員來說它們可以幫助記憶.例如:
int func1(int length, int width);
對於帶空參數列表的函數,C和C++有很大的不同.在C語言中,聲明
int func2();
表示"一個可帶任意參數(任意數目,任意類型)的函數".這就妨礙了類型檢查.而在C++語言中它就意味着"不帶參數的函數".
定義函數
函數定義看起來像函數聲明,但它還有函數體.函數體是一個用大括號括起來的語句集.大括號表示這段代碼的開始和結束.為了定義函數體為空(函數體不含代碼)函數func1(),應當寫為:
int func1(int length, int width) {}
extern也可用於函數聲明.例如:
extern int func1(innt length, int width);
這種聲明方式和先前的func1()聲明方式一樣。因為沒有函數體,編譯器必定把它作為聲明而不是函數定義。extern關鍵字對函數來說是多余的,可選的。C語言的設計者並不要求函數的聲明使用extern,這可能有些令人遺憾;如果函數聲明也要求使用extern,那么在形式上與變量聲明更加一致,從而減少了混亂。
2:C++精髓:軟件工程方法
在其他的語言中,聲明與定義是同義詞C++與C一樣,認為兩者之間有一些區別。定義使變量的名字對應了指定類型,並為變量分配了相應的存儲空間,而聲明只是使變量的名字與類型之間建立了對應關系,因為變量的存儲空間在其他地方分配。例如,這種情況發生在一個由多文件組成的程序中,
在一個文件中定義了變量,而在另一個文件中使用了該變量。在使用這個變量的文件中,使用了關鍵字extern將變量定義為外部變量:
extern int count;
現在,我們可以在這個文件的源代碼中使用變量count。在這個文件中所有對變量count的引用都會轉換為在另一個文件中定義的變量的count的地址.
另外一個定義和聲明之間的區別是,變量在程序中只能進行唯一的一次定義,而聲明的次數可以任意多次。例如:
不允許這樣進行重復定義int a; int a;
但是可以這樣聲明 extern int count; extern int count;
229頁.
函數的定義在一個程序中只能出現一次,但可以有多個函數原型。函數原型通常放在一個單獨的工程目錄的頭文件中。這些文件在調用這些函數的源文件中用#include宏指令導入。C++允許我們在函數原型中不給出形式參數的命名。的確,參數名只有在函數的定義中才會用到。
void PutValues(int, int);
對程序員定義的函數而言,使用參數名可以為參數的作用提供幫助性的提示。
一些程序員並不在客戶代碼文件的開頭處聲明函數原形,而是在要調用函數的客戶函數中作為文檔的輔助手段進行聲明。這可以清楚地告訴維護人員,就是這個函數(而不是同一個文件中的其他許多函數)使用了服務器函數。這是一個很重要的軟件工程論題.例如:
void Client(void) {
//聲明本方法中要使用的函數,這個技巧很重要
void PutValues(int value, int count);
int val;
int cnt;
count << "Please enter the value and its count: ";
cin >> val >> cnt;
//調用服務器函數
PutValues(val, cnt);
}