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

9 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值