explicit 的作用(如何避免編譯器進行隱式型別轉換)
阿新 • • 發佈:2022-03-29
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++面試