在進行C++培訓時,發現有些概念對於初次接觸c++的同事可能有點難於理解,所以這裡做些總結,一方面方便同事閱讀,另一方面也是對自己技能的一個總結。
一、聲明(declaration):用於向程序表明變量的類型和名字,是用來將一個object、function、class或template的類型和名字告訴編譯器。由2部分組成:類型 + 標示符,標示符可以包含字符*、[ ]和(),表明這個名稱是類型的指針、數組或者返回類型的函數。
聲明並不帶有細節信息;
定義也是一種聲明;
extern關鍵字可用來聲明變量而不定義,只是說明變量定義在程序的其他地方;
變量可以聲明多次,但只能定義一次
例子:
char *pc; // 類型是pc,標示符是*pc,表明*pc是一個char。
extern float x; // 對象聲明
int func(double num); //函數聲明
class Person; //類聲明
template<class T>
class SmartPointer; //模板聲明
解讀復雜聲明的一種方法,遵循“聲明模仿使用”的原則逐步分解聲明。
例如:char * (*pfpc)();
* (*pfpc)(); // 是一個char
(*pfpc)(); // 是一個指向char的指針
(*pfpc); // 是一個返回char類型指針的函數
pfpc; // 是一個指向返回char類型指針的函數的指針
二、定義(definition):是用來將細節信息提供給編譯器。
對於object而言,定義是編譯器為它分配內存空間;
對於function或funciton template而言,定義是提供函數體;
對於class或class template而言,定義是列出該class或template的所有成員;
例子:
float x; //對象定義
//函數定義
int func(double num) {
int t = static_cast<int>(num);
return t;
}
//類定義
class Person {
public:
Person();
~Person();
String getName() const;
void setName(String name);
....
};
//模板定義
template<class T>
class SmartPointer {
public:
SmartPointer(T *p = 0);
~SmartPointer();
T * operator->() const;
T& operator*() const;
...
};
備注:如果聲明中有初始化,那麼它其實是定義。
例如: externdouble pi = 0;
此時pi是定義,所以如果這樣用的話會出錯:
extern double pi = 0;
extern double pi = 1; // 2個extern且初始化