c 基礎知識整理(四)

2021-07-13 03:56:44 字數 1313 閱讀 5151

一、、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...