一、、explicit
#pragma once
#include class explicit_test
explicit_test& operator =(const explicit_test& other)
};
不帶explicit 測試結果
explicit_test aa(5); //直接隱式轉換,可以傳乙個引數是因為該建構函式的第二個引數有預設值
aa = 34.3;
aa = 'a';
上面讓我們感覺到歧義,分不清是這個類是幹啥用的額,不知道為啥float,chat也可以正常呼叫ctor,可以肯定的是,這種不是轉換不是我們想要的。
我們在看看 帶有explicit 的結果:
explicit_test aa(5); //直接隱式轉換,可以傳乙個引數是因為該建構函式的第二個引數有預設值
aa = 34.3;
aa = 'a';
//在explicit_test建構函式加explicit 會報錯
//1>f:\owersource\c++_test\c++_test\c++_test.cpp(11) : error c2679 : 二進位制「 = 」 : 沒有找到接受「double」型別的右運算元的運算子(或沒有可接受的轉換)
//1> f:\owersource\c++_test\c++_test\explicit.h(14) : 可能是「explicit_test &explicit_test::operator =(const explicit_test &)」
//1> 嘗試匹配引數列表「(explicit_test, double)」時
//1>f:\owersource\c++_test\c++_test\c++_test.cpp(12) : error c2679 : 二進位制「 = 」 : 沒有找到接受「char」型別的右運算元的運算子(或沒有可接受的轉換)
//1> f:\owersource\c++_test\c++_test\explicit.h(14) : 可能是「explicit_test &explicit_test::operator =(const explicit_test &)」
//這才是我們想要的結果,我可以把有可能未知的邏輯錯誤控制編譯期。
//從上面看 explicit 是抑制隱式轉換的。除非是在你有意進行隱式轉換,否則最好cotr都加上explicit來控制隱式轉換,讓他轉換在我們可預期範圍。
結論:在你不是有意的情況下,都應該加explicit
C語言基礎知識整理 四
進行巨集字串連線,在巨集中把引數解釋為字串,不可以在語句中直接使用。在巨集定義中,printf s n s 會被解釋為printf s n s include include define trace s printf s n s s int main 輸出為a strhello 在第三次列印中,巨...
Hibernate基礎知識整理(四)
事務的邊界 開啟事務 transcation tx session.begintransaction 提交事務 tx.commit 回滾事務 tx.rollback hibernate的事務是通過呼叫jdbc來直接實現的,預設hibernate事務是不開啟的。通常事務的邊界控制是放在service層...
C 基礎知識整理
在c 98中,有63個關鍵字。不能遺漏標準名稱,任何不帶標準名稱來說關鍵字個數都是耍流氓 1.定義命名空間,需要用到namespace關鍵字,後面跟命名空間的名字,然後接 中即為命名空間的成員。2.命名空間的使用 namespace n int main using n b int main usi...