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. |
$ |
相關教學影片