1. 程式人生 > >建構函式自動轉換與explicit關鍵字

建構函式自動轉換與explicit關鍵字

在類中有一個整型的資料成員,程式中需要實現一個整數直接賦值為一個類物件,賦值結果是該類物件的被賦值成員值為賦值的整數。
但是在預設情況下是不能通過編譯的,因為不允許類與整數進行復制運算。
如果在類中定義一個特殊的建構函式,這樣在進行該類物件和整數賦值運算時將自動轉換該建構函式。
即下圖定義建構函式——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;”將會出現下圖的錯誤提示
這裡寫圖片描述