单、多参数构造函数的隐式类型转换

单、多参数构造函数的隐式类型转换

前言

​ 在C++中,构造函数不仅用于初始化对象的状态,还可以实现隐式类型转换。单参数和多参数构造函数的隐式类型转换为程序员提供了更大的灵活性和便利性。通过合理地利用这些特性,我们可以编写出更加优雅和易于维护的代码。


1. 单参数构造函数

​ 考虑一个表示距离的类Distance,我们可以通过单参数构造函数实现从整数到距离对象的隐式转换。这种转换使得代码更加简洁和直观。

class Distance
{
public:
	Distance(int meters = 0) :m_meters(meters){}

	void display() const
	{
		std::cout << "Distance: " << m_meters << " meters" << std::endl;
	}
private:
	int m_meters;
};
void test1()
{
	Distance d1 = 100;	// 隐式类型转换
    // 利用整形100创建一个临时Distance变量,再拷贝构造给d1对象 =》部分编译器优化合二为一
	d1.display();
}

在这里插入图片描述

这里看似是 “=” 赋值的过程,实际上是一种拷贝构造并非调用赋值运算符。

通过上面VS2022环境下实际运行可以观察确认 Distance d1 = 100; 语句创建了临时变量,调用了拷贝构造函数(由于编译器优化,省去了拷贝构造的过程)。

另外一种角度验证临时变量的产生:

首先我们来看一个编译阶段报错的案例:

void test1()
{
	Distance& d3 = 500;
	const Distance& d4 = 500;
}

报错信息:

在这里插入图片描述

在这里插入图片描述

为什么同为引用对象类型,被 const 修饰的 d4 引用对象就不会报错呢?因为临时变量具有常性!这里d3、d4都是对隐式类型转换生成的对象作引用,而该对象又是临时对象,所以未经 const 修饰的引用语句会报错。

这显然与 Distance d1 = 100; 会出现临时对象的结论相吻合。

2. 多参数构造函数

下面是一个带有多参数构造函数的示例,演示了如何在构造函数中执行隐式类型转换:

class Time
{
public:
	Time(int hour = 8, int minute = 0, int second = 0):m_hour(hour), m_minute(minute), m_second(second){}

	void print()const
	{
		printf("%2d:%2d:%2d\n", m_hour, m_minute, m_second);
	}
private:
	int m_hour;
	int m_minute;
	int m_second;
};
void test2()
{
	// C++11起支持多参数构造函数的隐式类型转换(大括号初始化)
	Time t = {9, 20, 0};
	t.print();
}

在这个示例中,我们使用了C++11中的初始化列表语法,将{9, 20, 0}传递给Time对象的构造函数。编译器会自动进行类型转换,将整数转换为Time对象。

运行结果:

在这里插入图片描述

3. explicit 关键字

当我们希望禁止编译器执行隐式类型转换,可以使用explicit关键字:

单参数构造函数:

class Distance
{
public:
	explicit Distance(int meters = 0) :m_meters(meters){}	// 注意这里添加了explicit关键字

private:
	int m_meters;
};
void test1()
{
	Distance d1 = 100;		// 隐式类型转换(此时编译报错)
	Distance d2 = Distance(100);	// 显式类型转换
}

在这里插入图片描述

多参数构造函数:

在这里插入图片描述

通过使用explicit关键字,可以明确指示编译器在这种情况下产生错误,从而帮助我们避免潜在的错误和歧义。


总结

​ 通过本文的介绍,我们深入了解了单参数和多参数构造函数的隐式类型转换技术。合理地利用这些特性可以使我们的代码更加简洁、清晰,并提高可读性。在编写C++代码时,我们应该根据具体的需求和场景,灵活运用这些技术,从而提高代码的质量和可维护性。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

螺蛳粉只吃炸蛋的走风

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值