1. 程式人生 > 其它 >explicit 的作用(如何避免編譯器進行隱式型別轉換)

explicit 的作用(如何避免編譯器進行隱式型別轉換)

explicit 的作用(如何避免編譯器進行隱式型別轉換)

作用:用來宣告類建構函式是顯示呼叫的,而非隱式呼叫,可以阻止呼叫建構函式時進行隱式轉換。只可用於修飾單參建構函式,因為無參建構函式和多參建構函式本身就是顯示呼叫的,再加上 explicit 關鍵字也沒有什麼意義。

注意:從 C++11 開始,多參建構函式也可以使用 explicit 關鍵字修飾。

隱式轉換:

#include <iostream>
#include <cstring>
using namespace std;

class A
{
public:
    int var;
    A(int tmp)
    {
        var = tmp;
    }
};
int main()
{
    A ex = 10; // 發生了隱式轉換
    return 0;
}

上述程式碼中,A ex = 10; 在編譯時,進行了隱式轉換,將 10 轉換成 A 型別的物件,然後將該物件賦值給 ex,

(個人覺得文章這裡存在錯誤,當A ex=10進行編譯時,相當於A ex(10),呼叫建構函式,進行了隱式轉換,但是並不會建立匿名物件賦值給ex)

等同於如下操作:

為了避免隱式轉換,可用 explicit 關鍵字進行宣告:

#include <iostream>
#include <cstring>
using namespace std;

class A
{
public:
    int var;
    explicit A(int tmp)
    {
        var = tmp;
        cout << var << endl;
    }
};
int main()
{
    A ex(100);
    A ex1 = 10; // error: conversion from 'int' to non-scalar type 'A' requested
    return 0;
}

參考書籍:力扣C++面試