這是一個所有程序員都應(yīng)該了解的小型的 C++ 詞匯表。下面的條目都足夠重要,值得我們對它們的含義務(wù)必取得完全一致。
聲明(declaration)告訴編譯器關(guān)于某物的名字和類型,但它省略了某些細(xì)節(jié)。以下這些都是聲明:
extern int x; // object declaration
std::size_t numDigits(int number); // function declaration
class Widget; // class declaration
template // template declaration
class GraphNode; // (see Item 42 for info on
// the use of "typename")
注意即使是內(nèi)建類型,我還是更喜歡將整數(shù)看作一個 "object",某些人將 "object" 這個名字保留給用戶定義類型,但我不是他們中的一員。再有就是注意函數(shù) numDigits 的返回類型是 std::size_t,也就是說,namespace std 中的 size_t 類型。這個 namespace 是 C++ 標(biāo)準(zhǔn)庫中每一樣?xùn)|西實際所在的地方。但是,因為 C 標(biāo)準(zhǔn)庫(嚴(yán)謹(jǐn)?shù)卣f,來自于 C89)在 C++ 中也能使用,從 C 繼承來的符號(諸如 size_t)可能存在于全局范圍,std 內(nèi)部,或兩者都有,這依賴于哪一個頭文件被 #included。在本書中,我假設(shè) C++ 頭文件被 #included,這也就是為什么我用 std::size_t 代替 size_t 的原因。當(dāng)行文中涉及到標(biāo)準(zhǔn)庫組件時,我一般不再提及 std,這依賴于你認(rèn)可類似 size_t,vector,以及 cout 之類的東西都在 std 中,在示例代碼中,我總是包含 std,因為真正的代碼沒有它將無法編譯。
順便說一下,size_t 僅僅是某些供 C++ 對某物計數(shù)時使用的 unsigned 類型的 typedef(例如,一個基于 char* 的 string 中字符的個數(shù),一個 STL 容器中元素的個數(shù),等等)。它也是 vector,deque,以及 string 的 operator[] 函數(shù)所持有的類型,這是一個在 Item 3 中定義我們自己的 operator[] 函數(shù)時將要遵守的慣例。
每一個函數(shù)的聲明都表明了它的識別標(biāo)志(signature),也就是它的參數(shù)和返回類型。一個函數(shù)的識別標(biāo)志(signature)與它的類型相同。對于 numDigits 的情況,識別標(biāo)志(signature)是 std::size_t (int),也就是說,“函數(shù)持有一個 int,并返回一個 std::size_t”。官方的“識別標(biāo)志(signature)”的 C++ 定義排除了函數(shù)的返回類型,但是在本書中,將返回類型考慮為識別標(biāo)志的一部分更加有用。
定義(definition)為編譯器提供在聲明時被省略的細(xì)節(jié)。對于一個對象,定義是編譯器為對象留出內(nèi)存的地方。對于一個函數(shù)或一個函數(shù)模板,定義提供代碼本體。對于一個類或一個類模板,定義列出了類或者模板的成員:
int x; // object definition
std::size_t numDigits(int number) // function definition.
{
// (This function returns
std::size_t digitsSoFar = 1; // the number of digits
// in its parameter.)
while ((number /= 10) != 0) ++digitsSoFar;
return digitsSoFar;
}
class Widget {
// class definition
public:
Widget();
~Widget();
...
};
template // template definition
class GraphNode {
public:
GraphNode();
~GraphNode();
...
};
初始化(Initialization)是設(shè)定一個對象的第一個值的過程。對于用戶定義類型的對象,初始化通過構(gòu)造函數(shù)完成任務(wù)。缺省構(gòu)造函數(shù)(default constructor)就是不需要任何引數(shù)(arguments)就可以調(diào)用的構(gòu)造函數(shù)。這樣的一個構(gòu)造函數(shù)既可以是沒有參數(shù)(parameters),也可以是每一個參數(shù)都有缺省值:
class A {
public:
A(); // default constructor
};
class B {
public:
explicit B(int x = 0, bool b = true); // default constructor; see below
}; // for info on "explicit"
class C {
public:
explicit C(int x); // not a default constructor
};
聲明(declaration)告訴編譯器關(guān)于某物的名字和類型,但它省略了某些細(xì)節(jié)。以下這些都是聲明:
extern int x; // object declaration
std::size_t numDigits(int number); // function declaration
class Widget; // class declaration
template
class GraphNode; // (see Item 42 for info on
// the use of "typename")
注意即使是內(nèi)建類型,我還是更喜歡將整數(shù)看作一個 "object",某些人將 "object" 這個名字保留給用戶定義類型,但我不是他們中的一員。再有就是注意函數(shù) numDigits 的返回類型是 std::size_t,也就是說,namespace std 中的 size_t 類型。這個 namespace 是 C++ 標(biāo)準(zhǔn)庫中每一樣?xùn)|西實際所在的地方。但是,因為 C 標(biāo)準(zhǔn)庫(嚴(yán)謹(jǐn)?shù)卣f,來自于 C89)在 C++ 中也能使用,從 C 繼承來的符號(諸如 size_t)可能存在于全局范圍,std 內(nèi)部,或兩者都有,這依賴于哪一個頭文件被 #included。在本書中,我假設(shè) C++ 頭文件被 #included,這也就是為什么我用 std::size_t 代替 size_t 的原因。當(dāng)行文中涉及到標(biāo)準(zhǔn)庫組件時,我一般不再提及 std,這依賴于你認(rèn)可類似 size_t,vector,以及 cout 之類的東西都在 std 中,在示例代碼中,我總是包含 std,因為真正的代碼沒有它將無法編譯。
順便說一下,size_t 僅僅是某些供 C++ 對某物計數(shù)時使用的 unsigned 類型的 typedef(例如,一個基于 char* 的 string 中字符的個數(shù),一個 STL 容器中元素的個數(shù),等等)。它也是 vector,deque,以及 string 的 operator[] 函數(shù)所持有的類型,這是一個在 Item 3 中定義我們自己的 operator[] 函數(shù)時將要遵守的慣例。
每一個函數(shù)的聲明都表明了它的識別標(biāo)志(signature),也就是它的參數(shù)和返回類型。一個函數(shù)的識別標(biāo)志(signature)與它的類型相同。對于 numDigits 的情況,識別標(biāo)志(signature)是 std::size_t (int),也就是說,“函數(shù)持有一個 int,并返回一個 std::size_t”。官方的“識別標(biāo)志(signature)”的 C++ 定義排除了函數(shù)的返回類型,但是在本書中,將返回類型考慮為識別標(biāo)志的一部分更加有用。
定義(definition)為編譯器提供在聲明時被省略的細(xì)節(jié)。對于一個對象,定義是編譯器為對象留出內(nèi)存的地方。對于一個函數(shù)或一個函數(shù)模板,定義提供代碼本體。對于一個類或一個類模板,定義列出了類或者模板的成員:
int x; // object definition
std::size_t numDigits(int number) // function definition.
{
// (This function returns
std::size_t digitsSoFar = 1; // the number of digits
// in its parameter.)
while ((number /= 10) != 0) ++digitsSoFar;
return digitsSoFar;
}
class Widget {
// class definition
public:
Widget();
~Widget();
...
};
template
class GraphNode {
public:
GraphNode();
~GraphNode();
...
};
初始化(Initialization)是設(shè)定一個對象的第一個值的過程。對于用戶定義類型的對象,初始化通過構(gòu)造函數(shù)完成任務(wù)。缺省構(gòu)造函數(shù)(default constructor)就是不需要任何引數(shù)(arguments)就可以調(diào)用的構(gòu)造函數(shù)。這樣的一個構(gòu)造函數(shù)既可以是沒有參數(shù)(parameters),也可以是每一個參數(shù)都有缺省值:
class A {
public:
A(); // default constructor
};
class B {
public:
explicit B(int x = 0, bool b = true); // default constructor; see below
}; // for info on "explicit"
class C {
public:
explicit C(int x); // not a default constructor
};