1. 程式人生 > >7.3 類的其他特性 筆記

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()的宣告在作用域中了