Можем ли мы перегружать методы только по ключевому слову explicit
Нет.
Зачем нам нужен перегруженный явный конструктор?
Чтобы избежать неявных преобразований.
Допустим, Queue
был определен как:
class Queue {
public:
// No constructor with a size_t.
Queue(int capacity) {}
...
};
При этом int
будет неявно преобразован в Queue
при необходимости.
void bar(Queue const& q) { ... }
bar(10); // This would be valid without the explicit keyword.
// 10 will be implicitly converted to Queue(10).
Иногда такие неявные преобразования приводят к сложному пониманию и поддержанию кода.Чтобы избежать таких неявных преобразований, используется квалификатор explicit
.
С установленным квалификатором explicit
вам потребуется использовать
bar(Queue(10));
, что намного прощепонять.
Почему у него есть конструктор с аргументом size_t
, а затем конструктор explicit
с аргументом int
,
Не знаюувидеть любую причину, по которой вам понадобятся две перегрузки - explicit
или нет.Если в книге не объясняется, зачем они нужны, мы можем объяснить это только отсутствием ясности со стороны автора.