Constructor một đối số (hoặc các đối số sau có default) tự động trở thành conversion constructor, cho phép ép kiểu ngầm. explicit ngăn chặn điều này.
Không dùng explicit
class Point { double x,y;
public: Point(double a=0, double b=0):x(a),y(b) {}
bool operator==(Point p) { return x==p.x && y==p.y; }
};
Point p(5,0);
if (p == 5) cout << "Same"; // OK: 5 → Point(5,0) ngầm
Dùng explicit
class Point {
explicit Point(double a=0, double b=0):x(a),y(b) {}
// ...
};
if (p == 5) // LỖI: no match for operator==(Point, int)
if (p == (Point)5) // OK: ép kiểu tường minh
Lưu ý: C++11 cho phép explicit cho conversion operators.