7.3 類的其他特性 筆記
7.3.1 類成員再探
定義類型別名
typedef std::string::size_type pos;
或者是
using pos = std::string::size_type;
用來定義型別的成員必須先定義後使用,這一點與普通成員函式相區別,因此,型別成員通常出現在類開始的地方
包含標頭檔案的形式#include "Screen.h",一定要用" ", 而不能用< >
成員函式過載,編譯器根據實參的數量來決定執行哪個版本的函式
char get() const { return contents[cursor]; //返回游標當前位置的字元 } inline char Screen::get(pos r, pos c) const { pos row = r * width; return contents[row + c]; // 返回指定返回指定游標位置的字元 }
可變資料成員
public:
void some_member() const;
private:
mutable size_t access_ctr = 0; //定義一個可變的size_t型別的資料成員
void Screen::som2_member() const
{
++access_ctr;
}
如果display()的返回型別是類型別,那麼在它之後還可呼叫其他成員函式,如:
myScreen.display(cout.set(4, 5, '#')); //先輸出後置位
返回引用的函式是左值的,意味著這些函式返回的是物件本身而非物件的副本。如果我們把一系列這樣的操作連線在一起的話,所有這些操作將在同一個物件上得到執行。若返回型別並非引用型別,則每次不斷返回操作後的副本 ,用呼叫運算子連結的一些列操作可以達到預期的操作效果,但是如果分開來寫則達不到預期的效果,因為每次都是返回一個執行了操作的副本,原物件並未作任何改變。
7.3.3類型別
即使兩個成員列表完全一致,他們也是不同的型別。對於一個類來說,它的成員和其他任何類的成員都已不是一回事。
類的宣告:
我麼可以僅僅宣告類而暫時不定義它:
Class Screen // Screen 類的宣告
這種型別有時被稱作前向宣告,對於型別Screen來說,在它宣告之後完全定義之前是一個不完全型別。也就是說,此時我們已知Screen是一個類型別,但是不清楚它到底包含哪些成員。
不完全型別只能在非常有限的情景下使用:可以定義指向這種型別的指標或引用。也可以宣告(但是不能定義)以不完全型別作為引數或者返回型別的函式。對於一個類來說,在我們建立它的物件之前該類必須被定義過,而不能僅僅被宣告。否則,編譯器就無法瞭解這樣的物件需要多少記憶體空間。
7.3.4 友元再探
每個類負責控制自己的友元類或友元函式
如果一個類想把一組過載函式宣告成它的友元,他需要對這組函式每一個分別宣告。
下面這段程式碼最重要的是理解友元宣告的作用是影響訪問許可權,它本身並非普通意義上的宣告。
struct X {
friend void f() {/*友元函式可以定義在類的內部*/};
X() { f(); } //錯誤,找不到識別符號,f()還沒被宣告
void g();
void h();
};
void X::g() { return f(); } //錯誤,找不到識別符號,f()還沒被宣告
void f(); //宣告那個定義在X中的函式
void X::h() { return f(); } // 正確:現在f()的宣告在作用域中了