c++ 赋值构造 explicit

本文探讨了C++中拷贝构造函数的调用时机,特别是在对象声明时使用等号赋值的情况,并分析了explicit关键字如何防止隐式类型转换,避免不必要的构造函数调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 对象在申明时调用等号赋值,实际使用的是拷贝构造 
public:
    CTmp(int n) :m_Num(n){
        cout << "CTmp(int n) " << m_Num << endl;
    }
    CTmp(CTmp& a){
        if(this != &a){
            m_Num = a.m_Num;
        }
        cout << "CTmp(CTmp& a) " << m_Num << endl;
    }
    const CTmp& operator = ( CTmp& a)
    {
        if(this != &a){
            m_Num = a.m_Num;
        }
        cout << "CTmp oprator=& " << m_Num << endl;
        return *this;
    }
    void show(){
        cout << "m_Num " << m_Num << endl;
    }

private:
    int m_Num;
};
int main()
{
    CTmp cT1(4);
    CTmp cT2 = cT1;
    cT2.show();
    return 0;
}

输出:

CTmp(int n) 4
CTmp(CTmp& a) 4
m_Num 4

可以看到,CTmp cT2 = cT1;走的是拷贝构造,非赋值;

 

  • explicit可强制显式调用构造
class CTmp{
public:
    CTmp(int n) :m_Num(n){
        cout << "CTmp(int n) " << m_Num << endl;
    }
    friend void ShowTmp(const CTmp& cx);
private:
    int m_Num;
};

void ShowTmp(const CTmp& a){
    cout << "m_Num " << a.m_Num << endl;
}
int main()
{
    CTmp cT1(4);
    ShowTmp(cT1);
    ShowTmp(5);
    ShowTmp(6);
    return 0;
}

输出:

CTmp(int n) 4
m_Num 4
CTmp(int n) 5
m_Num 5
CTmp(int n) 6
m_Num 6

ShowTmp(5);ShowTmp(6);隐式的构造了 CTmp(5),CTmp(6),使得ShowTmp(X);可以编译运行;

class CTmp{
public:
    explicit CTmp(int n) :m_Num(n){
        cout << "CTmp(int n) " << m_Num << endl;
    }
    friend void ShowTmp(const CTmp& cx);
private:
    int m_Num;
};

void ShowTmp(const CTmp& a){
    cout << "m_Num " << a.m_Num << endl;
}
int main()
{
    CTmp cT1(4);
    ShowTmp(cT1);
    ShowTmp(5);
    ShowTmp(6);
    return 0;
}

加上explicit后,编译期就会报错:

 error C2664: 'void ShowTmp(const CTmp &)' : cannot convert argument 1 from 'int' to 'const CTmp &'

注意,explicit在调用时填入单参数的构造函数有意义,无参数构造函数和多参数的构造函数总是要显式调用;

explicit反向对应implicit(隐式);implicit是默认有的;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值