看到《深度探索
c++物件模型》的第
21頁,在其談到
c struct
在c++
中的乙個合理用途時,看到了
c++中使用者定義的轉換的運用。因而回頭將《
c++ primer
》中關於使用者定義的轉換的一些細節溫習了一下。
(1)
使用者定義的轉換的必要性:
我們希望能夠在
**allint
物件和其他
**allint
物件或者內建算術型別的物件之間進行加減操作,我們要通過提供6個
**allint
操作符函式來實現對這些操作的支援:
class
**allint
...operator+(
const
**allint &);
operator-(
const
**allint &);
//...
private
:int
value;
} ;
兩個成員操作符允許我們加減兩個
**allint
物件。友元全域性操作符允許我們在
**allint
物件和內建算術型別的物件之間進行加減操作。之所以只需要
6個操作符,是因為任何內建算術型別都可以被轉換為與
int型引數相匹配。
如果我們還想支援按位操作符、邏輯操作符、關係操作符和復合賦值操作符,則要求的操作符的數目就變得非常可怕了。我們更希望的,不是提供所有的過載操作符,而是一種將
**allint
類物件自動轉換成
int
型物件的方式。
c++
提供了一種機制,通過它,每個類都可以定義一組「可被應用在該型別物件上的轉換」。對於
**allint
,我們定義了乙個從
**allint
物件到int
型的轉換。
class
**allint
...//
轉換操作符
//**allint ==> int
operator
int()
...//
沒有提供過載操作符
private
:int
value;
} ;
(2)
需要注意的地方:
(a)
轉換函式必須是成員函式,它的宣告不能指定返回型別和參數列。
operator
int( **allint
&);
//錯誤: 不是成員
class
**allint
... ;
(b)
顯式的型別轉換會導致呼叫轉換函式。(須注意在必要的時候將轉換型別設定為
const
,只允許對被轉換的類物件進行唯讀訪問)
#include
"token.h
"token tok(
"function",
78);
//函式型的表示法: 呼叫 token::operator **allint()
**allint tokval
=**allint( tok );
//static_cast: 呼叫 token::operator tname()
char
*tokname
=static_cast
<
char
*>
( tok );
(c)
如果轉換的目標(本例中的
double
)與轉換函式的型別(本例中的
int型別)不完全匹配,但目標型別可以通過標準轉換序列到達,則仍可呼叫轉換函式。
extern
void
calc(
double
);token tok(
"constant",
44);
//呼叫 tok.operator int() 嗎? 是的
//int --> double 通過標準轉換
calc( tok );
(d)
使用建構函式作為轉換函式。
extern
void
func( number );
**allint si(
87);
...
當然,可通過在類的建構函式前設定
explicit
,以禁止將其用來執行隱式轉換。
C 使用者定義型別轉換
c 使用者定義型別轉換 c 提供隱式轉換和顯式轉換 宣告隱式轉換的語法如下.注 所有使用者定義轉換必須使用public和static修飾符 public static implicit operator targettype sourcetype identifier targettype 目標型別...
遊戲中使用者資料定義
如有欠缺後續補充 分類資料指標資料定義統計粒度統計型別單位備註 新使用者註冊使用者 統計日首次登陸遊戲的使用者數日產品 賬號新增角色數 統計日建立的角色數量 日產品 伺服器 角色包含同賬號建立的多個角色 n日留存 率 註冊使用者在後續n天內繼續登入遊戲的使用者。如11月1日註冊使用者的3日留存 11...
CSS 中使用者自定義字型 font face
font face 允許網頁中使用自定義的字型,這些自定義的字型被放置在伺服器上,從而讓網頁擺脫對訪問者計算機上字型環境的依賴。簡單的說,有了 font face,只需將字型上傳到伺服器端,無論訪問者計算機上是否安裝該字型,網頁都能夠正確的顯示。font face 的語法規則如下,font face...