C++ 类和对象:explicit关键字

1. explicit关键字

explicit是C++引入的一个关键字, 作用是禁止隐式类型转换, 下面一步一步来看

#include <iostream>
using namespace std;

class A
{
public:
	A(int val)
		:_val(val)
	{
		cout << "construct" << endl;
	}
	A(const A& ref)
		:_val(ref._val)
	{
		cout << "copy" << endl;
	}
private:
	int _val;
};

int main()
{
	A a2 = 2;
}

如图, 打印了一个construct, 表明A a2 = 2, 这段代码执行调用了一次构造函数, 将内置类型2的值赋值给对象a2的成员

这是如何做到的? 

实际上, 内置类型2会去调用构造生成一个临时的自定义类型对象, 然后调用拷贝构造初始化对象a2

既然会调用拷贝构造, 那么为什么上图没有调用拷贝构造, 打印copy字符

原因是, 现代编译器做了优化, 将构造 + 拷贝构造转换为直接构造

下面证明, 这个行为确实是构造 + 拷贝构造

如图, 打印出了construct, 这可以证明, 内置类型2调用了构造生成了临时对象, ref是这个临时对象的引用

因为, 使用对象去初始化另一个对象, 一定是拷贝构造实现的

所以, 肯定是临时对象作为拷贝构造的参数初始化了a2

 

在C++中引入了explicit关键字, 来禁止类型之间的隐式转换, 比如用来禁止上例中的内置调用构造转自定义类型(临时对象)

如上图, 在构造函数前加explicit关键字,  内置类型就不可以调用构造函数转换为自定义类型(临时对象)了

posted @ 2023-05-12 15:12  许木101  阅读(33)  评论(0)    收藏  举报