c++ explicit构造函数

本文探讨了C++中隐式转换的概念,特别是单实参构造函数如何自动转换实参类型。通过示例说明了这种转换可能导致的错误,并介绍了如何使用explicit关键字来避免非预期的转换。

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

当类被实例化时,编译器会执行隐式转换的单实参构造函数,该构造函数接受的实参类型被转换成该构造函数所属类的对象。这种转换是自动的,不需要程序员进行强制类型转换。有些情况下,隐式转换是不必要的而且容易出错。

eg:

class Array{
   Array(int a=10); //单实参构造函数,会隐身转换实参类型
private:
int size;
int *ptr;
};

Array::Array(int a){
 
        size = (s>0)?s:10;//验证数组大小
    ptr = new int[size];
    for(int i=0;i < size ; i++){
        ptr[i] = 0;
    }
}

int main(){

Array a1(7);
output(a1);
output(3);//这里就会把3转换成一个数组对象,并且初始化为3个值
}

void output(const Array &arr){
  cout<<arr.getSize();
}

为了防止意外的将单实参构造函数用做转换构造函数 C++提供了关键字explicit,禁止通过转换构造函数进行隐转换。声明为explicit的构造函数不能用于隐式转换

eg:

class Array{

explicit Array(int a =10);

};

值得注意的是关键字explicit只能用于数据成员或单个实参构造函数中

转载于:https://www.cnblogs.com/ShowJoy/p/3621635.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值