警惕C++隐式转换(More Effectiv C++_5(运算符))

C++的类型转换,对于显示类型,C++定义了四种新的类型类型转换,即static_cast、dynamic_cast、const_cast、reinterpret_cast;当然C++也继承了C语言的特性,也可以用C中转换格式,即小括号;
对于隐式转换,C++允许编译器在不同类型之间执行转换,它继承了C语言的一些特性,允许默默的将char转换成int、short转换成double等等;
你对这些转换无法改变,它们是语言提供的。但是,对于我们自己定义的类时,常常存在一些隐式转换,这些使我们能够控制的;即单变量构造和隐式类型操作符。下面我们来谈谈这两种情况


一、单自变量构造函数
所谓单自变量构造函数是指能以单一自变量成功调用的构造,如此的构造可能声明单一的参数,也可能声明拥有多个参数,并且除了第一个参数之外都有默认值。

class A{
public:
     A(int x,int y=10){};
private:
    int b;
    int c;
};
void fun(A x){
    cout<<"SUCCESS"<<endl;
}

int main(){
    A obj(10);
    fun(obj);
    int obj2=10;
    fun(obj2);
    return 0;
}

对于上面的代码,能正确编译运行,fun(obj2)为什么没有错了?
fun本应该接收的参数类型是A,现在传递的是int参数,确能通过编译?
原因是C++可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换,即使用一个int类型对象作为实参传给fun函数,编译器使用接收一个int的A的构造函数从obj2生成一个新的A对象,新生成的(临时的)A的对象被传递给fun函数。
注意:对于可以发生隐式转换的构造函数,其参数可能是单一参数(有无默认均可),或者是拥有多个参数,并且除了第一个参数外均有默认值(第一个实参也可以有默认值);

A(int x,int y){};//错误,不能将int转换成A类型
A(int x,int y=10){};//正确,可以发生隐式转换
A(int x=10,int y=10){};//正确,可以发生隐式转换
A(int x=10){};//正确
A(int x){};//正确

但是,我们有时不需要隐式转换,且最好不要提供隐式转换函数,除非你确定需要它们;那么对与这种单变量构造的形式,我们只要将构造函数声明为explicit,那么编译器就不能因隐式类型的转换需要去调用它们了,不过显式类型转换仍然允许;

explicit A(int x=10){};//错误,不能通过隐式转换
fun(static_cast<A>(obj2));//正确,C++新式强制转换
fun((A)(obj2));//正确,C旧式转换

注:explicit关键字只能用于类内部的构造函数声明上。在类的定义体外部所做的定义上不再重复它;


二、隐式类型操作符operator
operator除了重载运算符以外,还有一个作用,就是隐式类型转换;操作格式如下:

T1::operator T2()const;//T1是类型名,T2是要转换成的类型

需要注意几点:

 1. 你不能为此函数指定返回值类型,因为返回值类型已经体现在函数名称上;
 2. 需要一个return语句,来返回T2类型;
 3. 常与const连用
 4. 最好不要有隐式转换

参考:More Effective C++中文版(侯捷译)

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值