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;
}

/* 《程式語言教學誌》的範例程式
   https://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;
}

/* 《程式語言教學誌》的範例程式
   https://kaiching.org/
   檔名:u0903_2.cpp
   功能:示範 C++ 的類別
   作者:張凱慶*/

這就是在建構函數的識別字前加上關鍵字 explicit

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.
$

上一頁 9.2 - 初值串列
回 C++ 速查手冊首頁
下一頁 9.4 - private 成員