(一三二)類的三種常見技術

2021-09-23 22:54:20 字數 2575 閱讀 8187

過載<<、>>運算子:

例如:ostream& operator<<(ostream&, const player& name);

其中:①ostream

類表示cout等,也支援寫入檔案的ofstream類。同理,也可以換位istream

、ifstream

類(但要把過載運算子也換為》);

②player&

表示類物件的引用,之所以用

const

進行限定,原因在於為了即可以支援被

const

限定的物件,也可以防止傳遞的引用被修改;

③假如類有返回需要值的類方法(例如某個函式返回某個私有成員),那麼就不必將其作為友元函式(獲得呼叫私有成員的許可權);否則,必須將其設定為友元函式;

④player

是類名。

轉換函式:

轉換函式有兩種形式:

①把非類物件(如基本型別)轉換為類物件;

②把類物件,轉換為基本型別。

關於第一種型別轉換,把非類物件轉換為類物件,是通過使用建構函式(只有乙個引數、或者其他引數都是預設引數時)。

例如,player a=5;

假如player

類有乙個建構函式:player(int ),

那麼其流程是這樣的:

建立乙個臨時物件(引數為5

,呼叫建構函式)——》採用逐成員複製的方式,將臨時物件賦值給物件a。

注意:在第二步逐成員複製的過程中,既不呼叫 複製建構函式(雖然他建立了乙個臨時物件給物件a

進行初始化)

,也不呼叫 賦值運算子(雖然有賦值符號,即使有

player& player::operator=(const

char*m)這樣的函式存在) ,呼叫的是符合條件的 建構函式 。

建構函式:初始化物件時,引數是非同類物件;

複製建構函式:初始化物件時,引數是同類物件(且只有乙個);

賦值運算子:非初始化時,遇見賦值符號使用。

另外提一下:

初始化物件的時候必然呼叫建構函式(如果引數是物件則呼叫複製建構函式);

在其他情況下,才會呼叫例如賦值運算子等。

關於第二種型別轉換,把類物件轉為非類物件。

假如有類物件player a;

使用int b=a; 

時,將呼叫轉換函式。

轉換函式的格式為:operator 型別名(無引數);

例如:operator

int()

return id;

就是返回物件的私有成員id

的值,並將其傳遞給

int型別變數a。

另外,為了防止隱式自動應用轉換函式,可以將轉換函式/

建構函式加上關鍵字explicit(英文意思是顯式的),當這樣使用的時候,除非使用強制型別轉換,否則不會隱式的自動呼叫轉換函式/

建構函式,將類物件和基本型別之間互轉。

加關鍵字的例子如:

① explicit player(int a); ——建構函式加關鍵字

② explicit operator int(); ——轉換函式加關鍵字

強制型別轉換的方式有:

player a;  int(a);————強制使用int

型別轉換函式

int a; player b= player(a); ——強制使用建構函式,將a

作為引數使用建立臨時物件。

建構函式使用new

的類:

如果類使用new

運算子來分配類成員指向的記憶體,在設計時應採用一些預防措施(因為編譯器無法幫你忙),預防措施有以下幾條:

①對於指向記憶體是由new

分配的每乙個類成員,都應該在析構函式使用

delete

依次釋放這些由

new分配的記憶體;

②如果析構函式使用delete

來釋放記憶體,那麼每個建構函式都應該使用

new來分配記憶體,或者指向空指標(

nullptr

,因為空指標可以被

delete);

③new

對應delete

、new

對應delete

,應該所有建構函式 和析構函式都應該統一;

④如果建構函式使用new

,那麼也應該定義乙個使用

new來分配記憶體的複製建構函式(這樣避免讓兩個物件的類成員指向同乙個記憶體位址);

⑤應定義乙個過載賦值運算子的類成員函式。其方法如下:

函式頭:類名& 

類名::operator = (cosnt 類名& mm)

函式定義:防自己賦值自己——if( this==&mm) return *this;

指標——先delete

,再用new

分配記憶體,然後

strcpy

拷貝內容。

基本型別——按值傳遞

返回:*this

例如:

player& player::operator=(const player& mm)

(一三二)類的三種常見技術

過載 運算子 例如 ostream operator ostream const player name 其中 ostream 類表示cout等,也支援寫入檔案的ofstream類。同理,也可以換位istream ifstream 類 但要把過載運算子也換為 player 表示類物件的引用,之所以用...

mysql三種引擎 MySQL常見的三種儲存引擎

簡單來說,儲存引擎就是指表的型別以及表在計算機上的儲存方式。儲存引擎的概念是mysql的特點,oracle中沒有專門的儲存引擎的概念,oracle有oltp和olap模式的區分。不同的儲存引擎決定了mysql資料庫中的表可以用不同的方式來儲存。我們可以根據資料的特點來選擇不同的儲存引擎。在mysql...

mysql三種引擎 MySQL常見的三種儲存引擎

原文連線 簡單來講,儲存引擎就是指表的型別以及表在計算機上的儲存方式。資料庫 儲存引擎的概念是mysql的特色,oracle中沒有專門的儲存引擎的概念,oracle有oltp和olap模式的區分。不一樣的儲存引擎決定了mysql資料庫中的表能夠用不一樣的方式來儲存。咱們能夠根據資料的特色來選擇不一樣...