建構函式自動轉換與explicit關鍵字
阿新 • • 發佈:2019-01-27
在類中有一個整型的資料成員,程式中需要實現一個整數直接賦值為一個類物件,賦值結果是該類物件的被賦值成員值為賦值的整數。
但是在預設情況下是不能通過編譯的,因為不允許類與整數進行復制運算。
如果在類中定義一個特殊的建構函式,這樣在進行該類物件和整數賦值運算時將自動轉換該建構函式。
即下圖定義建構函式——CUser(int nData)
可以實現一個整數直接賦值為一個類物件的語句——CUser User = 2;
語句“CUser User = 2;”實際是呼叫了CUser(int nData)建構函式,它與“CUser User(2);”語句的作用相同。
#include<iostream>
#include<string>
using namespace std;
const int MAXLEN = 128;
class CUser {
private:
char m_Username[MAXLEN];
char m_Password[MAXLEN];
int m_nLevel;
public:
CUser() {
m_nLevel = 1;
strcpy(m_Username, "MR");
strcpy(m_Password, "KJ");
cout << "建構函式被呼叫!" << endl;
}
CUser(int nData) {
m_nLevel = nData;
cout << "複製物件!" << endl;
}
void GetData() {
cout << m_nLevel;
}
};
int main(int argc, char* argv[]) {
CUser User = 2;
cout << "m_nLevel=";
User.GetData();
cout << endl;
return 0;
}
當然在開發應用程式時,有時需禁止建構函式的自動轉換功能,因為這樣容易令人誤解,容易出現問題。
在建構函式前使用explicit關鍵字,可以阻止建構函式的自動轉換功能。
#include<iostream>
#include<string>
using namespace std;
const int MAXLEN = 128;
class CUser {
private:
char m_Username[MAXLEN];
char m_Password[MAXLEN];
int m_nLevel;
public:
CUser() {
m_nLevel = 1;
strcpy(m_Username, "MR");
strcpy(m_Password, "KJ");
cout << "建構函式被呼叫!" << endl;
}
explicit CUser(int nData) {
m_nLevel = nData;
cout << "複製物件!" << endl;
}
void GetData() {
cout << m_nLevel;
}
};
int main(int argc, char* argv[]) {
//CUser User = 2; 不能通過編譯。
CUser User(2);
cout << "m_nLevel=";
User.GetData();
cout << endl;
return 0;
}
此時,語句 “CUser User = 2;”將無法通過編譯,而語句“CUser User(2);”是完全合法的。
使用語句 “CUser User = 2;”將會出現下圖的錯誤提示