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关键字, 内置类型就不可以调用构造函数转换为自定义类型(临时对象)了
浙公网安备 33010602011771号