
C++ 速查手冊
9.3 - explicit 指示詞
編譯器會自動對建構函數的參數進行隱性型態轉換 (implicit type conversion) ,例如
#include <iostream>
class Demo {
public:
    int a;
    
    Demo(int pa) {
        a = pa;
    }
    
    void do_something() {
        std::cout << a << std::endl;
    }
};
int main() {
    Demo d = 3;
    d.do_something();
    
    return 0;
}
/* 《程式語言教學誌》的範例程式
   http://kaiching.org/
   檔名:u0903_1.cpp
   功能:示範 C++ 的類別
   作者:張凱慶*/這裡直接將整數 3 指派給 Demo 型態的變數 d
Demo d = 3;編譯執行並不會出錯
| $ g++ u0903_1.cpp | 
| $ ./a.out | 
| 3 | 
| $ | 
為了避免這種自動隱性型態轉換,可將建構函數宣告為 explicit ,例如
#include <iostream>
  
class Demo2 {
public:
    int a;
    
    explicit Demo2(int pa) {
        a = pa;
    }
    
    void do_something() {
        std::cout << a << std::endl;
    }
};
int main() {
    Demo2 d = 3;
    d.do_something();
    
    return 0;
}
/* 《程式語言教學誌》的範例程式
   http://kaiching.org/
   檔名:u0903_2.cpp
   功能:示範 C++ 的類別
   作者:張凱慶*/explicit Demo2(int pa) {編譯時會發生錯誤訊息,如下
| $ g++ u0903_2.cpp | 
| u0903_2.cpp:17:11: error: no viable conversion from 'int' to 'Demo' | 
| Demo d = 3; | 
| ^ ~ | 
| u0903_2.cpp:3:7: note: candidate constructor (the implicit copy constructor) not | 
| viable: no known conversion from 'int' to 'const Demo &' for 1st argument | 
| class Demo { | 
| ^ | 
| 1 error generated. | 
| $ | 
相關教學影片
