聲明( declaration )是告訴編譯器某個東西的名稱和類型( type ),但略去細節。git
下面是聲明的例子:函數
extern int x; //對象(object )聲明 size_t numDigits( int number ); //函數聲明( function ) 聲明 class Widget; //類( class )聲明 template<typename T> class GraphNode; //類模版( template )聲明 template<typename T> T function( T number1, T number 2); //函數模版聲明
定義( definition )是提供編譯器一些聲明所遺留的細節。spa
對對象( object )而言,定義是編譯器爲此對象分配內存。code
對函數( function ) 或 函數模版( function template ) 而言,定義是提供代碼本體。對象
對類( class ) 或 類模版( class template )而言,定義列出他們的成員。blog
下面是定義的例子:內存
int x; //對象的定義 size_t numDigits( int number ) //函數的定義 { //do something return 1; } class Widget //類的定義 { public: Widget(); ~Widget(); … } template< typename T > //類模版的定義 class GraphNode { public: GraphNode(); ~GraphNode(); …. } template<typename T> T function( T number1, T number 2) //函數模版的定義 { return number1 + number2; }
初始化( Initialization )是」給予對象初值」的過程。ci
對用戶自定義類型的對象而言,初始化由構造函數執行。默認( default )構造函數是一個可被調用而不帶任何參數,這樣的默認構造函數要麼沒有參數,要麼就是每一個參數都有缺省值。get
class A { public: A(); //默認構造函數 }; class B { public: explicit B( int x=0, bool b=true ); //默認構造函數 }; class C { public: explicit C( int x ); //不是默認構造函數,是帶參數的構造函數 };
上述的 class B 和 class C的構造函數都被聲明爲 explicit, 關於 explicit,請參考explicit淺談。它可用來阻止隱式轉換( implicit type conversions )爲了防止隱式使用拷貝構造函數,但仍能夠進行顯示類型轉換( explicit type conversions );編譯器