explicit关键字只能用于修饰类构的造函数,表明该构造函数是显式的不能用于隐式转换和复制初始化。

  1. 该关键字只能用来修饰类内部的构造函数;
  2. 禁止隐式调用拷贝构造函数 ;
  3. 禁止类对象之间的隐式转换;
  4. 一般只用于修饰单参构造函数,因为无参构造函数和多参构造函数本身就是显式调用的。

在C++类的实例化过程中,存在一种隐式转换

#include <iostream>
using namespace std;

class Point {
public:
    int x, y;
    Point(int x = 0, int y = 0) : x(x), y(y) {}
};

void displayPoint(const Point& p)
{
    cout << "(" << p.x << "," << p.y << ")" << endl;
}

int main()
{
    // 显式调用
    Point p0(1);
    Point p1(1, 2);
    Point p2 = Point(1, 2);
    displayPoint(Point(1, 2));

    // 隐式转换
    Point p3 = 1;
    Point p4 = (1, 2);
    displayPoint(1);
    displayPoint((1, 2));
    displayPoint({1, 2});
}

默认情况下,上面代码可以编译通过 加上explicit后,禁止隐式转换,编译无法通过

class Point {
public:
    int x, y;
    explicit Point(int x = 0, int y = 0) : x(x), y(y) {}
};