C++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,explicit构造函数是用来防止隐式转换的。
隐式转换:
如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。
如下面所示:
1 | class A |
在上面的代码中编译器自动将整型转换为A类对象,实际上等同于下面的操作:
1 | A a(10); |
上面的所有的操作即是所谓的"隐式转换"。
输出结果:
[INFO]: m_data = 10
如果上述class A的构造函数声明为explicit的,则不能通过隐式转换来调用这个构造函数:
1 | explicit A(int data) : m_data(data) |
则上述代码无法通过编译:
1 | //A a = 10;//error: conversion from ‘int’ to non-scalar type ‘A’ requested A a = 10; |
可通过显式调用:
1 | A a(10); //显式调用 |
普通构造函数能够被隐式调用,而explicit构造函数只能被显式调用。