Qt中的隱式轉換和explicit作用

隱式轉換

c++中的數據類型轉換分爲隱式轉換和顯示轉換;

  • 顯示轉換即使用static_cast等方法進行轉換,相關內容請參考 **《C++數據類型轉換》**;
  • 隱式轉換則是編譯器完成的,如,bool和 int 之間的默認轉換;
  • 實際開發中,應儘量避免使用隱式轉換,代碼是給人看的,不是用來炫技的;

類構造中的隱式轉換

隱式轉換有時候很方便,但是有時候卻會產生不易察覺的錯誤。下面以類構造函數中的隱式轉換爲例:

//test.h
class Test
{
public:
	Test(int value){
        this->value = value;
    }
	int GetValue() const{
        return this->value;
    }
private:
	int value;
};
//main.cpp
void Function(const Test& test){
    cout<<test.GetValue();
}

void main(){
Test test(123);
Function(test);
}

  • 如上,代碼很簡單,Test在構造時需要傳入一個 int 型的參數;
  • Function()函數需要傳入一個 const 的 Test 對象作爲函數參數;

但是,若main()函數出現下面的代碼,則會如何?

void main(){
    Function(123);
}

事實是,這樣也會正常運行,其實不難理解,這就是利用了類構造的隱式轉換完成的。

  • Function() 方法在接收到參數123後,使用Test的構造函數構造了一個臨時的Test對象;
  • 因爲對象是臨時且無法更改的,所以,這裏的函數參數需要 const,拿掉則編譯錯誤;

這裏的代碼看起來非常巧妙,但是卻是真正意義上的“奇技淫巧”,老老實實構造一個對象,不好嗎?

那麼,這裏使用隱式轉換有什麼缺點呢?

最大的問題就是維護,這裏示例的代碼量少,尚且覺得巧妙,對於中型及其以上的的工程來說,這就是維護的噩夢。

使用explicit來禁用構造函數的隱式轉換

上例中的構造函數中的隱式轉換可以使用 explicit 來禁用

//test.h
class Test
{
public:
	explicit Test(int value){
        this->value = value;
    }
	int GetValue() const{
        return this->value;
    }
private:
	int value;
};
//main.cpp
void Function(const Test& test){
    cout<<test.GetValue();
}

void main(){
Function(123); //編譯到這裏就會報錯
}

在實際開發中,應儘量避免使用隱式轉換,越是看似巧妙,越要避免。

原文:https://www.cnblogs.com/sherlock-lin/articles/11708244.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章