c++primer第五版7.23題知識點

TinnCHEN發表於2019-01-24
class screen {
public:
	typedef string::size_type pos;//定義型別成員(string::size_type型別見類下方註釋),還可以使用using型別別名來定義using pos = string::size_type;
	screen() = default; //因為我們有定義建構函式,所以預設構造引數應該顯示宣告
	screen(pos ht, pos wd, char c) : height(ht), width(wd), contents(ht*wd, c){}
	screen(pos ht, pos wd):height(ht), width(wd), contents(ht*wd,' '){}
	char get() const { return contents[cursor]; }//隱式內聯
	inline char get(pos ht, pos wd) const;//顯示內聯
	screen &move(pos r, pos c);
private:
	pos cursor = 0;
	pos height = 0, width = 0;
	string contents;
};
/*
string::size_type型別
從邏輯上講size()成員函式應該返回整形數值,但事實上返回的string::size_type型別的值。
我們需要對這種型別做一些解釋。string類型別和許多其他庫型別都定義了一些夥伴型別(companion types)。這些夥伴型別使得庫型別的使用是機器無關的(machine-independent)。
size_type就是這些夥伴型別中的一種。它定義為與unsigned型(unsigned int或unsigned long)具有相同的含義,而且可以保證足夠大可儲存任意string物件的長度。
為了使用由string型別定義的size_type型別,程式設計師必須加上作用域操作符來說明所使用的size_type型別是由string類定義的。  
任何儲存string的size操作結果的變數必須為string::size_type型別。特別重要的是,不要把size的返回值賦給一個int變數。
雖然我們不知道string::size_type的確切型別,但可以知道它是unsigned型(2.1.1節)。對於任意一種給定的資料型別,它的unsigned型所能表示的最大正數值比對應的signed要大一倍。
這個事實表明size_type儲存的string長度是int所能儲存的兩倍。  
使用int變數的另一個問題是,有些機器上int變數的表示範圍太小,甚至無法儲存實際並不長的string物件。如在有16位int型的機器上,int型別變數最大隻能表示32767個字元的string物件。
而能容納一個檔案內容的string物件輕易就會超過這個數字。因此,為了避免溢位,儲存一個string物件size的最安全的方法就是使用標準庫型別string:: size_type。
*/