构造函数自动转换与explicit关键字

来源:互联网 发布:证券交易网络 编辑:程序博客网 时间:2024/05/22 09:41

在类中有一个整型的数据成员,程序中需要实现一个整数直接赋值为一个类对象,赋值结果是该类对象的被赋值成员值为赋值的整数。
但是在默认情况下是不能通过编译的,因为不允许类与整数进行复制运算。
如果在类中定义一个特殊的构造函数,这样在进行该类对象和整数赋值运算时将自动转换该构造函数。
即下图定义构造函数——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;”将会出现下图的错误提示
这里写图片描述

原创粉丝点击