3. 參考資料
對於 operator 運算子,除了常用的operator overloading
(操作符過載)之外,還有operator casting
(操作隱式轉換)的用法。
c++可以通過operator實現過載操作符,格式如下:return_type operator operand (parameter list)
,比如過載+,比如下面這個例子:
template
<
typename t>
class
aprivate
: t m_;
};
又比如stl中的函式物件/stl仿函式過載operator(),如下面例子:
template
<
typename t>
struct a
};
其他的操作符過載不再贅述。
隱式型別轉換又可分為建構函式的隱式型別轉換(附含對explicit關鍵字的作用和介紹)和operator運算元的隱式型別轉換。
《c++ primer》中有這樣一句話:可以用單個實參來呼叫的建構函式定義了從形參型別到該類型別的乙個轉換。這句話用下面一段**表示為:
classa.
....
a a;
b b;
a.func
(b);
//func函式本應該接受a型別的實參,但是由於特殊建構函式的存在,
//所以b型別的引數b借助這個特殊的建構函式轉化為a型別物件,完成轉換。
//所以這條語句是正確的
從上述**段可以看出來,單個實參呼叫的建構函式定義了類型別到其他型別的轉換,並且這種轉換是隱式發生的,這裡有幾個關鍵字:單個實參、建構函式、隱式轉換。
隱式轉換的過程發生了什麼?物件a並沒有引數型別為b的成員函式,但是它有乙個單一b類形參的建構函式,所以編譯時是不會報錯的。對於a.func(b)這條語句,編譯器會用這個特殊的建構函式,生成乙個臨時物件,然後以臨時物件呼叫正規的 func(a a)函式,func(a a)函式結束,臨時物件被登出。
這種轉換到底好不好?因類而異,因使用的語境而異!你總有需要它的時候,也有不許要它的時候,語言預設是有這項功能的。但是,也可以通過關鍵字explicit
阻止這種我們看不到的「優化」!explicit關鍵字只能用在建構函式身上,並且只需在函式的宣告時標註即可,在類函式的定義時不需標註該關鍵字。
上例中如果阻止借助建構函式a(b b)發生隱式型別轉換,可對該建構函式的宣告做如下處理:
explicit a (b b)
;
此時語句a.func(b)就要出錯了,但是我們可以顯式地使用建構函式,以上例為例,可以使用語句:
a.
func(a
(b))
;
完成相同的功能,此時不涉及隱式轉換。a(b)生成臨時a型別物件,並且傳遞給函式func呼叫,一切循規蹈矩,沒有任何隱式的、程式設計師看不見的步驟。顯示的建構函式中止了隱式地使用建構函式,任何建構函式都可以顯式地建立臨時物件,這是它的權利,被explicit修飾的建構函式也不例外。
對於隱式型別轉換:通常,除非有明顯理由要定義隱式轉換(如資源管理型別需要向apis提供底層資源訪問,見條款16:在資源管理類中提供對原始資源的訪問中為客戶提供方便),否則,單形參建構函式應該為explicit。將建構函式設定為explicit可以避免錯誤,並且當轉換有用時,使用者可以顯式地構造物件。
c++可以通過operator實現過載隱式轉換,格式如下:operator cast_to_type_t ()
,其中t是乙個型別,比如下面這個例子:
class
aoperator
const b*()
operator b&()
private
: b* b_;};
a a;
//當if(a),編譯時,它轉換成if(a.operator b*()),
//其實也就是相當於 if(a.b_)
還有一例是《effective c++》中條款15:在資源管理類中提供對原始資源的訪問p71:
class
font..
.};
例子之後,是操作隱式轉換的語法:
classa;
// 在需要情況下, a物件可以轉成int型別物件。 ..
....
int num;
} c;
intmain()
建構函式的隱式型別轉換部分,使用乙個其他的型別構造當前類的臨時物件,這種轉換必須有建構函式的支援;operator 運算元的隱式型別轉換,使用當前物件去生成另乙個型別的物件(正好與建構函式型相反),這種轉換必須有 operator 運算元的支援。
隱式的型別轉換有利有弊,類的設計者就起決定性作用了,如果你不想讓建構函式發生隱式的型別轉換,請在建構函式前加 explicit 關鍵字;同時,operator 運算元宣告的隱式型別轉換也可以通過一些相應的返回值函式替代(即顯示型別轉換,安全性更高),對客戶而言使用起來遮蔽性更好更方便。
《c++ primer》
《effective c++》
csdn:c++ 中operator用法:隱式型別轉換
:c++ 中operator用法:隱式型別轉換
隱式類型別轉換
c mysql型別轉換 MYSQL隱式型別轉換
前言 今天看了下團隊發的xctf高校戰疫的wp,這裡先喊一句。楊大樹師傅太強了orz 幾乎沒幫啥忙,簡單的題目都被師傅們秒了,我進度太慢,跟不上,後面難的題目基本動不了。再喊一遍,星盟的師傅tql。再接再厲,希望下次能上師傅們,幫到師傅們解題。mysql弱型別轉換 這裡本地搭建一下環境 用的老的語句...
隱式型別轉換
c 本身對內建型別定義了各種隱式的型別轉換,這種內建的型別轉換在可能導致精度 丟失的情況下編譯器會發出警告,但當我們定義自己的型別時,提供各種隱式轉換往往 是弊大於利的 至少在我編寫過的 中很少用到 隱式的型別轉換可分為 其它型別到本型別,本型別到其它型別兩種.第一種通過單變數 可呼叫之建構函式進行...
C 隱式型別
隱式型別 1 源起 在隱式型別出現之前,我們在宣告乙個變數的時候,總是要為乙個變數指定他的型別 甚至在foreach乙個集合的時候,也要為遍歷的集合的元素,指定變數的型別 隱式型別的出現,程式設計師就不用再做這個工作了。2 使用方法 來看下面的 var a 1 int a 1 var b 123 s...