c++隐式类型转换

什么是隐式转换:

c++中的基本类型并非完全对立,部分类型之间是可以进行隐式转换的,所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为,很多时候用户都不知道具体进行了哪些转换

为什么要进行隐式转换:

隐式转换可以让程序员在两个不同类型的数据直接进行操作,而不用自行转换类型,隐式转换给程序开发者带来了不小的便捷

隐式转换的原则:

  • 基本数据类型的转换以取值范围作为转换基础(保证精度不丢失)
  • 隐式转换发生在从小 ——> 大的转换中。如char转换为int,int转换成double

隐式转换发生的条件:

  • 混合类型的算术运算表达式中。例如:
int a = 3;
double b = 4.5;
double c=a + b; 
// a将会被自动转换为double类型,转换的结果和b进行加法操作
  • 不同类型的赋值操作
int a=‘a’;//字符a转换成对应ASCII码的整数赋值给a
double b=1;//将1转换成1.0赋值给b
  • 函数参数传值
void func(double a);
func(1); // 1被隐式的转换为double类型1.0
  • 函数返回值
double add(int a, int b)
{    
	return a + b;
} //运算的结果会被隐式的转换为double类型返回

隐式转换的风险:一般存在于自定义的类构造函数中

按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象。

例子:

class A
{
public:
 	A(int i = 5)
	 {
 	 m_a = i;
 	}
 	void printm()
 	{	
  	cout << m_a << endl;
 	}
private:
 	int m_a;
};
int main()
{
 A s;//此时调用构造函数,s.m_a应该等于5
 s.printm();
 
 s = 10;//我们没有重载'='运算符,但是去可以把内置的int类型赋值给了对象A.
 s.printm();
 
 //实际上,10被隐式转换成了下面的形式,所以才能这样.
 //s = A temp(10);
 system("pause");
 return 0;
}

运行结果:
在这里插入图片描述

禁止类构造函数的隐式转换:

C++中提供了explicit关键字,在构造函数声明的时候加上explicit关键字,能够禁止隐式转换。
在上述代码的构造函数上加上explicit,则会发生:

在这里插入图片描述
s=10的操作变成非法的了。这样就可以有效的防止隐式转换的发生,从而能够对程序进行精确控制,达到提高品质的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈乐乐happy

觉得对你有用的话可以打赏打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值